XDTO 1С — механизм платформы 1С:Предприятие 8.3, который описывает данные типами по модели XML-схемы и сам переводит объекты в XML и обратно. Вместо ручной записи каждого тега через ЗаписьXML вы создаёте объект нужного типа, заполняете свойства и отдаёте его фабрике: она проверит структуру, расставит пространства имён и запишет документ. На XDTO построены SOAP-веб-сервисы, формат обмена EnterpriseData и выгрузка объектов через СериализаторXDTO.
XDTO расшифровывается как XML Data Transfer Objects. У каждого уровня модели есть объект встроенного языка:
| Уровень | Объект | Назначение |
|---|---|---|
| Фабрика | ФабрикаXDTO | хранит пакеты, создаёт объекты, читает и пишет XML |
| Пакет | ПакетXDTO | типы одного пространства имён (URI), аналог XSD-схемы |
| Тип значения | ТипЗначенияXDTO | простой тип и его ограничения (фасеты) |
| Тип объекта | ТипОбъектаXDTO | составной тип со свойствами |
| Свойство | СвойствоXDTO | имя, тип, границы, форма: элемент, атрибут или текст |
| Экземпляры | ЗначениеXDTO, ОбъектXDTO | значение простого типа и объект составного |
| Список | СписокXDTO | значение свойства с верхней границей больше единицы |
Глобальная ФабрикаXDTO уже содержит пакеты конфигурации и платформы, включая типы XML-схемы вроде xs:string и xs:decimal. Тип задаётся парой «пространство имён + имя», в текстах ошибок — {URI}Имя.
Где встречается XDTO:
ФабрикаXDTO.СериализаторXDTO пишет справочники, документы и ссылки; на нём же строят обмен по планам обмена между одинаковыми конфигурациями.Выбор транспорта для обмена разобран в обзоре способов обмена данными. Объекты XDTO доступны на сервере, в толстом клиенте и во внешнем соединении, а в тонком и веб-клиенте их нет, поэтому весь код ниже серверный: общий модуль с флажком «Сервер» или процедуры &НаСервере.
Пакет — объект метаданных в ветке «Общие → XDTO-пакеты». Создать его можно двумя способами:
http://компания/xdto/тема/версия, добавьте типы значений и типы объектов, а типам объектов — свойства с типом, границами и формой. Свойство на уровне самого пакета — корневой элемент документа, по нему фабрика узнаёт тип при чтении.Примеры статьи используют условный пакет ЗаказыКлиентов с пространством имён http://1c-only.ru/xdto/orders/1.0:
| Тип | Вид | Свойства |
|---|---|---|
| ИНН | тип значения | на основе xs:string, длина 10–12 символов |
| Контрагент | тип объекта | Наименование, ИНН, КПП (0..1) |
| СтрокаЗаказа | тип объекта | Артикул, Количество, Цена, Сумма (xs:decimal) |
| ЗаказКлиента | тип объекта | атрибут Версия (0..1); элементы Номер, Дата (xs:dateTime), Клиент, Позиция (1..-1), Комментарий (0..1) |
Свойство пакета Заказ типа ЗаказКлиента — корневой элемент. Имена типа и элемента различаются нарочно: объект создают по имени типа, а записывают под именем элемента. Схему можно импортировать и сразу запускать код:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://1c-only.ru/xdto/orders/1.0"
targetNamespace="http://1c-only.ru/xdto/orders/1.0"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="ИНН">
<xs:restriction base="xs:string">
<xs:minLength value="10"/>
<xs:maxLength value="12"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Контрагент">
<xs:sequence>
<xs:element name="Наименование" type="xs:string"/>
<xs:element name="ИНН" type="tns:ИНН"/>
<xs:element name="КПП" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="СтрокаЗаказа">
<xs:sequence>
<xs:element name="Артикул" type="xs:string"/>
<xs:element name="Количество" type="xs:decimal"/>
<xs:element name="Цена" type="xs:decimal"/>
<xs:element name="Сумма" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ЗаказКлиента">
<xs:sequence>
<xs:element name="Номер" type="xs:string"/>
<xs:element name="Дата" type="xs:dateTime"/>
<xs:element name="Клиент" type="tns:Контрагент"/>
<xs:element name="Позиция" type="tns:СтрокаЗаказа" maxOccurs="unbounded"/>
<xs:element name="Комментарий" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="Версия" type="xs:string"/>
</xs:complexType>
<xs:element name="Заказ" type="tns:ЗаказКлиента"/>
</xs:schema>Документ по этой схеме:
<?xml version="1.0" encoding="UTF-8"?>
<Заказ xmlns="http://1c-only.ru/xdto/orders/1.0" Версия="1.0">
<Номер>А-125</Номер>
<Дата>2026-10-02T10:30:00</Дата>
<Клиент>
<Наименование>ООО Ромашка</Наименование>
<ИНН>7700000000</ИНН>
</Клиент>
<Позиция>
<Артикул>SKU-001</Артикул>
<Количество>2</Количество>
<Цена>1500</Цена>
<Сумма>3000</Сумма>
</Позиция>
</Заказ>При записи платформа может добавить объявления xmlns:xs, xmlns:xsi и свои префиксы — смысл документа от этого не меняется.
// Общий модуль ОбменЗаказамиXDTO: флажок «Сервер», остальные сняты.
// Пакет XDTO ЗаказыКлиентов, пространство имен http://1c-only.ru/xdto/orders/1.0.
Функция ПространствоИмен() Экспорт
Возврат "http://1c-only.ru/xdto/orders/1.0";
КонецФункции
Функция ТипПакета(ИмяТипа) Экспорт
ТипXDTO = ФабрикаXDTO.Тип(ПространствоИмен(), ИмяТипа);
Если ТипXDTO = Неопределено Тогда
ВызватьИсключение СтрШаблон("Тип XDTO {%1}%2 не найден", ПространствоИмен(), ИмяТипа);
КонецЕсли;
Возврат ТипXDTO;
КонецФункции
// Позиции - таблица значений с колонками Артикул, Количество, Цена.
Функция НовыйЗаказXDTO(НомерЗаказа, ДатаЗаказа, НаименованиеКлиента, ИННКлиента, Позиции) Экспорт
Заказ = ФабрикаXDTO.Создать(ТипПакета("ЗаказКлиента"));
Заказ.Версия = "1.0"; // свойство с формой "Атрибут"
Заказ.Номер = НомерЗаказа;
Заказ.Дата = ДатаЗаказа;
Клиент = ФабрикаXDTO.Создать(ТипПакета("Контрагент"));
Клиент.Наименование = НаименованиеКлиента;
Клиент.ИНН = ИННКлиента; // фасеты типа ИНН проверяются уже здесь
Заказ.Клиент = Клиент;
ТипСтроки = ТипПакета("СтрокаЗаказа");
Для Каждого СтрокаТаблицы Из Позиции Цикл
Позиция = ФабрикаXDTO.Создать(ТипСтроки);
Позиция.Артикул = СтрокаТаблицы.Артикул;
Позиция.Количество = СтрокаТаблицы.Количество;
Позиция.Цена = СтрокаТаблицы.Цена;
Позиция.Сумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
Заказ.Позиция.Добавить(Позиция); // верхняя граница -1: значение свойства - СписокXDTO
КонецЦикла;
Возврат Заказ;
КонецФункцииФабрикаXDTO.Тип() при опечатке в URI или имени возвращает Неопределено, и ошибка всплывает позже, на Создать(). Поэтому ТипПакета() проверяет результат сразу.Создать() возвращает пустой ОбъектXDTO. Свойства заполняются через точку, вложенный объект создаётся отдельно и присваивается целиком.xs:decimal и xs:dateTime автоматически. Фасеты проверяются при присваивании: ИНН из пяти символов остановит код на этой строке.maxOccurs="unbounded") — это СписокXDTO с методом Добавить().// Общий модуль ОбменЗаказамиXDTO (продолжение).
Процедура ПроверитьОбъектXDTO(ОбъектXDTO) Экспорт
Попытка
ОбъектXDTO.Проверить();
Исключение
ВызватьИсключение СтрШаблон("Объект типа %1 не соответствует пакету:%2%3",
ОбъектXDTO.Тип().Имя, Символы.ПС, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Функция ЗаказВСтрокуXML(Заказ) Экспорт
ПроверитьОбъектXDTO(Заказ);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Заказ, "Заказ", ПространствоИмен());
Возврат ЗаписьXML.Закрыть();
КонецФункции
Процедура ЗаписатьЗаказВФайл(Заказ, ИмяФайла) Экспорт
ПроверитьОбъектXDTO(Заказ);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
Попытка
ЗаписьXML.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Заказ, "Заказ", ПространствоИмен());
Исключение
ЗаписьXML.Закрыть();
ВызватьИсключение;
КонецПопытки;
ЗаписьXML.Закрыть();
КонецПроцедуры
// Пример вызова: строка XML для отправки во внешнюю систему.
Функция ПримерЗаказаXML() Экспорт
Позиции = Новый ТаблицаЗначений;
Позиции.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
Позиции.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Позиции.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
НоваяСтрока = Позиции.Добавить();
НоваяСтрока.Артикул = "SKU-001";
НоваяСтрока.Количество = 2;
НоваяСтрока.Цена = 1500;
Заказ = НовыйЗаказXDTO("А-125", ТекущаяДатаСеанса(), "ООО Ромашка", "7700000000", Позиции);
Возврат ЗаказВСтрокуXML(Заказ);
КонецФункцииПроверить() сверяет объект с типом — обязательные свойства, число значений — и при нарушении вызывает исключение; обёртка дописывает в его текст тип объекта.ФабрикаXDTO.ЗаписатьXML() принимает ЗаписьXML, объект, имя и URI корневого элемента. Дальше можно передать форму (ФормаXML) и назначение типа (НазначениеТипаXML): при явном назначении в элемент пишется xsi:type.Закрыть() после УстановитьСтроку() возвращает готовый текст XML.// Общий модуль ОбменЗаказамиXDTO (продолжение).
// ТекстXML - например, тело POST-запроса, пришедшего в HTTP-сервис.
Функция ПрочитатьЗаказ(ТекстXML) Экспорт
ТипЗаказа = ТипПакета("ЗаказКлиента");
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
Попытка
Заказ = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипЗаказа);
Исключение
ЧтениеXML.Закрыть();
ВызватьИсключение "XML не соответствует пакету ЗаказыКлиентов:" + Символы.ПС + ОписаниеОшибки();
КонецПопытки;
ЧтениеXML.Закрыть();
ПроверитьОбъектXDTO(Заказ);
Результат = Новый Структура;
Результат.Вставить("Номер", Заказ.Номер);
Результат.Вставить("Дата", Заказ.Дата); // xs:dateTime -> Дата
Результат.Вставить("ИНН", Заказ.Клиент.ИНН);
Результат.Вставить("Комментарий", "");
Если Заказ.Установлено("Комментарий") Тогда
Результат.Комментарий = Заказ.Комментарий;
КонецЕсли;
Позиции = Новый Массив;
Для Каждого Позиция Из Заказ.Позиция Цикл
// xs:decimal приходит Числом, разбирать строки не нужно
Позиции.Добавить(Новый Структура("Артикул, Количество, Цена",
Позиция.Артикул, Позиция.Количество, Позиция.Цена));
КонецЦикла;
Результат.Вставить("Позиции", Позиции);
Возврат Результат;
КонецФункцииxsi:type или по имени и пространству имён корня, а не найдя, возвращает объект открытого типа anyType: имена доступны, но значения приходят строками, и проверка ничего не ловит.Установлено() отличает непереданное необязательное свойство от пустого значения.xs:decimal — Число, xs:dateTime — Дата.Структуру пакета из чужой XSD быстрее посмотреть кодом, чем в дереве конфигуратора:
// Общий модуль ОбменЗаказамиXDTO (продолжение).
// Вызов: ОписаниеТипаXDTO(ПространствоИмен(), "ЗаказКлиента").
Функция ОписаниеТипаXDTO(URIПространстваИмен, ИмяТипа) Экспорт
ТипXDTO = ФабрикаXDTO.Тип(URIПространстваИмен, ИмяТипа);
Если ТипXDTO = Неопределено Тогда
Возврат СтрШаблон("Тип {%1}%2 не найден", URIПространстваИмен, ИмяТипа);
ИначеЕсли ТипЗнч(ТипXDTO) = Тип("ТипЗначенияXDTO") Тогда
Возврат СтрШаблон("%1 - тип значения на основе %2", ИмяТипа, ТипXDTO.БазовыйТип.Имя);
КонецЕсли;
Описание = Новый Массив;
Описание.Добавить(СтрШаблон("%1 - тип объекта, открытый: %2",
ИмяТипа, Формат(ТипXDTO.Открытый, "БЛ=нет; БИ=да")));
Для Каждого Свойство Из ТипXDTO.Свойства Цикл
Если Свойство.ВерхняяГраница = -1 Тогда
Граница = "*";
Иначе
Граница = Формат(Свойство.ВерхняяГраница, "ЧГ=0");
КонецЕсли;
Описание.Добавить(СтрШаблон(" %1: %2 [%3..%4], форма: %5", Свойство.Имя,
Свойство.Тип.Имя, Свойство.НижняяГраница, Граница, Свойство.Форма));
КонецЦикла;
Возврат СтрСоединить(Описание, Символы.ПС);
КонецФункции
// Чтение свойства по имени строкой: подходит и для имен вроде "order-id",
// которые нельзя написать через точку.
Функция ЗначениеСвойства(ОбъектXDTO, ИмяСвойства, ЗначениеПоУмолчанию = Неопределено) Экспорт
Если ОбъектXDTO.Установлено(ИмяСвойства) Тогда
Возврат ОбъектXDTO.Получить(ИмяСвойства);
КонецЕсли;
Возврат ЗначениеПоУмолчанию;
КонецФункцииТип() возвращает ТипЗначенияXDTO или ТипОбъектаXDTO, поэтому ветки разделены через ТипЗнч(); коллекция Свойства у типа объекта состоит из СвойствоXDTO.anyType.order-id через точку не записать — для них есть Получить() и Установить() с именем строкой.Во внешнюю обработку пакет XDTO не добавить. Выход — собрать фабрику из XSD во время работы:
// Модуль объекта внешней обработки. XSD из начала статьи лежит
// в макете СхемаЗаказов с типом «Текстовый документ».
Функция ФабрикаЗаказов() Экспорт
ИмяФайлаСхемы = ПолучитьИмяВременногоФайла("xsd");
ПолучитьМакет("СхемаЗаказов").Записать(ИмяФайлаСхемы, КодировкаТекста.UTF8);
Попытка
Фабрика = СоздатьФабрикуXDTO(ИмяФайлаСхемы);
Исключение
УдалитьФайлы(ИмяФайлаСхемы);
ВызватьИсключение;
КонецПопытки;
УдалитьФайлы(ИмяФайлаСхемы);
Возврат Фабрика;
КонецФункции
Функция ЗаказИзСтроки(ТекстXML, Фабрика) Экспорт
ТипЗаказа = Фабрика.Тип("http://1c-only.ru/xdto/orders/1.0", "ЗаказКлиента");
Если ТипЗаказа = Неопределено Тогда
ВызватьИсключение "В схеме нет типа ЗаказКлиента";
КонецЕсли;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
Попытка
Заказ = Фабрика.ПрочитатьXML(ЧтениеXML, ТипЗаказа);
Заказ.Проверить();
Исключение
ЧтениеXML.Закрыть();
ВызватьИсключение;
КонецПопытки;
ЧтениеXML.Закрыть();
Возврат Заказ;
КонецФункции
Функция НомераЗаказов(ТекстыXML) Экспорт
Фабрика = ФабрикаЗаказов(); // схема разбирается один раз на всю пачку
Номера = Новый Массив;
Для Каждого ТекстXML Из ТекстыXML Цикл
Номера.Добавить(ЗаказИзСтроки(ТекстXML, Фабрика).Номер);
КонецЦикла;
Возврат Номера;
КонецФункцииСоздатьФабрикуXDTO() читает схему из файла, поэтому макет сохраняется во временный файл. Без файла то же делает цепочка ПостроительDOM → ПостроительСхемXML → Новый ФабрикаXDTO(НаборСхем).ФабрикаXDTO о таких типах не знает: создавать, читать и записывать объекты нужно методами той же фабрики.Для объектов конфигурации свой пакет не нужен: платформа описывает их в пространстве имён http://v8.1c.ru/8.1/data/enterprise/current-config типами вида CatalogObject.Номенклатура и CatalogRef.Номенклатура. Пишет и читает их СериализаторXDTO:
// Общий модуль ПереносНоменклатурыXML, флажок «Сервер».
// Перенос элементов справочника между базами с одинаковой конфигурацией.
Процедура ВыгрузитьНоменклатуру(МассивСсылок, ИмяФайла) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config");
Для Каждого Ссылка Из МассивСсылок Цикл
Объект = Ссылка.ПолучитьОбъект();
Если Объект <> Неопределено Тогда // битые ссылки пропускаем
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Объект, НазначениеТипаXML.Явное);
КонецЕсли;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
КонецПроцедуры
Функция ЗагрузитьНоменклатуру(ИмяФайла) Экспорт
Загружено = 0;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ЧтениеXML.ПерейтиКСодержимому(); // корневой элемент Данные
ЧтениеXML.Прочитать(); // первый объект внутри него
НачатьТранзакцию();
Попытка
Пока СериализаторXDTO.ВозможностьЧтенияXML(ЧтениеXML) Цикл
Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Если ТипЗнч(Объект) <> Тип("СправочникОбъект.Номенклатура") Тогда
ВызватьИсключение "Неожиданный тип в файле: " + Строка(ТипЗнч(Объект));
КонецЕсли;
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
Загружено = Загружено + 1;
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ЧтениеXML.Закрыть();
ВызватьИсключение;
КонецПопытки;
ЧтениеXML.Закрыть();
Возврат Загружено;
КонецФункцииНазначениеТипаXML.Явное тип записан в каждом элементе, и ВозможностьЧтенияXML() сама понимает, какой объект перед ней. Цикл заканчивается на закрывающем теге корня.Записать() создаст его, если есть — перезапишет.ОбменДанными.Загрузка = Истина — признак загрузки, при котором обработчики ПередЗаписью типовых конфигураций пропускают прикладную логику.Ссылку передают целиком или только идентификатором:
// Общий модуль ПереносНоменклатурыXML (продолжение).
Функция СсылкаЧерезXML(Ссылка) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Ссылка, НазначениеТипаXML.Явное);
ТекстXML = ЗаписьXML.Закрыть(); // <CatalogRef.Номенклатура ...>GUID</CatalogRef.Номенклатура>
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
ПрочитаннаяСсылка = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Возврат ПрочитаннаяСсылка; // равна исходной, но наличие в базе не проверено
КонецФункции
// Обратная операция к XMLСтрока(Ссылка), которой GUID кладут в строковое свойство XDTO.
Функция НоменклатураПоGUID(СтрокаGUID) Экспорт
Ссылка = XMLЗначение(Тип("СправочникСсылка.Номенклатура"), СтрокаGUID);
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА КАК Найден ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
ВызватьИсключение "В базе нет номенклатуры с идентификатором " + СтрокаGUID;
КонецЕсли;
Возврат Ссылка;
КонецФункцииXMLСтрока(Ссылка) отдаёт GUID строкой, XMLЗначение() собирает ссылку обратно. В своих пакетах ссылку обычно передают так — GUID в строковом свойстве.ОбщегоНазначения.ЗначениеВСтрокуXML() и ЗначениеИзСтрокиXML().| Текст ошибки или симптом | Причина | Что сделать |
|---|---|---|
| «Переменная не определена (ФабрикаXDTO)» | код с XDTO выполняется в тонком или веб-клиенте | перенести в &НаСервере или серверный общий модуль |
| «Ошибка при вызове метода контекста (Создать)» | ФабрикаXDTO.Тип() вернул Неопределено из-за опечатки в имени или URI | проверять результат Тип(), хранить URI в одной функции |
| «Ошибка проверки данных XDTO: Значение: '12345' не соответствует простому типу: {http://1c-only.ru/xdto/orders/1.0}ИНН» | значение нарушает фасет: длину, перечисление, шаблон, формат даты | проверять и приводить данные до присваивания |
| «Ошибка проверки данных XDTO: Структура объекта '/' не соответствует типу: {…}ЗаказКлиента» | не заполнено обязательное свойство (например, нет ни одной Позиции) или значений больше верхней границы | вызывать Проверить() до записи |
| «Ошибка преобразования данных XDTO: НачалоСвойства: … Форма: Элемент Тип: …» | в XML элемент, которого тип в этом месте не ждёт: другое имя, нарушен порядок xs:sequence, чужое пространство имён | сравнить XML со схемой с этого элемента |
| ошибки нет, но значения пустые или строковые | ПрочитатьXML() без типа не узнал корень и вернул anyType | передавать тип явно, проверять Тип().URIПространстваИмен |
ошибка XDTO с типом {http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogObject.… | СериализаторXDTO читает файл из базы с другим составом реквизитов | свой пакет или EnterpriseData |
Несовпадение пространства имён — самая частая причина ошибок чтения. URI сравнивается посимвольно: адрес с косой чертой на конце — уже другое пространство. Схема статьи объявлена с elementFormDefault="qualified", поэтому дочерние элементы тоже должны быть в её пространстве: если партнёр ставит префикс только корню (<ns1:Заказ xmlns:ns1="…">), вложенные элементы без префикса для фабрики чужие. Лечится схемой, а не кодом: импортируйте XSD партнёра как есть, а не собирайте пакет по примеру XML.
ЗаписьXML и ЧтениеXML работают потоком: теги, порядок и пространства имён ведёте вы сами. DOM загружает документ в дерево для выборок XPath. XDTO даёт типизированные объекты по схеме и сам проверяет структуру.
Вызовите ФабрикаXDTO.ПрочитатьXML(ЧтениеXML) без типа: получится объект anyType с доступом по именам элементов. Повторяющийся элемент придёт как СписокXDTO, одиночный — как значение, и код должен обрабатывать оба варианта.
REST-API сервисов и маркетплейсов обычно работают с JSON, приёмы описаны в статье про JSON в 1С. XDTO выбирают, когда формат задан XSD, нужен SOAP-веб-сервис или обмен в EnterpriseData.
Сериализатор переносит ссылки по GUID и не тянет связанные объекты: если единица измерения не попала в файл, реквизит указывает на несуществующий объект. Выгружайте зависимые объекты вместе с основными.
Если 1С нужно подключить к внешней системе по чужой XSD, поднять SOAP-сервис или настроить обмен EnterpriseData, закажите доработку в разделе услуг 1c-only.ru. Приложите схему и пример XML, опишите конфигурацию — разместите задание, и исполнители оценят сроки и стоимость.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.