Как выгрузить данные из 1С 8.3 в XML с помощью XDTO и фабрики XDTO?

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

Технология XDTO (XML Data Transfer Objects) в платформе 1С:Предприятие представляет собой мощный механизм для моделирования и сериализации данных по заданным XSD-схемам. При интеграции 1С со сторонними системами (например, CRM-системами на C#) часто возникает задача выгрузить данные из справочников или регистров в формате XML в точном соответствии с подготовленным пакетом XDTO.

Разберем по шагам, как правильно формировать XML-файлы с помощью объектов 1С, избегая частых ошибок и лишнего кода.

Основы работы с Фабрикой XDTO

Для создания объектов XDTO в коде платформы используется глобальный объект ФабрикаXDTO. Работа построена на получении типов из вашего XDTO-пакета по пространству имен (URI) и имени типа с последующим созданием экземпляр объекта.

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

  1. Получаем тип из пакета XDTO с помощью метода ФабрикаXDTO.Тип(URI, ИмяТипа).
  2. Создаем объект типа с помощью метода ФабрикаXDTO.Создать(ТипXDTO).
  3. Заполняем свойства объекта данными из 1С.
  4. Сериализуем и записываем полученный объект в поток с помощью ЗаписьXML и метода ФабрикаXDTO.ЗаписатьXML().

Пошаговое создание XML-структуры и запись файла целиком

Рассмотрим распространенный кейс: выгрузка справочника Валюты в корневой элемент-контейнер XML. В данном случае нет необходимости вручную записывать открывающие и закрывающие теги через ЗаписатьНачалоЭлемента и ЗаписатьКонецЭлемента. Намного удобнее сформировать иерархию XDTO-объектов в памяти и выгрузить корневой объект целиком.

Посмотрим на пример эффективного кода:


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

// Получаем типы из XDTO-пакета "Выгрузка"
ТипДанных = ФабрикаXDTO.Тип("Выгрузка", "Данные");
ТипЭлемента = ФабрикаXDTO.Тип("Выгрузка", "Валюта");

// Создаем корневой объект-контейнер
Данные = ФабрикаXDTO.Создать(ТипДанных);

Выборка = Справочники.Валюты.Выбрать();
Пока Выборка.Следующий() Цикл
    // Создаем объект для каждой валюты
    ВалютаXDTO = ФабрикаXDTO.Создать(ТипЭлемента);
    
    // Заполняем совпадающие реквизиты
    ЗаполнитьЗначенияСвойств(ВалютаXDTO, Выборка);
    
    // Добавляем элемент в коллекцию корневого объекта
    Данные.Валюта.Добавить(ВалютаXDTO);
КонецЦикла;

// Записываем весь сформированный объект в XML
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Данные);
СтрокаДанных = ЗаписьXML.Закрыть();

Важные особенности данного подхода:

Выгрузка регистров сведений (например, "Курсы валют")

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

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

КурсXDTO.Валюта = Строка(ВыборкаЗаписи.Валюта.УникальныйИдентификатор());

Рекомендации по оптимизации и предупреждение ошибок

При работе с крупными объемами данных и сложными XDTO-пакетами обратите внимание на следующие нюансы:

  1. Валидация данных по схеме: Перед записью объекта в файл можно вызвать метод ОбъектXDTO.Проверить(). Если данные в объекте не соответствуют ограничениям XSD (например, не заполнено обязательное поле), платформа выдаст понятную ошибку.
  2. Контроль оперативной памяти: Создание очень большого массива элементов XDTO в памяти через ФабрикаXDTO.Создать() может вызвать повышенное потребление RAM. Если нужно выгрузить миллионы записей, комбинируйте подходы: открывайте родительский тег в ЗаписьXML, формируйте и записывайте объекты небольшими порциями, а затем закрывайте тег.
  3. Использование атрибутов: Ключевые идентификаторы (например, код или UUID) удобнее выносить в атрибуты XDTO-типа, а не в отдельные элементы. Это делает итоговый XML-файл более компактным и читаемым.

Альтернативные варианты обмена

Если формат обмена не зафиксирован жестко на стороне C# CRM, рассмотрим более современные и удобные альтернативы:

← На главную