Как в КД 2.1 сопоставить обычные элементы источника с предопределенными элементами приемника по комбинации реквизитов?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При переносе данных между различными конфигурациями 1С часто возникает задача сопоставления справочников с разной структурой. Рассмотрим типовую ситуацию: в базе-источнике в справочнике отсутствуют предопределенные элементы, но есть два текстовых реквизита, определенная комбинация которых однозначно указывает на соответствующий предопределенный элемент справочника в базе-приемнике. Разберем основные способы реализации такого сопоставления в конфигурации «Конвертация данных 2.1» (КД 2.1).

Способ 1. Установка предопределенного имени в обработчике «При выгрузке» (ПКО)

Если мы можем однозначно определить имя предопределенного элемента еще на стороне источника, то наиболее простым и лаконичным решением будет использование штатного механизма КД 2.1. В правиле конвертации объектов (ПКО) предусмотрена системная переменная ИмяПредопределенного.

Разберем по шагам, как настроить этот вариант:

  1. Откроем нужное ПКО для конвертации справочника.
  2. Перейдем на вкладку Обработчики событий и выберем событие «При выгрузке».
  3. Проанализируем значения реквизитов объекта-источника и присвоим системной переменной ИмяПредопределенного строковое имя предопределенного элемента приемника.

Посмотрим на пример кода в обработчике «При выгрузке»:


Если Источник.Реквизит1 = "Опт" И Источник.Реквизит2 = "Безналичный" Тогда
    ИмяПредопределенного = "ОптоваяБезналичная";
ИначеЕсли Источник.Реквизит1 = "Розница" И Источник.Реквизит2 = "Наличный" Тогда
    ИмяПредопределенного = "РозничнаяНаличная";
КонецЕсли;

При таком подходе обработка выгрузки сама добавит в XML специальный узел с именем предопределенного элемента. База-приемник при загрузке автоматически выполнит сопоставление по имени без необходимости ручной настройки полей поиска.

Способ 2. Передача параметров и обработчик «Поля поиска» на стороне приемника

В ситуациях, когда сопоставление логичнее производить на стороне приемника (например, логика зависит от настроек или метаданных целевой базы), воспользуемся связкой из параметров объекта и обработчика «Поля поиска».

Разберем алгоритм настройки:

  1. В ПКО на вкладке Настройки конвертации свойств добавим два параметра (например, ПарамРеквизит1 и ПарамРеквизит2) и включим для них флаг Передавать в параметры.
  2. В обработчике «Перед выгрузкой» для этих свойств передадим значения текстовых реквизитов источника.
  3. В ПКО откроем обработчик «Поля поиска» (выполняется на стороне приемника).
  4. Вычислим имя предопределенного элемента и напрямую присвоим ссылку переменной СсылкаНаОбъект.

Посмотрим на пример заполнения обработчика «Поля поиска»:


Если ПараметрыОбъекта <> Неопределено Тогда
    Значение1 = "";
    Значение2 = "";
    ПараметрыОбъекта.Свойство("ПарамРеквизит1", Значение1);
    ПараметрыОбъекта.Свойство("ПарамРеквизит2", Значение2);

    ИмяПредопределенного = "";
    Если Значение1 = "Опт" И Значение2 = "Безналичный" Тогда
        ИмяПредопределенного = "ОптоваяБезналичная";
    ИначеЕсли Значение1 = "Розница" И Значение2 = "Наличный" Тогда
        ИмяПредопределенного = "РозничнаяНаличная";
    КонецЕсли;

    Если ЗначениеЗаполнено(ИмяПредопределенного) Тогда
        Попытка
            СсылкаНаОбъект = ПредопределенноеЗначение("Справочник.Справочник_2." + ИмяПредопределенного);
        Исключение
            СсылкаНаОбъект = Неопределено;
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

Как только переменная СсылкаНаОбъект оказывается заполненной, алгоритм КД 2.1 прекращает дальнейшие попытки поиска по стандартным полям и использует найденный элемент для дальнейшей загрузки реквизитов.

Способ 3. Оптимизация через таблицу соответствий

Если комбинаций реквизитов много, условия Если ... ИначеЕсли перегружают код. В таком случае целесообразно сформировать таблицу соответствий.

Рассмотрим пример инициализации структуры соответствий в обработчике «Перед выгрузкой данных»:


ТаблицаСоответствий = Новый Соответствие;
ТаблицаСоответствий.Вставить("Опт_Безналичный", "ОптоваяБезналичная");
ТаблицаСоответствий.Вставить("Розница_Наличный", "РозничнаяНаличная");
Параметры.Вставить("СоответствияЭлементов", ТаблицаСоответствий);

Тогда в обработчике ПКО «При выгрузке» поиск нужного имени сводится к одной строке:


КлючПоиска = СокрЛП(Источник.Реквизит1) + "_" + СокрЛП(Источник.Реквизит2);
НайденноеИмя = Параметры.СоответствияЭлементов[КлючПоиска];

Если НайденноеИмя <> Неопределено Тогда
    ИмяПредопределенного = НайденноеИмя;
КонецЕсли;

Важные ограничения и защита от создания дубликатов

Проанализируем критические особенности платформы 1С при работе с предопределенными данными:

  1. Защита от дублей: Если соответствие не найдено, КД 2.1 по умолчанию попытается создать новый элемент в базе-приемнике. Однако платформа 1С:Предприятие не позволяет обычному элементу стать предопределенным программно при обычной записи объекта. Будет создан некорректный дубликат. Чтобы предотвратить запись при отсутствии соответствия, в обработчике «При загрузке» или «Поля поиска» следует устанавливать Отказ = Истина;.
  2. Безопасное обращение: Обращение вида Справочники.Справочник_2[Имя] или прямое обращение через точку вызовет исключение, если элемент с таким именем отсутствует в конфигурации приемника. Всегда используйте функцию ПредопределенноеЗначение() внутри конструкции Попытка ... Исключение.
← На главную