Как в 1С выгрузить объект в XML со всеми реквизитами связанных ссылок вместо одних лишь УИД?

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

При использовании стандартной сериализации в 1С разработчики часто сталкиваются с ситуацией, когда метод ЗаписатьXML(ЗаписьXML, Объект) выгружает ссылочные реквизиты (например, договоры контрагентов, склады, номенклатуру) исключительно в виде их типа и уникального идентификатора (UUID). Разберем причины такого поведения платформы и рассмотрим практические способы выгрузки объектов с полным набором вложенных реквизитов.

Почему ЗаписатьXML выгружает только УИД ссылочных типов

Метод ЗаписатьXML использует стандартный СериализаторXDTO и встроенную системную модель типов 1С. В реляционной базе данных ссылки являются независимыми сущностями. Если бы платформа при выгрузке ссылки автоматически начинала каскадно («глубоко») сериализовать объект, на который она указывает, это приводило бы к выгрузке почти всей информационной базы и неконтролируемым зацикливаниям (когда объект А ссылается на объект Б, а объект Б — на объект А).

Поэтому стандартный механизм 1С сериализует саму ссылку компактно: через уникальный идентификатор. Чтобы передать полные данные связанных объектов, требуется применить один из специализированных инструментов или написать собственный алгоритм обхода.

Вариант 1. Использование типовой обработки «Выгрузка и загрузка данных XML»

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

  1. Обработка Выгрузка и загрузка данных XML.epf автоматически определяет состав выгружаемых объектов.
  2. При выгрузке контрагента можно включить выгрузку связанных справочников по ссылкам (например, подчиненных договоров).
  3. Механизм самостоятельно разрешает порядок записи объектов, чтобы избежать ошибок отсутствующих ссылок при последующей загрузке.

Вариант 2. Конфигурация «Конвертация данных» и правила обмена

Когда требуется переносить данные между разными структурами баз (например, сопоставлять контрагентов не по УИД, а по ИНН/КПП, а договоры по номеру и дате), оптимальным решением является инструмент «1С:Конвертация данных»:

  1. В правилах конвертации объектов (ПКО) настраиваются поля поиска. Например, для контрагента можно отключить поиск по УИД и включить сопоставление по реквизиту ИНН или Код.
  2. В правилах конвертации свойств (ПКС) для ссылочного реквизита (например, договора) указывается соответствующее ПКО. При выгрузке родительского объекта платформа автоматически сформирует правила для выгрузки всех необходимых полей подчиненного объекта.
  3. Механизм конвертации берет на себя сопоставление ссылок и корректный разбор циклических зависимостей.

Вариант 3. Использование XDTO-пакетов и Фабрики XDTO

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

  1. Создаем в конфигурации собственный XDTO-пакет, где в типе объекта контрагента свойство Договор объявляется не как простая строка с УИД, а как сложный тип со всеми требуемыми реквизитами (Номер, Дата, ВидДоговора).
  2. Заполняем структуру XDTO-объекта программно:

ТипКонтрагента = ФабрикаXDTO.Тип("http://mycompany.ru/exchange", "Контрагент");
ТипДоговора = ФабрикаXDTO.Тип("http://mycompany.ru/exchange", "Договор");

ОбъектXDTOКонтрагент = ФабрикаXDTO.Создать(ТипКонтрагента);
ОбъектXDTOКонтрагент.Наименование = КонтрагентСсылка.Наименование;
ОбъектXDTOКонтрагент.ИНН = КонтрагентСсылка.ИНН;

Если ЗначениеЗаполнено(КонтрагентСсылка.ОсновнойДоговор) Тогда
    ОбъектXDTОДоговор = ФабрикаXDTO.Создать(ТипДоговора);
    ОбъектXDTОДоговор.Номер = КонтрагентСсылка.ОсновнойДоговор.Номер;
    ОбъектXDTОДоговор.Дата = КонтрагентСсылка.ОсновнойДоговор.Дата;
    ОбъектXDTOКонтрагент.ОсновнойДоговор = ОбъектXDTОДоговор;
КонецЕсли;

ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTOКонтрагент);

Вариант 4. Ручное формирование XML через объект «ЗаписьXML»

Для простых сценариев или небольших интеграций можно формировать XML напрямую, управляя узлами и атрибутами документа:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\data.xml", "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();

ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагент");
ЗаписьXML.ЗаписатьАтрибут("УИД", Строка(КонтрагентОбъект.Ссылка.УникальныйИдентификатор()));
ЗаписьXML.ЗаписатьЭлемент("Наименование", КонтрагентОбъект.Наименование);
ЗаписьXML.ЗаписатьЭлемент("ИНН", КонтрагентОбъект.ИНН);

Если ЗначениеЗаполнено(КонтрагентОбъект.ОсновнойДоговорКонтрагента) Тогда
    ДоговорОбъект = КонтрагентОбъект.ОсновнойДоговорКонтрагента;
    ЗаписьXML.ЗаписатьНачалоЭлемента("ОсновнойДоговор");
    ЗаписьXML.ЗаписатьЭлемент("Номер", ДоговорОбъект.Номер);
    ЗаписьXML.ЗаписатьЭлемент("Дата", Формат(ДоговорОбъект.Дата, "ДФ=yyyy-MM-dd"));
    ЗаписьXML.ЗаписатьЭлемент("Наименование", ДоговорОбъект.Наименование);
    ЗаписьXML.ЗаписатьКонецЭлемента(); // ОсновнойДоговор
КонецЕсли;

ЗаписьXML.ЗаписатьКонецЭлемента(); // Контрагент
ЗаписьXML.Закрыть();

Вариант 5. Промежуточная выгрузка через структуры и JSON

Если формат XML не является жестким требованием принимающей стороны, удобным решением будет сборка данных в универсальные коллекции с последующей сериализацией в JSON:


ДанныеКонтрагента = Новый Структура;
ДанныеКонтрагента.Вставить("Наименование", КонтрагентОбъект.Наименование);
ДанныеКонтрагента.Вставить("ИНН", КонтрагентОбъект.ИНН);

Если ЗначениеЗаполнено(КонтрагентОбъект.ОсновнойДоговорКонтрагента) Тогда
    Договор = КонтрагентОбъект.ОсновнойДоговорКонтрагента;
    ДанныеДоговора = Новый Структура;
    ДанныеДоговора.Вставить("Номер", Договор.Номер);
    ДанныеДоговора.Вставить("Дата", Договор.Дата);
    ДанныеКонтрагента.Вставить("Договор", ДанныеДоговора);
КонецЕсли;

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Exchange\data.json");
ЗаписатьJSON(ЗаписьJSON, ДанныеКонтрагента);
ЗаписьJSON.Закрыть();

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

← На главную