При настройке правил обмена в конфигурации «1С:Конвертация данных 2.0» (КД 2) часто возникает задача заполнить реквизит объекта-приемника ссылкой на предопределенное значение справочника или плана видов характеристик. Если в источнике данных такого элемента нет (например, выгрузка выполняется из версии 7.7 или из нетиповой структуры 8.x), прямое сопоставление по ссылке или коду невозможно. Рассмотрим подробнее, какими способами можно передать предопределенные данные и как правильно работать со свойствами составного типа.
Самый простой и эффективный способ сопоставления предопределенного элемента в правиле конвертации свойств (ПКС) — передать в обработчике «Перед выгрузкой» строковое имя (идентификатор) предопределенного элемента базы-приемника.
Разберем по шагам, как это работает:
Значение = "ТелефонКонтрагента";
При загрузке данных стандартные механизмы КД 2 обращаются к менеджеру соответствующего объекта метаданных и находят ссылку по указанному системному имени. Это избавляет от необходимости писать тяжелые поисковые запросы.
Проанализируем ситуацию, когда свойство в базе-приемнике имеет составной тип данных (например, измерение Вид в регистре сведений КонтактнаяИнформация, где разрешены типы Строка и СправочникСсылка.ВидыКонтактнойИнформации).
Если в такое поле просто передать строковое имя "ТелефонКонтрагента", платформа не сможет определить, что требуется именно поиск ссылки, и запишет в измерение обычную строку. Чтобы принудительно указать тип сопоставляемого объекта, используем предопределенную переменную ТипПриемника:
Значение = "ТелефонКонтрагента";
ТипПриемника = "СправочникСсылка.ВидыКонтактнойИнформации";
Параметр ТипПриемника указывает механизму загрузки, к какому типу метаданных нужно привести значение. Для простых типов он заполняется платформой автоматически, а для составных его необходимо определять разработчику.
Если база-источник не содержит нужной логики или выгрузка выполняется из устаревших версий (например, 1С 7.7), можно вычислить значение непосредственно при загрузке на стороне приемника. Для этого в строке ПКС заполняется поле «Выражение»:
Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента
Код из поля «Выражение» компилируется и выполняется в базе-приемнике в момент присвоения значения свойству, минуя этап сериализации в файл выгрузки.
Посмотрим на пример комплексной обработки, когда в зависимости от условий источника требуется применять разные правила конвертации объектов (ПКО) или передавать строковые и ссылочные значения:
Структура = Новый Структура("ОбъектКИ", Источник.Объект);
ИсходящиеДанные = Структура;
Значение = "";
ИмяПКО = "";
Если ТипЗнч(Источник.Вид) = "Строка" Тогда
Значение = СокрЛП(Источник.Вид);
ИначеЕсли Источник.Вид = Справочники.ВидыКонтактнойИнформации.ПрочаяИнформация Тогда
Значение = "Прочая информация";
ИначеЕсли Источник.Вид.Предопределенный Тогда
Если ТипЗнч(Источник.Объект) = Тип("СправочникСсылка.Контрагенты") Тогда
ИмяПКО = "ВидыКонтактнойИнформацииКонтрагенты";
ИначеЕсли ТипЗнч(Источник.Объект) = Тип("СправочникСсылка.Организации") Тогда
ИмяПКО = "ВидыКонтактнойИнформацииОрганизации";
Иначе
ИмяПКО = "ВидыКонтактнойИнформации";
КонецЕсли;
Иначе
ИмяПКО = "ВидыКонтактнойИнформации";
КонецЕсли;
Выясним причину, по которой могут возникать ошибки при ручном поиске. Если имя предопределенного значения передается динамически, его можно перехватить в обработчике «Поля поиска» соответствующего ПКО:
СвойстваПоиска.Вставить("ИмяПредопределенныхДанных", "ТелефонКонтрагента");
Важная рекомендация: при сопоставлении с предопределенными элементами обязательно устанавливайте в ПКО флаг «Не создавать новый объект, если он не найден». Это защитит информационную базу приемника от появления пустых дублирующих элементов, если в имени предопределенного значения была допущена опечатка.