diamond АШ Tlg

Как передавать и получать дополнительные данные при обмене через Универсальный формат 1С EnterpriseData

Краткая шпаргалка по доработке через расширение конфигурации 1С

Постановка задачи

В качестве примера пусть нам требуется при обмене справочником Пользователи передавать ссылку на подразделение пользователя. В формате обмена EnterpriseData 1.14 такое поле не предусмотрено:

Конвертация данных 3.1, снимок экрана

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

Способ решения

Форматы данных обмена описаны в объектах конфигурации 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(
                ДопДанные.Подразделение,
                Тип("СправочникСсылка.СтруктураПредприятия"),
                КомпонентыОбмена
            );		
            
            // здесь обрабатываем полученное значение, 
            // допустим у объекта есть поле "Подразделение:
            ПолученныеДанные.Подразделение = Подразделение;
            
        КонецЕсли;
    КонецЕсли;
    #КонецВставки
        
    // ... здесь вырезан типовой код 

КонецПроцедуры

Для отработки дополнительных действий при записи полученного объекта нужно вклиниться в процедуру с именем по шаблону ПКО_{имяобъекта}_ПередЗаписьюПолученныхДанных, в нашем случае это ПКО_Справочник_Пользователи_ПередЗаписьюПолученныхДанных