Как изменить приоритет поиска в 1С:Конвертация данных: сначала по полям, затем по идентификатору?

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

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

Почему стандартных настроек недостаточно?

В интерфейсе Конвертации данных есть возможность указать поля поиска, однако возможности гибко менять приоритет (сначала поля, потом УИД) декларативными методами не предусмотрено. Механизм КД пытается найти соответствие объекту, исходя из настроек в ПКО, и если вы не вмешаетесь в процесс, система будет следовать заложенному разработчиками алгоритму. Попытки задать СтрокаИменСвойствПоиска = \"{УникальныйИдентификатор}\" часто не приносят нужного результата, так как это не переопределяет порядок действий конвертации.

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

Единственный надежный способ управлять приоритетами — использование обработчика Перед поиском непосредственно в ПКО. В этом обработчике мы получаем полный контроль над процессом идентификации объекта.

Для решения нашей задачи выполним следующие шаги:

  1. Перехватим управление поиском с помощью параметра ОбъектНайден.
  2. Реализуем поиск по нашим полям.
  3. Если объект не найден, перейдем к поиску по УникальномуИдентификатору.
  4. Установим флаг Отказ = Истина, чтобы стандартный механизм поиска не выполнялся параллельно или после нашего кода.

Разбираем пример реализации кода

Рассмотрим, как это выглядит на практике. Внутри обработчика Перед поиском мы можем написать алгоритм, который проверяет наличие объекта сначала по ключевым полям, а затем, при необходимости, обращается к УИД источника.


// Принудительно отключаем стандартный поиск
Отказ = Истина;

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

Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    ОбъектНайден = Выборка.Ссылка;
Иначе
    // Шаг 2: Поиск по УИД, если поля не дали результата
    Если ЗначениеЗаполнено(ВходящиеДанные.УникальныйИдентификатор) Тогда
        УИД = Новый УникальныйИдентификатор(ВходящиеДанные.УникальныйИдентификатор);
        ОбъектНайден = Справочники.Номенклатура.ПолучитьСсылку(УИД);
        
        // Проверяем, существует ли объект с таким УИД в базе
        Если ОбъектНайден.Пустая() ИЛИ НЕ ОбъектНайден.ПолучитьОбъект() = Неопределено Тогда
            // Если объект не найден, логика может завершиться или создать новый
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Важные нюансы при настройке поиска

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

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

← На главную