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

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

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

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

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

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

Способ 1. Динамическое управление полями сопоставления в обработчике «Поля поиска»

Наиболее гибким решением в рамках одного ПКО является переопределение полей поиска в зависимости от того, что именно загружается — папка или элемент. Для этого перейдем в правило конвертации объекта Контрагенты на закладку Поля поиска.

В свойствах поиска (ПКС) предварительно установим флаги Поиск для реквизитов: ЭтоГруппа, Код, Наименование, ИНН (или ИдентификационныйКодЛичности). В самом ПКО включим флаги Искать объект приемника по внутреннему идентификатору и Продолжить поиск по полям поиска, если по идентификатору объект не найден.

В обработчике Поля поиска напишем следующий алгоритм:


Если СвойстваПоиска["ЭтоГруппа"] Тогда
    // Для групп выполняем поиск по признаку группы, коду и наименованию
    СтрокаИменСвойствПоиска = "ЭтоГруппа, Код, Наименование";
ИначеЕсли ЗначениеЗаполнено(СвойстваПоиска["ИНН"]) Тогда
    // Для элементов с заполненным ИНН ищем по признаку группы и налоговому номеру
    СтрокаИменСвойствПоиска = "ЭтоГруппа, ИНН";
ИначеЕсли ЗначениеЗаполнено(СвойстваПоиска["Наименование"]) Тогда
    // Если ИНН не заполнен, ищем по наименованию и коду
    СтрокаИменСвойствПоиска = "ЭтоГруппа, Наименование, Код";
Иначе
    // Если ключевые реквизиты не заполнены, прерываем стандартный поиск
    ПрекратитьПоиск = Истина;
КонецЕсли;

Разберем работу данного кода: системная переменная СтрокаИменСвойствПоиска принимает список свойств через запятую, по которым механизм КД 2.1 формирует запрос к базе-приемнику. Обязательное включение ЭтоГруппа гарантирует, что группа никогда не сопоставится с элементом, даже если их наименования совпадают.

Способ 2. Разделение конвертации на два независимых ПКО (для групп и элементов)

Если логика сопоставления элементов и папок существенно различается, архитектурно правильнее создать два отдельных ПКО: например, Контрагенты_Элементы и Контрагенты_Группы.

Разберем по шагам реализацию этого подхода:

  1. В ПКО Контрагенты_Элементы в обработчике Перед выгрузкой пропишем:
    
    Если Источник.ЭтоГруппа Тогда
        Отказ = Истина;
    КонецЕсли;
    
    Здесь настраиваем поля поиска, актуальные только для элементов (например, ИНН, КПП).
  2. В ПКО Контрагенты_Группы в обработчике Перед выгрузкой установим противоположное условие:
    
    Если Не Источник.ЭтоГруппа Тогда
        Отказ = Истина;
    КонецЕсли;
    
    Для этого правила полями поиска назначаем Наименование, Код и ЭтоГруппа.
  3. В обоих правилах для реквизита Родитель явно укажем правило конвертации Контрагенты_Группы. Это полностью исключит создание групп в виде элементов при передаче иерархии через документы и справочники.

Способ 3. Прямой поиск запросом в базе-приемнике

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


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

Присвоение найденной ссылки переменной СсылкаНаОбъект (или Ссылка) вместе с флагом ПрекратитьПоиск = Истина; указывает загрузчику, что объект успешно сопоставлен и стандартный поиск выполнять не нужно.

Диагностика и проверка результатов обмена

Для выявления причин задвоения при тестировании правил рекомендуется применять следующие приемы:

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