Как добавить реквизит при выгрузке объекта в XML в 1С?

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

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

Способ 1. Использование «Конвертации данных 2.0» (КД 2)

Этот метод считается классическим и наиболее гибким для обмена через правила конвертации (XML-файлы правил). Рассмотрим алгоритм добавления нового поля, которого нет в источнике, но которое должно появиться в файле выгрузки.

Разберем по шагам работу в конфигурации «Конвертация данных 2.0»:

  1. Откроем нужное Правило Конвертации Объекта (ПКО).
  2. В табличной части «Правила конвертации свойств» (ПКС) добавим новую строку.
  3. В поле «Свойство приемника» выберем (или введем вручную) имя того реквизита, который ожидает получить база-приемник.
  4. Поле «Свойство источника» оставим пустым. Это ключевой момент, так как физического поля в источнике нет.
  5. Перейдем в обработчик события «Перед выгрузкой» для данного ПКС.
  6. Пропишем программный код для вычисления значения. Например:

// Пример заполнения значения для виртуального реквизита
Значение = "СтандартнаяКатегория"; 

// Или более сложная логика
Если Источник.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар Тогда
    Значение = Истина;
Иначе
    Значение = Ложь;
КонецЕсли;

Проанализируем ситуацию: при выгрузке механизм КД увидит, что поле источника пустое, но в обработчике переменной Значение присвоено конкретное содержимое. В итоге в XML-файле сформируется узел с именем свойства приемника и вашим значением.

Способ 2. Реализация в «Конвертации данных 3.0» (EnterpriseData)

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

Для добавления реквизита выполним следующие действия:

  1. Найдем в базе-источнике общий модуль с именем МенеджерОбменаЧерезУниверсальныйФормат (или аналогичный в расширении).
  2. Нам понадобится процедура-обработчик отправки для конкретного типа объекта. Обычно она называется по шаблону: ПКО_Справочник_Номенклатура_Отправка_ПриОбработке.
  3. В этой процедуре нам доступен параметр ДанныеXDTO, который представляет собой структуру будущего XML-сообщения.
  4. Добавим значение напрямую в структуру XDTO. Рассмотрим пример:

// Добавление реквизита, которого нет в метаданных источника
// Предположим, приемнику нужно поле "ДополнительныйКод"
Если ДанныеXDTO.Свойства().Получить("ДополнительныйКод") <> Неопределено Тогда
    ДанныеXDTO.ДополнительныйКод = "ED-999-XYZ";
КонецЕсли;

Важно: Если нужного реквизита нет в самой схеме формата EnterpriseData, вам сначала потребуется создать расширение XDTO-пакета в конфигурации и добавить это свойство в описание типа. Только после этого к нему можно будет обращаться через точку в коде менеджера обмена.

Способ 3. Прямое формирование XML через «ЗаписьXML»

Если вы не используете сложные системы конвертации, а пишете выгрузку «руками», рассмотрим, как модифицировать процесс стандартной записи. Мы не можем заставить метод ЗаписатьXML(Запись, Объект) добавить лишнее поле, поэтому нам нужно комбинировать автоматическую запись с ручными вставками.

Проанализируем следующий алгоритм:

  1. Создаем объект ЗаписьXML и открываем файл или строку.
  2. Записываем начало элемента объекта вручную.
  3. Используем СериализаторXDTO для записи стандартных реквизитов или записываем их последовательно.
  4. В нужный момент вручную вставляем наш дополнительный узел.

// Пример ручного добавления узла в XML
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Exchange\data.xml");
Запись.ЗаписатьНачалоЭлемента("CatalogObject.Номенклатура");

// Записываем стандартные реквизиты (упрощенно)
Запись.ЗаписатьНачалоЭлемента("Наименование");
Запись.ЗаписатьТекст(ОбъектИсточник.Наименование);
Запись.ЗаписатьКонецЭлемента();

// Добавляем наш "виртуальный" реквизит
Запись.ЗаписатьНачалоЭлемента("ВиртуальныйСтатус");
Запись.ЗаписатьТекст("Активен");
Запись.ЗаписатьКонецЭлемента();

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

Этот способ требует больше кода, но дает полный контроль над итоговой структурой файла. Посмотрим на альтернативу: можно выгрузить объект в структуру XDTOОбъект, добавить в коллекцию Свойства новый элемент и уже этот модифицированный XDTOОбъект отправить в ЗаписатьXML.

Способ 4. Использование Дополнительных Сведений (БСП)

Если конфигурация построена на базе БСП (Библиотеки Стандартных Подсистем), рассмотрим наиболее «мирный» способ без существенного изменения программного кода. Вы можете добавить новое свойство через механизм «Дополнительные сведения».

Многие типовые правила обмена (особенно в КД 2.0) настроены так, что они автоматически перебирают набор дополнительных сведений объекта и выгружают их в XML. В этом случае задача программиста сводится к следующему:

Это позволит избежать правок в коде модуля обмена и сохранит поддержку конфигурации в типовом состоянии.

Резюме по выбору решения

Подведем итоги нашего анализа:

  1. Если используется КД 2.0: создаем ПКС с пустым источником и пишем код в «Перед выгрузкой».
  2. Если используется КД 3.0: редактируем МенеджерОбменаЧерезУниверсальныйФормат и объект ДанныеXDTO.
  3. При прямой выгрузке: используем ЗаписьXML для ручного формирования структуры.
  4. Для минимума доработок: используем механизм «Дополнительные сведения» БСП.

Выбор конкретного метода зависит от того, какой инструмент обмена уже внедрен в вашей системе. В любом случае, добавление реквизита при выгрузке — это стандартная операция, которая решается путем вмешательства в процесс формирования XML-узлов на этапе сериализации данных.

← На главную