При настройке правил обмена в конфигурации Конвертация данных 2.1 часто возникает задача управления процессом поиска объектов. Стандартный механизм КД работает по жесткой логике: если в ПКО (Правилах Конвертации Объектов) настроены поля поиска, система в первую очередь обращается к ним. Однако бывают ситуации, когда логику требуется изменить, например: сначала выполнить поиск по полям, а если объект не найден — принудительно искать его по УникальномуИдентификатору. Давайте разберем, как реализовать такую схему программно.
В интерфейсе Конвертации данных есть возможность указать поля поиска, однако возможности гибко менять приоритет (сначала поля, потом УИД) декларативными методами не предусмотрено. Механизм КД пытается найти соответствие объекту, исходя из настроек в ПКО, и если вы не вмешаетесь в процесс, система будет следовать заложенному разработчиками алгоритму. Попытки задать СтрокаИменСвойствПоиска = \"{УникальныйИдентификатор}\" часто не приносят нужного результата, так как это не переопределяет порядок действий конвертации.
Единственный надежный способ управлять приоритетами — использование обработчика Перед поиском непосредственно в ПКО. В этом обработчике мы получаем полный контроль над процессом идентификации объекта.
Для решения нашей задачи выполним следующие шаги:
ОбъектНайден.УникальномуИдентификатору.Отказ = Истина, чтобы стандартный механизм поиска не выполнялся параллельно или после нашего кода.Рассмотрим, как это выглядит на практике. Внутри обработчика Перед поиском мы можем написать алгоритм, который проверяет наличие объекта сначала по ключевым полям, а затем, при необходимости, обращается к УИД источника.
// Принудительно отключаем стандартный поиск
Отказ = Истина;
// Шаг 1: Поиск по полям поиска
// Например, по реквизиту "Код" или "Артикул"
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Код = &Код";
Запрос.УстановитьПараметр("Код", Источник.Код);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
ОбъектНайден = Выборка.Ссылка;
Иначе
// Шаг 2: Поиск по УИД, если поля не дали результата
Если ЗначениеЗаполнено(ВходящиеДанные.УникальныйИдентификатор) Тогда
УИД = Новый УникальныйИдентификатор(ВходящиеДанные.УникальныйИдентификатор);
ОбъектНайден = Справочники.Номенклатура.ПолучитьСсылку(УИД);
// Проверяем, существует ли объект с таким УИД в базе
Если ОбъектНайден.Пустая() ИЛИ НЕ ОбъектНайден.ПолучитьОбъект() = Неопределено Тогда
// Если объект не найден, логика может завершиться или создать новый
КонецЕсли;
КонецЕсли;
КонецЕсли;
При реализации собственного алгоритма поиска важно учитывать несколько аспектов:
ПолучитьСсылку(УИД) сработал, УникальныйИдентификатор должен быть корректно передан из системы-источника. Убедитесь, что в правилах обмена для соответствующего ПКО настроена передача УникальногоИдентификатора.Отказ = Истина — это обязательное условие. Если вы забудете установить этот флаг, Конвертация данных после выполнения вашего кода попробует выполнить поиск согласно настройкам в ПКО, что приведет к дублированию действий или ошибкам.ПКО установлен флаг Не создавать новый объект при отсутствии найденного, либо обработайте эту ситуацию программно, если объект не был найден ни по полям, ни по УИД.Таким образом, использование обработчика Перед поиском является наиболее гибким и мощным инструментом в Конвертации данных. Этот подход позволяет реализовать любую, даже самую сложную цепочку поиска, учитывающую приоритеты, специфические условия и бизнес-логику вашей учетной системы.