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