При интеграции 1С со сторонними системами часто требуется сформировать XML-документ со строгой валидацией по внешней схеме XSD. Нередко разработчики сталкиваются с вопросами: как правильно инициализировать фабрику XDTO, откуда брать имена типов и пространств имен, а также как заполнять вложенные свойства и выгружать готовый документ в файл. Разберем этот процесс по шагам.
Для создания объекта через ФабрикаXDTO необходимо передать платформе два параметра: URI пространства имен (targetNamespace) и имя типа создаваемого объекта.
Выясним, где найти эти параметры в самом файле схемы:
.xsd в текстовом редакторе.<xs:schema>. Значение атрибута targetNamespace — это URI пространства имен пакета. Например, http://www.1c.ru/demos/products.<xs:element>. Если в нем указан атрибут type="...", то именно имя этого комплексного типа (тег <xs:complexType name="...">) передается в метод Тип().Важный нюанс: если в XSD-схеме корневой элемент определен с анонимным типом (тег <xs:complexType> расположен непосредственно внутри <xs:element> без атрибута имени), метод НоваяФабрикаXDTO.Тип(URI, Имя) вернет Неопределено. В такой ситуации тип объекта следует получать через свойство пакета XDTO:
ОпределениеСвойства = НоваяФабрикаXDTO.Пакеты.Получить(ИмяПакета).Свойства.Получить("ИмяКорневогоЭлемента");
ТипОбъекта = ОпределениеСвойства.Тип;
Если структура схемы неизвестна или ее сложно разобрать вручную, можно исследовать загруженные типы и свойства программно, перебрав коллекции Пакеты, Типы и Свойства фабрики XDTO.
Рассмотрим типовой сценарий, когда схема XSD хранится на диске. Создадим экземпляр фабрики XDTO и инициализируем корневой объект:
МассивСхемXSD = Новый Массив;
МассивСхемXSD.Добавить("C:\shem\CYSEC_DATTRA2.1 MAIN XML SCHEME.xsd");
// Создаем фабрику на основе файлов схем
НоваяФабрикаXDTO = СоздатьФабрикуXDTO(МассивСхемXSD);
ИмяПакета = "http://www.example.com/schema"; // Значение targetNamespace из XSD
// Получаем тип создаваемого объекта
ТипОбъекта = НоваяФабрикаXDTO.Тип(ИмяПакета, "RootType");
КорневойРаздел = НоваяФабрикаXDTO.Создать(ТипОбъекта);
Обратите внимание: если схема содержит директивы импорта или включения других схем (теги <xs:import> или <xs:include>), все зависимые файлы схем должны либо располагаться в том же каталоге на диске, либо передаваться в МассивСхемXSD полным списком.
Проанализируем правила заполнения полей созданного объекта. Заполнение простых реквизитов выполняется через прямое присвоение значений полям объекта:
КорневойРаздел.Наименование = СсылкаНаОбъект.Наименование;
КорневойРаздел.Код = СсылкаНаОбъект.Код;
Однако при заполнении сложных структур действуют особые правила:
Создать() фабрики, заполняются его поля, и затем объект присваивается свойству родителя.maxOccurs="unbounded" (или более 1), обращение к этому свойству возвращает коллекцию типа СписокXDTO. Элементы добавляются в нее методом Добавить():
// Создаем элемент строки таблицы/коллекции
ТипСтроки = НоваяФабрикаXDTO.Тип(ИмяПакета, "ItemType");
НоваяСтрока = НоваяФабрикаXDTO.Создать(ТипСтроки);
НоваяСтрока.Цена = 1500;
НоваяСтрока.Количество = 2;
// Добавляем созданный подчиненный элемент в коллекцию
КорневойРаздел.Товары.Добавить(НоваяСтрока);
Платформа 1С автоматически контролирует порядок расположения тегов при сериализации в соответствии с блоком <xs:sequence> схемы. Однако все обязательные свойства (minOccurs="1") должны быть обязательно заполнены, иначе сформированный XML будет невалидным.
Для сохранения заполненной структуры в файл используется связка объектов ЗаписьXML и метода ЗаписатьXML() фабрики XDTO:
ПутьКФайлу = "C:\shem\result.xml";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");
// Сериализуем объект XDTO в XML с указанием имени корневого узла и пространства имен
НоваяФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КорневойРаздел, "RootElement", ИмяПакета);
ЗаписьXML.Закрыть();
Важный момент: если объект создавался на основе типа данных, указание имени корневого тега и пространства имен в методе ЗаписатьXML() обязательно. Если этого не сделать, итоговый XML-документ не будет иметь корректного корневого элемента.
Помимо динамической загрузки схемы через метод СоздатьФабрикуXDTO, можно импортировать схему непосредственно в конфигурацию:
Такой подход позволяет наглядно просматривать состав типов и свойств в Конфигураторе, а в программном коде использовать глобальную системную фабрику ФабрикаXDTO, исключая зависимость от путей к файлам на диске.