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

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

При интеграции систем часто возникает задача преобразования данных из внешних источников (например, прайс-листов или отчетов в формате Excel) в регламентированный формат XML, структура которого строго задана схемой XSD. В платформе 1С:Предприятие 8 для решения этой задачи предусмотрен механизм XDTO (XML Data Transfer Objects), который позволяет работать с иерархическими структурами XML как с обычными объектами 1С, обеспечивая строгую типизацию и соответствие схеме.

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

Шаг 1. Подключение XSD-схемы к фабрике XDTO

Для того чтобы платформа могла создавать типизированные объекты, ей необходимо знать структуру типов, описанную в схеме XSD. Подключить схему можно двумя основными способами:

  1. Статически через дерево метаданных: добавим в ветку конфигурации XDTO-пакеты новый пакет и выполним импорт файла XSD. В этом случае все описанные типы становятся доступны через глобальный контекст ФабрикаXDTO.
  2. Динамически в коде без изменения конфигурации: если схема часто меняется или конфигурация находится на поддержке, фабрику можно создать «на лету» с помощью метода СоздатьФабрикуXDTO, передав путь к файлу схемы или массив путей к зависимым файлам XSD.

Посмотрим на пример инициализации динамической фабрики из внешнего файла схемы:


ПутьКСхеме = "C:\Schemas\BookSchema.xsd";
МояФабрика = СоздатьФабрикуXDTO(ПутьКСхеме);
ТипКорня = МояФабрика.Тип("http://www.myshop.org/books", "booklist");
XDTOСписок = МояФабрика.Создать(ТипКорня);

Шаг 2. Чтение исходных данных из таблицы Excel

Для чтения информации из файлов XLSX/XLS можно использовать различные механизмы в зависимости от среды исполнения:

  1. Через объект COMОбъект: классический вариант для ОС Windows с установленным пакетом Microsoft Office.
  2. Через объект ТабличныйДокумент: кроссплатформенный вариант, работающий нативно на сервере под управлением Windows или Linux без необходимости установки сторонних офисных программ.

Проанализируем пример кроссплатформенного чтения данных из таблицы:


ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайлаЗагрузки, СпособЧтенияЗначенийТабличногоДокумента.Значение);

ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 2 По ВсегоСтрок Цикл
    ЗначениеКатегории = ТабДок.Область(НомерСтроки, 1).Текст;
    ЗначениеНазвания = ТабДок.Область(НомерСтроки, 2).Текст;
    ЗначениеЦены = Число(ТабДок.Область(НомерСтроки, 3).Значение);
    // Передача значений в XDTO
КонецЦикла;

Шаг 3. Создание структуры XDTO и заполнение данными

Рассмотрим подробнее процесс формирования дерева объектов XDTO. Корневой элемент создается вызовом метода Создать от целевого типа. Если элемент содержит вложенные структуры или коллекции (списки), типы дочерних объектов получаются через свойство ВладеющееСвойство.Тип родительского узла.

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


ТипКорневой = ФабрикаXDTO.Тип("http://www.myshop.org/books", "booklist");
XDTOКниги = ФабрикаXDTO.Создать(ТипКорневой);

// Добавление первого дочернего элемента
XDTOКнига1 = ФабрикаXDTO.Создать(XDTOКниги.book.ВладеющееСвойство.Тип);
XDTOКнига1.category = "COOKING";
XDTOКнига1.title = "Everyday Italian";
XDTOКнига1.author = "Giada De Laurentiis";
XDTOКнига1.year = 2005;
XDTOКнига1.price = 29.99;
XDTOКниги.book.Добавить(XDTOКнига1);

// Добавление второго дочернего элемента
XDTOКнига2 = ФабрикаXDTO.Создать(XDTOКниги.book.ВладеющееСвойство.Тип);
XDTOКнига2.category = "CHILDREN";
XDTOКнига2.title = "Harry Potter";
XDTOКнига2.author = "J. K. Rowling";
XDTOКнига2.year = 2005;
XDTOКнига2.price = 29.99;
XDTOКниги.book.Добавить(XDTOКнига2);

Шаг 4. Выгрузка данных в файл XML

Когда объект XDTO полностью заполнен и сформирован в памяти, выполняем его сериализацию с помощью объекта ЗаписьXML и метода ФабрикаXDTO.ЗаписатьXML. Это гарантирует генерацию корректного XML с правильными тегами, префиксами и атрибутами пространств имен.


ЗаписьXML = Новый ЗаписьXML;
ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);
ЗаписьXML.ОткрытьФайл(ИмяВыгружаемогоФайла, ПараметрыЗаписи);

// Сериализация объекта XDTO в поток XML
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, XDTOКниги);

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

Частые ошибки при работе с XSD-схемами в 1С

Выясним причины распространенных ошибок, возникающих при попытке импорта или использования схем XSD:

  1. Ошибка проверки модели XDTO вида «Импортируемый пакет типов не определен»: обычно возникает, если в теге <xs:import> не указан URI пространства имен (пустой атрибут namespace), либо если в фабрику загружается схема, ссылающаяся на внешние типы, которые не были переданы в метод СоздатьФабрикуXDTO вместе с основным файлом.
  2. Отсутствие целевого пространства имен: в корне схемы <xs:schema> обязательно должен присутствовать атрибут targetNamespace, соответствующий используемому в 1С пространству имен.
  3. Сложности с анонимными типами: встроенный генератор XDTO в платформе 1С наиболее стабильно работает со схемами, где сложные типы (<xs:complexType>) вынесены в отдельные именованные элементы, а не объявлены скрыто внутри элементов.
← На главную