При интеграции 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.
Разберем по шагам построение этой структуры сверху вниз:
row и атрибут descriptions.code, type, number), а также содержит коллекцию items.item с признаком множественности maxOccurs="unbounded".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, которые напрямую влияют на корректность выходного XML-файла:
<xs:element name="batch" type="tns:batch"/>. Если в XSD объявлены только типы xs:complexType, но нет корневого xs:element, платформа 1С при вызове метода ФабрикаXDTO.ЗаписатьXML() не сможет автоматически сопоставить имя тега документа, что приведет к ошибкам при сериализации или валидации.xmlns, из схемы следует убрать targetNamespace и префиксы tns:, ссылаясь на типы напрямую по имени.xsi:type: платформа 1С добавляет xsi:type="xs:string", если тип переданного значения в коде 1С не совпадает с типом, объявленным в схеме (например, если в числовое поле передана строка), либо тип не был зарегистрирован в фабрике. Чтобы исключить подобные атрибуты, в методе ФабрикаXDTO.ЗаписатьXML() рекомендуется указывать параметр НазначениеТипаXML.Неявное и контролировать строгую типизацию данных.xs:sequence обязывает соблюдать жесткий порядок записи элементов. Если порядок свойств при заполнении объекта XDTO нарушен, будет вызвано исключение о несоответствии содержимого типу.ЗаписьXML в коде 1С:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\export.xml", "UTF-16");
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO, , , , НазначениеТипаXML.Неявное);
ЗаписьXML.Закрыть();
Применение четкой структуры связанных типов XSD позволяет быстро строить сложные иерархические форматы обмена и гарантирует корректную валидацию выгружаемых XML-файлов на стороне принимающей системы.