Как сформировать XML-файл по схеме XSD с помощью фабрики XDTO в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С со сторонними системами часто требуется сформировать XML-документ со строгой валидацией по внешней схеме XSD. Нередко разработчики сталкиваются с вопросами: как правильно инициализировать фабрику XDTO, откуда брать имена типов и пространств имен, а также как заполнять вложенные свойства и выгружать готовый документ в файл. Разберем этот процесс по шагам.

Шаг 1. Определение целевого пространства имен и корневого типа схемы

Для создания объекта через ФабрикаXDTO необходимо передать платформе два параметра: URI пространства имен (targetNamespace) и имя типа создаваемого объекта.

Выясним, где найти эти параметры в самом файле схемы:

  1. Откроем файл .xsd в текстовом редакторе.
  2. Найдем корневой тег <xs:schema>. Значение атрибута targetNamespace — это URI пространства имен пакета. Например, http://www.1c.ru/demos/products.
  3. Найдем определение корневого элемента в теге <xs:element>. Если в нем указан атрибут type="...", то именно имя этого комплексного типа (тег <xs:complexType name="...">) передается в метод Тип().

Важный нюанс: если в XSD-схеме корневой элемент определен с анонимным типом (тег <xs:complexType> расположен непосредственно внутри <xs:element> без атрибута имени), метод НоваяФабрикаXDTO.Тип(URI, Имя) вернет Неопределено. В такой ситуации тип объекта следует получать через свойство пакета XDTO:


ОпределениеСвойства = НоваяФабрикаXDTO.Пакеты.Получить(ИмяПакета).Свойства.Получить("ИмяКорневогоЭлемента");
ТипОбъекта = ОпределениеСвойства.Тип;

Если структура схемы неизвестна или ее сложно разобрать вручную, можно исследовать загруженные типы и свойства программно, перебрав коллекции Пакеты, Типы и Свойства фабрики XDTO.

Шаг 2. Создание локальной фабрики 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 полным списком.

Шаг 3. Заполнение свойств объекта XDTO

Проанализируем правила заполнения полей созданного объекта. Заполнение простых реквизитов выполняется через прямое присвоение значений полям объекта:


КорневойРаздел.Наименование = СсылкаНаОбъект.Наименование;
КорневойРаздел.Код = СсылкаНаОбъект.Код;

Однако при заполнении сложных структур действуют особые правила:

  1. Вложенные составные типы: если свойство само по себе является комплексным типом, нельзя сразу присвоить ему примитивное значение. Сначала создается отдельный подчиненный объект соответствующего типа через метод Создать() фабрики, заполняются его поля, и затем объект присваивается свойству родителя.
  2. Множественные элементы (коллекции и списки): если свойство в схеме описано с ограничением maxOccurs="unbounded" (или более 1), обращение к этому свойству возвращает коллекцию типа СписокXDTO. Элементы добавляются в нее методом Добавить():
    
    // Создаем элемент строки таблицы/коллекции
    ТипСтроки = НоваяФабрикаXDTO.Тип(ИмяПакета, "ItemType");
    НоваяСтрока = НоваяФабрикаXDTO.Создать(ТипСтроки);
    НоваяСтрока.Цена = 1500;
    НоваяСтрока.Количество = 2;
    
    // Добавляем созданный подчиненный элемент в коллекцию
    КорневойРаздел.Товары.Добавить(НоваяСтрока);
    

Платформа 1С автоматически контролирует порядок расположения тегов при сериализации в соответствии с блоком <xs:sequence> схемы. Однако все обязательные свойства (minOccurs="1") должны быть обязательно заполнены, иначе сформированный XML будет невалидным.

Шаг 4. Выгрузка готового объекта в XML-файл

Для сохранения заполненной структуры в файл используется связка объектов ЗаписьXML и метода ЗаписатьXML() фабрики XDTO:


ПутьКФайлу = "C:\shem\result.xml";

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");

// Сериализуем объект XDTO в XML с указанием имени корневого узла и пространства имен
НоваяФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КорневойРаздел, "RootElement", ИмяПакета);

ЗаписьXML.Закрыть();

Важный момент: если объект создавался на основе типа данных, указание имени корневого тега и пространства имен в методе ЗаписатьXML() обязательно. Если этого не сделать, итоговый XML-документ не будет иметь корректного корневого элемента.

Альтернативный вариант: импорт пакета XDTO в метаданные

Помимо динамической загрузки схемы через метод СоздатьФабрикуXDTO, можно импортировать схему непосредственно в конфигурацию:

  1. В дереве метаданных найдем ветку Общие -> Пакеты XDTO.
  2. По правому клику выберем команду Импорт схемы XML и укажем файл схемы.

Такой подход позволяет наглядно просматривать состав типов и свойств в Конфигураторе, а в программном коде использовать глобальную системную фабрику ФабрикаXDTO, исключая зависимость от путей к файлам на диске.

← На главную