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

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

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

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

Выясним причину поведения платформы

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

Чтобы заставить алгоритм продолжить проверку по заданным ключевым реквизитам, необходимо задействовать штатные настройки переключения или написать логику в специализированном обработчике.

Способ 1. Штатная настройка правил конвертации

Рассмотрим стандартный способ настройки сопоставления без написания программного кода. Для этого выполним несколько последовательных шагов в конфигурации «Конвертация данных 2.1»:

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

При такой настройке система сначала проверит соответствие по идентификатору, и только при его отсутствии начнет искать автомобиль по полю VIN.

Способ 2. Управление полями поиска в обработчике

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

Чтобы избежать ошибок и выполнять поиск по реквизиту строго при наличии в нем значения, настроим обработчик «Поля поиска» в ПКО. Этот обработчик выполняется на стороне базы-приемника перед непосредственным сопоставлением объекта. Посмотрим на пример кода:


Если НомерВариантаПоиска = 1 Тогда
    Если ЗначениеЗаполнено(СвойстваПоиска["VIN"]) Тогда
        СтрокаИменСвойствПоиска = "VIN";
    Иначе
        // Если VIN не заполнен, прекращаем поиск по реквизитам и создаем новый объект
        ПрекратитьПоиск = Истина;
    КонецЕсли;
КонецЕсли;

Разберем, как работает данный фрагмент: параметр СвойстваПоиска представляет собой соответствие со значениями полей, переданными из источника. Если значение заполнено, переменной СтрокаИменСвойствПоиска явно назначается имя реквизита для отбора. Если же реквизит пуст, переменная ПрекратитьПоиск устанавливается в значение Истина, благодаря чему сопоставление с пустыми элементами блокируется.

Способ 3. Произвольный поиск запросом в обработчике «Поля поиска»

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


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

При заполнении системной переменной СсылкаНаОбъект и установке флага ПрекратитьПоиск = Истина система связывает входящие данные именно с этой ссылкой и прекращает дальнейшие стандартные алгоритмы поиска.

Важные особенности синхронизации и ограничения

Обратим внимание на ключевые нюансы работы платформы, о которых необходимо помнить при настройке:

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