При настройке синхронизации данных между конфигурациями 1С (например, между Управление торговлей и взаимоотношениями с клиентами (CRM) и Бухгалтерия предприятия 3.0) часто возникает задача передать вместе с объектом дополнительные сведения. Если эти данные хранятся не в самом объекте (например, не в реквизитах справочника Номенклатура), а в отдельном регистре сведений, стандартных полей пакета XDTO EnterpriseData может не хватить. Рассмотрим, как решить эту проблему и правильно передать параметр в приемник.
В универсальном формате EnterpriseData предусмотрено специальное свойство AdditionalInfo (Дополнительная информация). Оно предназначено как раз для передачи пользовательских данных в виде структуры «Ключ — Значение», не изменяя при этом основную схему XDTO выгружаемого объекта.
Разберем процесс реализации по шагам:
Доработку выгрузки выполним в общем модуле МенеджерОбменаЧерезУниверсальныйФормат (или с помощью расширения конфигурации). В обработчике отправки элемента справочника, например ПКО_Справочник_Номенклатура_Отправка_ПриОтправкеДанных, извлечем значение из регистра сведений и добавим его в коллекцию AdditionalInfo.
Посмотрим на пример кода выгрузки:
// Извлекаем значение из регистра сведений по выгружаемой номенклатуре
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МойРегистрСведений.ЗначениеПараметра КАК ЗначениеПараметра
|ИЗ
| РегистрСведений.МойРегистрСведений КАК МойРегистрСведений
|ГДЕ
| МойРегистрСведений.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ДанныеИБ.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Заполняем узел AdditionalInfo
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("МойПараметрИзРегистра", Выборка.ЗначениеПараметра);
ДанныеXDTO.AdditionalInfo = ЗначениеВСтрокуВнур(СтруктураПараметров);
КонецЕсли;
В базе-приемнике в обработчике получения данных (например, ПКО_Справочник_Номенклатура_Получение_ПриПолученииДанных или ПослеЗагрузкиДанных) считываем значение из AdditionalInfo и записываем его в нужный реквизит номенклатуры.
Проанализируем пример кода загрузки:
Если ЗначениеЗаполнено(ДанныеXDTO.AdditionalInfo) Тогда
Попытка
СтруктураПараметров = ЗначениеИзСтрокиВнур(ДанныеXDTO.AdditionalInfo);
Если СтруктураПараметров.Свойство("МойПараметрИзРегистра") Тогда
ПолученныйОбъект.МойРеквизит = СтруктураПараметров.МойПараметрИзРегистра;
КонецЕсли;
Исключение
// Обработка ошибки чтения данных
КонецПопытки;
КонецЕсли;
Если передаваемое значение логически является доп. сведением или реквизитом объекта, можно воспользоваться стандартным механизмом БСП. Формат EnterpriseData из коробки умеет передавать коллекцию ДополнительныеРеквизиты, что избавит от необходимости вручную формировать узлы XML.
Если требуется передать сложную структурированную иерархию данных, можно создать расширение XDTO-пакета (на базе используемой версии, например EnterpriseData_1_2_1) и добавить в тип данных номенклатуры новое свойство. Этот способ более трудоемок, так как требует настройки правил в конфигурации «Конвертация данных 3.0».
При реализации обмена с передачей дополнительных параметров следует учитывать следующие особенности:
1. Типы данных в AdditionalInfo: Поле рассчитано на примитивные типы (строка, число, булево, дата) или сериализованные строки (JSON, XML, Внутренняя строка). Если из регистра требуется передать ссылку на объект (например, другой справочник), передавайте его Уникальный Идентификатор (UUID), ИНН или код в виде строки, а на стороне приемника выполняйте программный поиск через Справочники.ИмяСправочника.НайтиПо...().
2. Регистрация изменений на плане обмена: Обратите внимание, что изменение записей в регистре сведений автоматически не регистрирует связанную номенклатуру на плане обмена. Если значение в регистре изменилось, элемент номенклатуры не попадет в сеанс выгрузки. Для решения этой проблемы в модуле набора записей регистра сведений в событии ПриЗаписи вызовите метод ПланыОбмена.ЗарегистрироватьИзменения() для соответствующей номенклатуры.
3. Сохранение типовой конфигурации: Доработки алгоритмов выгрузки и загрузки в модуле МенеджерОбменаЧерезУниверсальныйФормат рекомендуется выполнять через **расширение конфигурации**, используя аннотации &После или &ИзменениеИКонтроль. Это позволит сохранить конфигурацию на типовой поддержке и существенно упростит последующие обновления.