Как настроить поиск и создание новых объектов в конфигурации «Конвертация данных 2.1»?

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

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

Логика работы стандартных флагов сопоставления в ПКО

В настройках правила конвертации объекта (ПКО) на вкладке «Настройки» расположены ключевые флаги, управляющие идентификацией:

  1. Искать объект приемника по внутреннему идентификатору — система сопоставляет объект по его уникальному идентификатору (GUID) источника. Если объект с таким GUID уже есть в приемнике, он считается найденным.
  2. Продолжить поиск по полям поиска, если по идентификатору объект не найден — поиск по полям поиска инициируется только тогда, когда поиск по GUID не дал результата.
  3. Не замещать существующие объекты в приемнике при загрузке, а только создавать новые и заполнять их — если объект найден (по GUID или по полям поиска), его реквизиты в приемнике не перезаписываются данными из файла обмена.

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

Отключение поиска по внутреннему идентификатору

Если сопоставление данных должно выполняться строго по определенным реквизитам (например, по наименованию, коду ЕГАИС, артикулу или ИНН), необходимо отключить сопоставление по GUID. Для этого в настройках ПКО снимем флаг «Искать объект приемника по внутреннему идентификатору». В этом случае поиск будет выполняться исключительно по свойствам, для которых в ПКС отмечен флаг «Поиск», либо по логике, описанной в обработчике ПоляПоиска.

Где и как заполнять значения для полей поиска в ПКС

Для корректного формирования коллекций поиска важно учитывать порядок выполнения событий при выгрузке данных:

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

Посмотрим на пример выборки кода из регистра сведений в обработчике ПередВыгрузкой свойства КодНоменклатурыЕГАИС:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Соответствие.АлкогольнаяПродукция.Код КАК КодЕГАИС
    |ИЗ
    |    РегистрСведений.СоответствиеНоменклатурыЕГАИС КАК Соответствие
    |ГДЕ
    |    Соответствие.Номенклатура = &Номенклатура
    |    И Соответствие.Номенклатура.ЭтоГруппа = ЛОЖЬ";

Запрос.УстановитьПараметр("Номенклатура", Источник);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    Значение = СокрЛП(Выборка.КодЕГАИС);
КонецЕсли;

Многовариантный программный поиск в обработчике «ПоляПоиска»

Когда требуется реализовать сложный или ступенчатый алгоритм поиска (например: сначала ищем соответствие по внешнему регистру, а если не нашли — выполняем стандартный поиск по наименованию и реквизитам), используется обработчик ПКО «Поля поиска».

Рассмотрим структуру управления вариантами поиска с использованием переменной НомерВариантаПоиска:


Если НомерВариантаПоиска = 1 Тогда
    // Вариант 1: прямой запрос к регистру сведений в базе-приемнике
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Соответствие.Номенклатура КАК Ссылка
        |ИЗ
        |    РегистрСведений.СоответствиеНоменклатурыЕГАИС КАК Соответствие
        |ГДЕ
        |    Соответствие.АлкогольнаяПродукция.Код = &КодЕГАИС";
        
    Запрос.УстановитьПараметр("КодЕГАИС", СвойстваПоиска["КодНоменклатурыЕГАИС"]);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        СсылкаНаОбъект = Выборка.Ссылка;
        ПрекратитьПоиск = Истина;
    КонецЕсли;

ИначеЕсли НомерВариантаПоиска = 2 Тогда
    // Вариант 2: сопоставление по стандартным реквизитам справочника
    Если СвойстваПоиска["АлкогольнаяПродукция"] = Истина Тогда
        СтрокаИменСвойствПоиска = "Наименование, ЭтоГруппа, Емкость, Крепость";
    Иначе
        СтрокаИменСвойствПоиска = "Наименование, ЭтоГруппа";
    КонецЕсли;
КонецЕсли;

Правила управления переменными в обработчике «ПоляПоиска»

При написании логики поиска важно контролировать значения системных переменных:

  1. СсылкаНаОбъект — если объект найден прямым запросом, переменной присваивается найденная ссылка. Важно: нельзя присваивать пустую ссылку (Справочники.Номенклатура.ПустаяСсылка()). Если переменная не равна Неопределено, алгоритм считает, что объект существует, и создание нового элемента отменяется.
  2. ПрекратитьПоиск — установка в значение Истина прерывает дальнейшие итерации поиска. Если при этом СсылкаНаОбъект осталась равной Неопределено, система сразу переходит к созданию нового объекта.
  3. СтрокаИменСвойствПоиска — содержит список имен реквизитов объекта-приемника через запятую. Поиск по этой строке работает только для реквизитов, физически существующих в метаданных справочника-приемника.
  4. НеСоздаватьНовыйОбъект — если в коде или настройках ПКО данный флаг установлен в Истина, при отсутствии найденной ссылки объект создан не будет. Для создания новых элементов флаг должен иметь значение Ложь.
← На главную