При организации обмена данными между конфигурациями 1С часто возникает ситуация, когда в базе-приемнике объект имеет более сложную структуру или дополнительные реквизиты, которых нет в базе-источнике. Если использовать стандартную сериализацию через ЗаписатьXML, система выгрузит только те данные, которые физически существуют в метаданных текущей конфигурации. В этом материале мы подробно разберем несколько способов, как добавить «виртуальный» или вычисляемый реквизит в XML-структуру, чтобы принимающая сторона могла корректно обработать объект.
Этот метод считается классическим и наиболее гибким для обмена через правила конвертации (XML-файлы правил). Рассмотрим алгоритм добавления нового поля, которого нет в источнике, но которое должно появиться в файле выгрузки.
Разберем по шагам работу в конфигурации «Конвертация данных 2.0»:
// Пример заполнения значения для виртуального реквизита
Значение = "СтандартнаяКатегория";
// Или более сложная логика
Если Источник.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар Тогда
Значение = Истина;
Иначе
Значение = Ложь;
КонецЕсли;
Проанализируем ситуацию: при выгрузке механизм КД увидит, что поле источника пустое, но в обработчике переменной Значение присвоено конкретное содержимое. В итоге в XML-файле сформируется узел с именем свойства приемника и вашим значением.
В современных конфигурациях, работающих через универсальный формат EnterpriseData, логика обмена перенесена из визуальных правил в программный код общего модуля. Выясним причину, почему это удобнее: вы можете использовать всю мощь встроенного языка и контекстных подсказок среды разработки.
Для добавления реквизита выполним следующие действия:
МенеджерОбменаЧерезУниверсальныйФормат (или аналогичный в расширении).ПКО_Справочник_Номенклатура_Отправка_ПриОбработке.ДанныеXDTO, который представляет собой структуру будущего XML-сообщения.
// Добавление реквизита, которого нет в метаданных источника
// Предположим, приемнику нужно поле "ДополнительныйКод"
Если ДанныеXDTO.Свойства().Получить("ДополнительныйКод") <> Неопределено Тогда
ДанныеXDTO.ДополнительныйКод = "ED-999-XYZ";
КонецЕсли;
Важно: Если нужного реквизита нет в самой схеме формата EnterpriseData, вам сначала потребуется создать расширение XDTO-пакета в конфигурации и добавить это свойство в описание типа. Только после этого к нему можно будет обращаться через точку в коде менеджера обмена.
Если вы не используете сложные системы конвертации, а пишете выгрузку «руками», рассмотрим, как модифицировать процесс стандартной записи. Мы не можем заставить метод ЗаписатьXML(Запись, Объект) добавить лишнее поле, поэтому нам нужно комбинировать автоматическую запись с ручными вставками.
Проанализируем следующий алгоритм:
ЗаписьXML и открываем файл или строку.СериализаторXDTO для записи стандартных реквизитов или записываем их последовательно.
// Пример ручного добавления узла в XML
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Exchange\data.xml");
Запись.ЗаписатьНачалоЭлемента("CatalogObject.Номенклатура");
// Записываем стандартные реквизиты (упрощенно)
Запись.ЗаписатьНачалоЭлемента("Наименование");
Запись.ЗаписатьТекст(ОбъектИсточник.Наименование);
Запись.ЗаписатьКонецЭлемента();
// Добавляем наш "виртуальный" реквизит
Запись.ЗаписатьНачалоЭлемента("ВиртуальныйСтатус");
Запись.ЗаписатьТекст("Активен");
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Этот способ требует больше кода, но дает полный контроль над итоговой структурой файла. Посмотрим на альтернативу: можно выгрузить объект в структуру XDTOОбъект, добавить в коллекцию Свойства новый элемент и уже этот модифицированный XDTOОбъект отправить в ЗаписатьXML.
Если конфигурация построена на базе БСП (Библиотеки Стандартных Подсистем), рассмотрим наиболее «мирный» способ без существенного изменения программного кода. Вы можете добавить новое свойство через механизм «Дополнительные сведения».
Многие типовые правила обмена (особенно в КД 2.0) настроены так, что они автоматически перебирают набор дополнительных сведений объекта и выгружают их в XML. В этом случае задача программиста сводится к следующему:
Это позволит избежать правок в коде модуля обмена и сохранит поддержку конфигурации в типовом состоянии.
Подведем итоги нашего анализа:
МенеджерОбменаЧерезУниверсальныйФормат и объект ДанныеXDTO.ЗаписьXML для ручного формирования структуры.Выбор конкретного метода зависит от того, какой инструмент обмена уже внедрен в вашей системе. В любом случае, добавление реквизита при выгрузке — это стандартная операция, которая решается путем вмешательства в процесс формирования XML-узлов на этапе сериализации данных.