Технология XDTO (XML Data Transfer Objects) в платформе 1С:Предприятие представляет собой мощный механизм для моделирования и сериализации данных по заданным XSD-схемам. При интеграции 1С со сторонними системами (например, CRM-системами на C#) часто возникает задача выгрузить данные из справочников или регистров в формате XML в точном соответствии с подготовленным пакетом XDTO.
Разберем по шагам, как правильно формировать XML-файлы с помощью объектов 1С, избегая частых ошибок и лишнего кода.
Для создания объектов XDTO в коде платформы используется глобальный объект ФабрикаXDTO. Работа построена на получении типов из вашего XDTO-пакета по пространству имен (URI) и имени типа с последующим созданием экземпляр объекта.
Проанализируем базовый алгоритм создания объекта:
ФабрикаXDTO.Тип(URI, ИмяТипа).ФабрикаXDTO.Создать(ТипXDTO).ЗаписьXML и метода ФабрикаXDTO.Записать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.Закрыть();
Важные особенности данного подхода:
ЗаполнитьЗначенияСвойств существенно сокращает объем кода, если имена свойств в XDTO-пакете совпадают с именами реквизитов объекта 1С.ФабрикаXDTO.ЗаписатьXML, что гарантирует соответствие итогового документа описанной XSD-схеме.В отличие от справочников, регистр сведений не является объектным типом данных в 1С. Для его экспорта в XDTO обычно используется выборка записей с помощью РегистрыСведений.КурсыВалют.Выбрать() или набор записей.
В XDTO-пакете под регистр создается тип записи со свойствами: Период, Валюта, Курс, Кратность. При заполнении ссылочных полей (например, поля Валюта) следует учитывать приведение типов: объект XDTO ожидает строку или число, но не ссылку 1С. Поэтому передавать следует конкретное значение (код, наименование или уникальный идентификатор):
КурсXDTO.Валюта = Строка(ВыборкаЗаписи.Валюта.УникальныйИдентификатор());
При работе с крупными объемами данных и сложными XDTO-пакетами обратите внимание на следующие нюансы:
ОбъектXDTO.Проверить(). Если данные в объекте не соответствуют ограничениям XSD (например, не заполнено обязательное поле), платформа выдаст понятную ошибку.ФабрикаXDTO.Создать() может вызвать повышенное потребление RAM. Если нужно выгрузить миллионы записей, комбинируйте подходы: открывайте родительский тег в ЗаписьXML, формируйте и записывайте объекты небольшими порциями, а затем закрывайте тег.Если формат обмена не зафиксирован жестко на стороне C# CRM, рассмотрим более современные и удобные альтернативы:
ЗаписьJSON или ПрочитатьJSON. В C# такие структуры разбираются нативно с помощью System.Text.Json.