При настройке правил обмена в конфигурации «Конвертация данных 2.1» (КД 2.1) часто возникает задача сопоставления реквизитов разных структур: например, в базе-источнике значение хранятся в общем реквизите конфигурации, а в базе-приемнике — в реквизите конкретного документа. При добавлении нового Правила Конвертации Свойства (ПКС) разработчик может обнаружить, что нужного общего реквизита нет в списке доступных полей источника.
Рассмотрим подробно причины возникновения этой проблемы и разберем несколько проверенных способов решения.
Проанализируем основные факторы, из-за которых общий реквизит не показывается при создании ПКС:
Не использовать), данный реквизит не привязывается к метаданным этого объекта.MD82Exp.epf вместо MD83Exp.epf) может вызывать сбои при выгрузке состава общих реквизитов.Первым делом проверим и обновим структуру метаданных конфигураций. Выполним следующие шаги:
MD83Exp.epf).Если обновленная структура метаданных загружена, но общий реквизит по-прежнему не отображается в списке полей выбора источника, организуем выгрузку программно прямо из объекта-источника.
Разберем порядок действий:
<Не выгружать источник>).
Значение = Источник.ИмяОбщегоРеквизита;
Важно: если передаваемый реквизит имеет ссылочный тип, в свойствах созданного ПКС обязательно нужно указать соответствующее Правило Конвертации Объектов (ПКО) для этого типа данных.
Рассмотрим альтернативный вариант, когда передачу значения нужно выполнить через структуру ИсходящиеДанные или передать в ПараметрыОбъекта с последующим заполнением на стороне приемника.
Шаг 1. В ПКО документа в обработчике Перед выгрузкой передадим значение общего реквизита в структуру исходящих данных:
Если ИсходящиеДанные = Неопределено Тогда
ИсходящиеДанные = Новый Структура;
КонецЕсли;
ИсходящиеДанные.Вставить("ИмяПараметра", Источник.ИмяОбщегоРеквизита);
Шаг 2. Создадим ПКС без источника, активируем флаг Передавать данные в параметр и укажем имя параметра (например, ИмяПараметра).
Шаг 3. В ПКО документа в обработчике события После загрузки на стороне приемника прочитаем полученный параметр и запишем его в реквизит объекта:
Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта.Свойство("ИмяПараметра") Тогда
Объект.ИмяРеквизитаПриемника = ПараметрыОбъекта.Получить("ИмяПараметра");
КонецЕсли;
Таким образом, мы можем успешно переносить данные из общих реквизитов как штатными средствами сопоставления после обновления метаданных, так и с помощью гибких программных обработчиков в Конвертации данных 2.1.