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