Почему при конвертации данных не находятся контрагенты и создаются дубли?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Причина некорректного поведения

Проанализируем типичные ошибки, возникающие при попытке настроить собственный алгоритм сопоставления в обработчике «ПоляПоиска»:

  1. Конфликт штатного и ручного поиска: Одновременное заполнение переменной СтрокаИменСвойствПоиска и вызов метода НайтиПоРеквизиту приводит к тому, что стандартный алгоритм пытается переопределить результаты или работает некорректно.
  2. Отсутствие флага завершения поиска: Если поиск выполнен программно и значение присвоено переменной СсылкаНаОбъект, но не установлен флаг ПрекратитьПоиск = Истина;, обработка загрузки продолжит стандартный поиск и, не найдя совпадений по другим полям, создаст новый элемент.
  3. Особенности строковых реквизитов фиксированной длины: Если в конфигураторе базы-приемника для реквизита задана фиксированная длина (например, строка из 14 символов), платформа физически дополняет значение пробелами справа. Вызов СокрЛП() отсекает пробелы, из-за чего метод НайтиПоРеквизиту возвращает Неопределено (пустую ссылку), так как ищет точное совпадение с учетом длины.
  4. Наличие неразрывных пробелов: Функция СокрЛП удаляет только стандартные пробелы (код 32), но не удаляет неразрывные пробелы (Символы.НПП, код 160), которые часто попадают в коды и номера при копировании данных.
  5. Лишние флаги поиска в ПКС: Если в правиле конвертации свойств поиск включен сразу для нескольких реквизитов (например, Код, Наименование, ИНН), штатный механизм строит условие по всем отмеченным полям одновременно.

Вариант 1. Использование штатного механизма поиска через ПКС

В большинстве случаев писать произвольный код в обработчике «ПоляПоиска» не требуется. Штатный механизм загрузки прекрасно справляется с сопоставлением по реквизитам. Разберем правильную настройку по шагам:

  1. Откроем правило конвертации объектов (ПКО) для справочника Контрагенты.
  2. Полностью очистим код в обработчике «ПоляПоиска».
  3. В табличной части правил конвертации свойств (ПКС) найдем реквизит, по которому должен выполняться поиск (например, КодПоЕДРПОУ или ИНН), и установим для него флаг «Поиск».
  4. Снимем флаги «Поиск» со всех остальных реквизитов (Код, Наименование и т. д.), чтобы поиск не выполнялся по составному условию.
  5. Если поиск по внутреннему идентификатору (GUID) не требуется, убедимся, что опция «Искать объект приемника по внутреннему идентификатору» отключена в настройках ПКО.

Вариант 2. Программный поиск в обработчике «ПоляПоиска» через Запрос

Если требуется нестандартная логика (например, поиск без учета концевых пробелов, исключение помеченных на удаление контрагентов или групп), используем программный поиск. Вместо метода НайтиПоРеквизиту надежнее использовать Запрос, так как он позволяет отсечь группы и помеченные на удаление элементы. Посмотрим на пример реализации в обработчике «ПоляПоиска»:


КодПоиска = СвойстваПоиска.Получить("КодПоЕДРПОУ");

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

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

Вариант 3. Исключение выгрузки групп справочника

Если в базе-источнике используется иерархия, а в базе-приемнике сопоставляются только элементы, группы могут вызывать создание пустых дублей без заполненных кодов. Чтобы пропустить выгрузку групп, добавим условие в обработчик «ПередВыгрузкой» в ПКО:


Если Источник.ЭтоГруппа Тогда
    Отказ = Истина;
КонецЕсли;

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

Выясним, какие еще факторы могут влиять на результат сопоставления:

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