При автоматизации загрузки данных из внешних источников, таких как банковские выписки или файлы Excel, мы часто сталкиваемся с проблемой: наименование контрагента в файле не совпадает с тем, как он записан в базе 1С. Ситуация осложняется, если в данных отсутствует ИНН. Например, в базе организация значится как ООО "Мастер", а в платежном поручении указано "Мастер ООО" или просто "Мастер". В этой статье мы разберем комплексный подход к решению этой задачи: от простых запросов до сложных алгоритмов нечеткого поиска.
Самый простой и очевидный способ — это использование оператора ПОДОБНО (LIKE) в языке запросов 1С. Рассмотрим ситуацию, когда нам нужно найти контрагента по части вхождения строки. Однако стоит помнить, что этот метод чувствителен к порядку слов и лишним символам.
Проанализируем пример кода, который позволяет искать контрагента, если его название содержится внутри строки из файла:
ТекстЗапроса = "ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование ПОДОБНО &НаименованиеПоиска";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("НаименованиеПоиска", "%" + СокрЛП(НаименованиеИзФайла) + "%");
Результат = Запрос.Выполнить();
Этот метод работает, если НаименованиеИзФайла является частью полного наименования. Но он бессилен, если слова поменялись местами (например, ОПФ переехала в конец названия).
Чтобы повысить точность, мы должны привести обе строки (из базы и из файла) к единому стандарту. Этот процесс называется нормализацией. Проанализируем, какие шаги для этого необходимы:
Рассмотрим пример функции для очистки строки:
Функция НормализоватьНаименование(Знач Стр)
Стр = ВРег(Стр);
// Удаляем кавычки и знаки препинания
Стр = СтрЗаменить(Стр, """", "");
Стр = СтрЗаменить(Стр, "«", "");
Стр = СтрЗаменить(Стр, "»", "");
// Удаляем организационные формы
МассивОПФ = Новый Массив;
МассивОПФ.Добавить("ООО");
МассивОПФ.Добавить("ИП");
Для Каждого ОПФ Из МассивОПФ Цикл
Стр = СтрЗаменить(Стр, ОПФ, "");
КонецЦикла;
Возврат СокрЛП(Стр);
КонецФункции
Если автоматический поиск не дал результата и пользователь сопоставил контрагента вручную, программу нужно «обучить». Для этого создадим регистр сведений НаименованияКонтрагентовДляБанка. В нем будем хранить два поля: НаименованиеИзФайла (Ключ) и Контрагент (Ссылка).
Разберем алгоритм работы с таким регистром:
Важный нюанс: Такой подход позволяет избежать повторных ручных операций, и со временем база сопоставлений станет достаточно полной для автоматической работы.
Выясним, есть ли более надежные способы идентификации, чем название. В любой банковской платежке всегда присутствуют Номер счета и БИК банка. Это уникальная связка, которая гораздо надежнее наименования.
Рекомендуется организовать поиск по следующей цепочке приоритетов:
БанковскиеСчета).Пример запроса для поиска по счету:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| БанковскиеСчета.Владелец КАК Контрагент
|ИЗ
| Справочник.БанковскиеСчета КАК БанковскиеСчета
|ГДЕ
| БанковскиеСчета.НомерСчета = &НомерСчета
| И БанковскиеСчета.Банк.Код = &БИК";
Когда строки почти совпадают, но содержат опечатки (например, «Мастер» и «Матсер»), на помощь приходят алгоритмы вычисления расстояния Левенштейна. Этот алгоритм определяет количество правок, необходимых для превращения одной строки в другую.
В 1С это можно реализовать перебором справочника (для небольших баз) или выгрузкой названий в массив и обработкой в коде. Мы можем установить порог схожести, например, 80%. Если сходство выше — предлагаем этого контрагента пользователю как приоритетного кандидата.
Рассмотрим возможности встроенного механизма 1С — Полнотекстового поиска. Он поддерживает морфологию и нечеткий поиск «из коробки».
С помощью метода ПолнотекстовыйПоиск.СоздатьСписок() можно программно отправить запрос. Если добавить к поисковому слову символ #, система будет искать похожие слова, допуская ошибки в буквах. Это работает значительно быстрее, чем перебор всех записей справочника в цикле.
Проанализируем ситуацию, когда данных в базе совсем мало. Можно воспользоваться сервисами типа DaData. Мы отправляем «грязное» наименование через API, а сервис возвращает нам официальное название компании и её ИНН. Получив ИНН, мы легко находим или создаем контрагента в нашей базе 1С. Это самый современный и надежный способ очистки данных.
Для достижения максимальной точности мы рекомендуем использовать гибридный подход:
Такая многоуровневая система проверки минимизирует ошибки и значительно ускорит процесс обработки банковских выписок.