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

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При настройке и доработке правил обмена между конфигурациями 1С (например, при переносе данных из отраслевой конфигурации в типовую бухгалтерию) разработчики часто сталкиваются с дублированием элементов справочников или некорректным сопоставлением аналитики. Рассмотрим причины этих ошибок, разберем по шагам механизмы сопоставления объектов в «1С:Конвертация данных» и выясним, как настроить гибкий каскадный поиск.

Причины возникновения дублей и ошибок сопоставления

Проанализируем основные факторы, приводящие к созданию лишних записей в базе-приемнике:

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

Реализация каскадного поиска в «Конвертации данных 2.1»

В типовой логике КД 2.1 сопоставление по нескольким полям поиска в правилах конвертации свойств (ПКС) работает через логическое «И». Однако на практике часто требуется реализовать логическое «ИЛИ» (каскадный поиск): например, сначала найти контрагента по БИН/ИНН, а если код не заполнен или объект не найден — выполнить поиск по наименованию, и только при отсутствии совпадений создавать новый элемент.

Для реализации такой логики перейдем в Правило конвертации объекта (ПКО) и откроем обработчик события ПоляПоиска. Рассмотрим два способа настройки.

Способ 1: Управление шагами поиска через НомерОшибки

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


Если НомерОшибки = 1 Тогда
    // Первый шаг: проверяем заполненность БИН/ИНН
    Если ЗначениеЗаполнено(СвойстваПоиска["БИН"]) Тогда
        СтрокаИменСвойствПоиска = "БИН";
    Иначе
        // Если реквизит пуст, сразу переходим к поиску по наименованию
        СтрокаИменСвойствПоиска = "Наименование";
    КонецЕсли;
ИначеЕсли НомерОшибки = 2 Тогда
    // Второй шаг: если по БИН объект не найден, пробуем найти по наименованию
    СтрокаИменСвойствПоиска = "Наименование";
КонецЕсли;

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

Способ 2: Прямой поиск через запрос в обработчике

Для более сложной логики (с очисткой строк, проверкой нескольких условий и контролем дублей) реализуем поиск с помощью прямого запроса к базе-приемнику. Если ссылка найдена, мы присваиваем ее параметру СсылкаНаОбъект и прерываем стандартный поиск с помощью флага ПрекратитьПоиск.

Посмотрим на пример программной реализации:


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

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

// 3. Если совпадений нет, оставляем СсылкаНаОбъект пустым для создания нового элемента

Отладка правил и тестирование алгоритмов

Для проверки корректности работы написанных обработчиков и поиска скрытых ошибок выполним следующие действия:

  1. Использование режима отладки выгрузки/загрузки: В обработке УниверсальныйОбменДаннымиXML.epf перейдем на вкладку отладки и выгрузим сгенерированный код обработчиков в модуль внешней обработки. Это позволит установить точку останова в конфигураторе приемника и пошагово отследить выполнение поиска для каждого объекта.
  2. Контроль дублей: В обработчиках поиска всегда проверяем параметр КоличествоДублей или ограничиваем выборку в запросе (ВЫБРАТЬ ПЕРВЫЕ 2). Если запрос возвращает более одного элемента с одинаковыми реквизитами, сопоставление с произвольной ссылкой может нарушить учет. В таких случаях рекомендуется логировать коллизии.

Рекомендации по выстраиванию архитектуры обмена

Чтобы минимизировать риски рассинхронизации данных, учтем ключевые правила разработки обменов:

  1. Разделение этапов переноса: Сначала выгружаем и сопоставляем нормативно-справочную информацию (организации, контрагенты, номенклатура, договоры). Только после того как справочники выверены, переходим к выгрузке документов. Это исключит образование битых ссылок при проведении документов.
  2. Защита от зацикливания регистрации: При настройке двустороннего обмена необходимо проверять признак загрузки данных (ОбменДанными.Загрузка = Истина) в подписках на события, чтобы загруженные данные не регистрировались повторно на узлах планов обмена для обратной отправки.
← На главную