Как правильно настроить поиск и обновление объектов через ПоляПоиска в Конвертации данных

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

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

Разберем детально, как работают флаги сопоставления в правилах конвертации объектов (ПКО), как устроен вызов обработчика ПоляПоиска и как программно переопределить алгоритм сопоставления.

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

В настройках ПКО на вкладке «Настройки поиска» ключевую роль играют флаги сопоставления. Рассмотрим варианты их поведения:

  1. Установлен флаг «Искать по внутреннему идентификатору (GUID)»: при загрузке механизм конвертации пытается найти объект в базе-приемнике по уникальному идентификатору источника. Если объект с таким идентификатором найден, сопоставление завершается. Если не найден — создается новый элемент.
  2. Установлены оба флага («Искать по внутреннему идентификатору» и «Продолжить поиск по полям поиска, если не найден по идентификатору»): сначала поиск выполняется по GUID. Если элемент не обнаружен, механизм переходит к поиску по реквизитам, отмеченным в правилах конвертации свойств (ПКС) как поля поиска. Если и по ним ничего не найдено — создается новый элемент.
  3. Снят флаг «Искать по внутреннему идентификатору»: поиск по GUID полностью отключается. Загрузка сразу переходит к этапу поиска по полям поиска. Даже если второй флаг становится недоступен визуально, сопоставление по полям поиска и вызов обработчика ПоляПоиска выполняются всегда. Если соответствие не найдено, создается новый объект.

Таким образом, когда данные для объекта передаются вручную через ВходящиеДанные и у него нет прямого соответствия по GUID источника, флаг поиска по идентификатору необходимо снять. Это гарантирует вызов механизма поиска по полям.

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

Обработчик событий ПоляПоиска выполняется на стороне базы-приемника перед непосредственным поиском объекта. В нем доступны предопределенные переменные:

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

Посмотрим на пример реализации собственного поиска. Предположим, во входящих данных наименование содержит суффикс "(головное предприятие)", а в базе-приемнике элемент записан без него. Напишем код поиска в обработчике ПоляПоиска:


// Очищаем переданное наименование от суффикса для поиска в приемнике
ИскомоеНаименование = СтрЗаменить(СвойстваПоиска.Наименование, " (головное предприятие)", "");
ИскомоеНаименование = СокрЛП(ИскомоеНаименование);

// Выполняем поиск по очищенному значению
НайденнаяСсылка = Справочники.Партнеры.НайтиПоНаименованию(ИскомоеНаименование, Истина);

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

Обновление реквизитов найденного объекта

После того как объект успешно найден в базе-приемнике, встает вопрос обновления его наименования (добавления суффикса). Для этого можно применить один из двух подходов:

  1. Штатное замещение через ПКС: если в ПКО отключен флаг «Не замещать существующие объекты», а в ПКС для свойства Наименование не стоит признак запрета перезаписи, платформа автоматически применит новое значение наименования (с суффиксом) к найденному объекту и запишет его при загрузке.
  2. Программное изменение в обработчике «ПриЗагрузке»: если изменение реквизита требует дополнительных условий, модификацию выполняют в обработчике ПриЗагрузке ПКО. В этом событии доступен объект базы-приемника через переменную Объект. Метод Объект.Записать() вызывать не требуется, так как запись выполняется конвейером загрузки КД:

Если Не Объект.ЭтоНовый() Тогда
    Если Найти(Объект.Наименование, "(головное предприятие)") = 0 Тогда
        Объект.Наименование = СокрЛП(Объект.Наименование) + " (головное предприятие)";
    КонецЕсли;
КонецЕсли;

Особенности и нюансы сопоставления в КД

Разберем важные технические моменты, которые необходимо учитывать при работе с полями поиска:

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