Как передавать и получать дополнительные данные при обмене через Универсальный формат 1С EnterpriseData
Постановка задачи
В качестве примера пусть нам требуется при обмене справочником Пользователи передавать ссылку на подразделение пользователя. В формате обмена EnterpriseData 1.14 такое поле не предусмотрено:
По условию задачи обе конфигурации, участвующие в обмене, находятся на поддержке, все доработки делать в расширении.
Способ решения
Форматы данных обмена описаны в объектах конфигурации XDTO-пакеты, поэтому "в лоб" модифицировать мы их в расширении не можем (такая возможность запланирована в версии 8.3.26). И вообще, это плохая практика. Вместо этого, используем поле AdditionalInfo, передающееся с каждым объектом в составе пакета обмена, в которое можно записать произвольные данные.
Доработка базы-источника
Находим общий модуль Менеджер обмена через универсальный формат. В нём нужно поиском найти процедуру с именем по шаблону ПКО_{имя объекта}_ПриОтправкеДанных. Для нашей задачи это будет процедура ПКО_Справочник_Пользователи_ПриОтправкеДанных. Заимствуем его в новое расширение, с типом вызова "Изменение и контроль". Такой тип вызова рекомендую использовать при начале работы с обменами для облегчения чтения тела процедуры (типовой модуль очень огромный!), в дальнейшем надо будет переделать на вызовы типа "После" или "Перед".
В конце процедуры сделаем вставку кода:
&ИзменениеИКонтроль("ПКО_Справочник_Пользователи_ПриОтправкеДанных")
Процедура лс_ПКО_Справочник_Пользователи_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
// здесь вырезан типовой код
#Вставка
// Подразделение пользователя
Если ЗначениеЗаполнено(ДанныеИБ.Подразделение) Тогда
расш_ДобавитьДополнительныеДанные(
ДанныеXDTO,
"Подразделение",
Строка(ДанныеИБ.Подразделение.УникальныйИдентификатор())
);
КонецЕсли;
#КонецВставки
КонецПроцедуры
Логику вставки требуемых данных напишем в отдельной новой процедуре, для облегчения дальнейшей поддержки:
Процедура расш_ДобавитьДополнительныеДанные(
ДанныеXDTO, Имя, ДопЗначение) Экспорт
Если ДанныеXDTO.Свойство("AdditionalInfo")
И ТипЗнч(ДанныеXDTO.AdditionalInfo)=Тип("Структура") Тогда
ДопДанные = ДанныеXDTO.AdditionalInfo;
Иначе
ДопДанные = Новый Структура;
КонецЕсли;
ДопДанные.Вставить(Имя, ДопЗначение);
ДанныеXDTO.Вставить("AdditionalInfo", ДопДанные);
КонецПроцедуры
Доработка базы-приёмника
Аналогично как в базе-источнике находим общий модуль Менеджер обмена через универсальный формат. В нём нужно поиском найти процедуру с именем по шаблону ПКО_{имя объекта}_ПриКонвертацииДанныхXDTO. Для нашей задачи это будет процедура ПКО_Справочник_Пользователи_ПриКонвертацииДанныхXDTO. Заимствуем его также в новое расширение, с типом вызова "Изменение и контроль".
В начале процедуры сделаем вставку кода:
&ИзменениеИКонтроль("ПКО_Справочник_Пользователи_ПриКонвертацииДанныхXDTO")
Процедура расш_ПКО_Справочник_Пользователи_ПриКонвертацииДанныхXDTO(
ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена)
#Вставка
Если ДанныеXDTO.Свойство("AdditionalInfo")
И ТипЗнч(ДанныеXDTO.AdditionalInfo)=Тип("Структура") Тогда
ДопДанные = ДанныеXDTO.AdditionalInfo;
Если ДопДанные.Свойство("Подразделение") Тогда
Подразделение = ОбменДаннымиXDTOСервер.СсылкаОбъектаПоУИДОбъектаXDTO(
ДопДанные.Подразделение,
Тип("СправочникСсылка.СтруктураПредприятия"),
КомпонентыОбмена
);
// здесь обрабатываем полученное значение,
// допустим у объекта есть поле "Подразделение:
ПолученныеДанные.Подразделение = Подразделение;
КонецЕсли;
КонецЕсли;
#КонецВставки
// ... здесь вырезан типовой код
КонецПроцедуры
Для отработки дополнительных действий при записи полученного объекта нужно вклиниться в процедуру с именем по шаблону ПКО_{имяобъекта}_ПередЗаписьюПолученныхДанных, в нашем случае это ПКО_Справочник_Пользователи_ПередЗаписьюПолученныхДанных