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