Как в XSD-схеме добавить атрибуты к тегам и настроить вложенные уровни элементов для выгрузки XML в 1С?

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

При интеграции 1С со сторонними системами с помощью XDTO и XML-документов разработчики часто сталкиваются с необходимостью строгого описания структуры через схему XSD (XML Schema Definition). Типовые трудности обычно возникают на двух этапах: добавление собственных XML-атрибутов в теги составных типов (например, descriptions="stocks.xml") и правильное описание вложенных иерархических структур (коллекций строк, табличных частей и вложенных деревьев). Разберем по шагам, как правильно составить такую схему и избежать распространенных ошибок сериализации в платформе 1С:Предприятие.

Добавление атрибутов к составным элементам схемы

Проанализируем первую задачу: требуется получить корневой тег с атрибутом следующего вида:


<batch descriptions="stocks.xml">
    <row>
        <store>Store-01</store>
        <date>2015-05-14</date>
        <product>000000001</product>
        <amount>26</amount>
    </row>
</batch>

В исходной схеме тег batch был описан как xs:complexType, содержащий только последовательность вложенных элементов xs:sequence. Чтобы добавить атрибут внутрь узла, необходимо использовать конструкцию xs:attribute. Важно помнить правило синтаксиса XSD: объявление атрибутов всегда помещается внутри блока xs:complexType строго после закрывающего тега последовательности элементов </xs:sequence>.

Посмотрим на пример описания типа batch с добавленным атрибутом:


<xs:complexType name="batch">
    <xs:sequence>
        <xs:element name="row" type="tns:row" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="descriptions" type="xs:string" use="required"/>
</xs:complexType>

Здесь параметр use="required" указывает на обязательность атрибута. Если атрибут может отсутствовать, следует указать значение use="optional".

Построение многоуровневой структуры вложенности (дерева элементов)

Рассмотрим более сложную задачу, когда внутри строки документа необходимо передать вложенную коллекцию данных, например список позиций номенклатуры:


<batch descriptions="Documents.xml">
    <row>
        <code>ВКЛ00082957</code>
        <type>103</type>
        <number>ВКЛ00082957</number>
        <items>
            <item>
                <product>КО14968-03400</product>
            </item>
        </items>
    </row>
</batch>

Для создания такой иерархии в XSD-схеме применяется принцип связывания пользовательских типов. Каждый уровень вложенности описывается отдельным сложным типом xs:complexType, на который ссылается родительский элемент через атрибут type.

Разберем по шагам построение этой структуры сверху вниз:

  1. Корневой уровень (batch): содержит список строк row и атрибут descriptions.
  2. Уровень документа (row): описывает реквизиты шапки (code, type, number), а также содержит коллекцию items.
  3. Уровень контейнера строк (items): выступает оберткой для набора конкретных записей item с признаком множественности maxOccurs="unbounded".
  4. Уровень детальной записи (item): содержит конечные поля (например, product, amount).

Соберем полную схему, реализующую данную структуру:


<xs:schema xmlns:tns="Documents.xml"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="Documents.xml"
           attributeFormDefault="unqualified"
           elementFormDefault="qualified">

    <xs:element name="batch" type="tns:batch"/>

    <xs:complexType name="batch">
        <xs:sequence>
            <xs:element name="row" type="tns:row" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="descriptions" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:complexType name="row">
        <xs:sequence>
            <xs:element name="code" type="xs:string"/>
            <xs:element name="type" type="xs:string"/>
            <xs:element name="number" type="xs:string"/>
            <xs:element name="items" type="tns:items"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="items">
        <xs:sequence>
            <xs:element name="item" type="tns:item" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="item">
        <xs:sequence>
            <xs:element name="product" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

</xs:schema>

Важные нюансы работы с фабрикой XDTO в 1С

Рассмотрим технические тонкости сериализации данных через ФабрикаXDTO, которые напрямую влияют на корректность выходного XML-файла:

  1. Объявление глобального элемента: обратите внимание на строку <xs:element name="batch" type="tns:batch"/>. Если в XSD объявлены только типы xs:complexType, но нет корневого xs:element, платформа 1С при вызове метода ФабрикаXDTO.ЗаписатьXML() не сможет автоматически сопоставить имя тега документа, что приведет к ошибкам при сериализации или валидации.
  2. Управление пространствами имен: если целевая система требует чистый XML без префиксов и атрибутов xmlns, из схемы следует убрать targetNamespace и префиксы tns:, ссылаясь на типы напрямую по имени.
  3. Устранение лишнего атрибута xsi:type: платформа 1С добавляет xsi:type="xs:string", если тип переданного значения в коде 1С не совпадает с типом, объявленным в схеме (например, если в числовое поле передана строка), либо тип не был зарегистрирован в фабрике. Чтобы исключить подобные атрибуты, в методе ФабрикаXDTO.ЗаписатьXML() рекомендуется указывать параметр НазначениеТипаXML.Неявное и контролировать строгую типизацию данных.
  4. Порядок следования тегов: конструкция xs:sequence обязывает соблюдать жесткий порядок записи элементов. Если порядок свойств при заполнении объекта XDTO нарушен, будет вызвано исключение о несоответствии содержимого типу.
  5. Кодировка выходного файла: кодировка документа (например, UTF-16 или UTF-8) не определяется схемой XSD. Она задается в момент создания объекта ЗаписьXML в коде 1С:
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("C:\export.xml", "UTF-16");
    ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO, , , , НазначениеТипаXML.Неявное);
    ЗаписьXML.Закрыть();
    

Применение четкой структуры связанных типов XSD позволяет быстро строить сложные иерархические форматы обмена и гарантирует корректную валидацию выгружаемых XML-файлов на стороне принимающей системы.

← На главную