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