Как настроить сопоставление по ИНН в Конвертации данных при наличии лишних пробелов?

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

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

Проанализируем природу проблемы. Чаще всего несовпадение возникает из-за следующих факторов:

  1. Различие типов данных в метаданных: в базе-источнике реквизит ИНН может быть строкой переменной длины (например, 10 символов для юридических лиц), а в приемнике — строкой фиксированной длины (например, 12 символов, рассчитанной на ИП и физлиц). При записи значения СУБД автоматически дополняет строку хвостовыми пробелами справа до максимальной длины. Стандартный строгий поиск в КД при этом возвращает отрицательный результат.
  2. Автоматическое форматирование при записи: в модуле объекта или менеджера базы-приемника в событиях ПередЗаписью могут выполняться типовые процедуры нормализации реквизитов, которые принудительно возвращают пробелы или маску.

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

Способ 1. Произвольный поиск через запрос в обработчике «Поля поиска»

Это наиболее гибкий и надежный вариант. В ПКО нужного справочника (например, «Организации») перейдем на вкладку «Обработчики событий» и откроем событие «Поля поиска». Здесь мы переопределим стандартный механизм сопоставления, выполнив запрос к базе-приемнику с использованием конструкции ПОДОБНО или очисткой пробелов.

Посмотрим на пример реализации кода в обработчике:


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

Обратим внимание на ключевые переменные обработчика:

  1. СвойстваПоиска — структура, содержащая значения полей, по которым настроен поиск.
  2. СсылкаНаОбъект — переменная, в которую передается найденная ссылка на элемент в приемнике.
  3. ПрекратитьПоиск — флаг типа Булево. Установка его в значение Истина сообщает механизму загрузки, что объект успешно найден и дальнейший стандартный поиск выполнять не нужно.

Способ 2. Приведение формата строки в структуре «СвойстваПоиска»

Если известно, что приемник хранит фиксированную строку длиной 12 символов, а из источника передается 10 символов, можно программно выровнять длину строки перед выполнением стандартного поиска. В том же обработчике «Поля поиска» скорректируем значение в структуре:


ИНН_Очищенный = СокрЛП(СвойстваПоиска["ИНН"]);

// Если передан 10-значный ИНН юрлица, дополняем двумя пробелами справа
Если СтрДлина(ИНН_Очищенный) = 10 Тогда
    СвойстваПоиска["ИНН"] = ИНН_Очищенный + "  ";
Иначе
    СвойстваПоиска["ИНН"] = ИНН_Очищенный;
КонецЕсли;

В этом случае платформа продолжит стандартный поиск по полям, но уже с точным строковым значением, соответствующим формату базы-приемника.

Способ 3. Очистка реквизита в ПКС (Правила конвертации свойств)

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

  1. В ПКС «ИНН» в обработчике «Перед выгрузкой» (на стороне источника) пропишем:

Значение = СокрЛП(Источник.ИНН);

  1. В обработчике «При загрузке» того же ПКС (на стороне приемника) гарантируем чистоту принимаемого значения:

Значение = СокрЛП(Значение);

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

Альтернативные варианты решения

Если конфигурация-приемник доступна для доработки в Конфигураторе, проанализируем тип данных реквизита ИНН. Изменение типа с фиксированной длины на переменную строку позволит платформе хранить значения без хвостовых пробелов. После изменения типа в базе-приемнике рекомендуется выполнить обработку по удалению лишних пробелов через СокрЛП для существующих записей.

Для предопределенных или собственных организаций предприятия также можно использовать сопоставление по внутреннему уникальному идентификатору (GUID), отключив поиск по реквизитам.

← На главную