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