Как организовать поиск контрагента в 1С при неточном совпадении наименования?

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

При автоматизации загрузки данных из внешних источников, таких как банковские выписки или файлы Excel, мы часто сталкиваемся с проблемой: наименование контрагента в файле не совпадает с тем, как он записан в базе 1С. Ситуация осложняется, если в данных отсутствует ИНН. Например, в базе организация значится как ООО "Мастер", а в платежном поручении указано "Мастер ООО" или просто "Мастер". В этой статье мы разберем комплексный подход к решению этой задачи: от простых запросов до сложных алгоритмов нечеткого поиска.

Метод 1. Использование оператора ПОДОБНО в запросах

Самый простой и очевидный способ — это использование оператора ПОДОБНО (LIKE) в языке запросов 1С. Рассмотрим ситуацию, когда нам нужно найти контрагента по части вхождения строки. Однако стоит помнить, что этот метод чувствителен к порядку слов и лишним символам.

Проанализируем пример кода, который позволяет искать контрагента, если его название содержится внутри строки из файла:


ТекстЗапроса = "ВЫБРАТЬ
               |    Контрагенты.Ссылка КАК Ссылка
               |ИЗ
               |    Справочник.Контрагенты КАК Контрагенты
               |ГДЕ
               |    Контрагенты.Наименование ПОДОБНО &НаименованиеПоиска";

Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("НаименованиеПоиска", "%" + СокрЛП(НаименованиеИзФайла) + "%");
Результат = Запрос.Выполнить();

Этот метод работает, если НаименованиеИзФайла является частью полного наименования. Но он бессилен, если слова поменялись местами (например, ОПФ переехала в конец названия).

Метод 2. Нормализация строк перед поиском

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

  1. Удаление ОПФ: Исключим из строки слова «ООО», «ИП», «ЗАО» и т.д.
  2. Очистка от спецсимволов: Удалим кавычки, точки, лишние пробелы и тире.
  3. Приведение к регистру: Переведем все в верхний регистр.
  4. Сортировка слов: Это поможет, если «Мастер ООО» превратится в «МАСТЕР», и «ООО Мастер» тоже станет «МАСТЕР».

Рассмотрим пример функции для очистки строки:


Функция НормализоватьНаименование(Знач Стр)
    Стр = ВРег(Стр);
    // Удаляем кавычки и знаки препинания
    Стр = СтрЗаменить(Стр, """", "");
    Стр = СтрЗаменить(Стр, "«", "");
    Стр = СтрЗаменить(Стр, "»", "");
    // Удаляем организационные формы
    МассивОПФ = Новый Массив;
    МассивОПФ.Добавить("ООО");
    МассивОПФ.Добавить("ИП");
    Для Каждого ОПФ Из МассивОПФ Цикл
        Стр = СтрЗаменить(Стр, ОПФ, "");
    КонецЦикла;
    Возврат СокрЛП(Стр);
КонецФункции

Метод 3. Использование вспомогательного регистра сведений

Если автоматический поиск не дал результата и пользователь сопоставил контрагента вручную, программу нужно «обучить». Для этого создадим регистр сведений НаименованияКонтрагентовДляБанка. В нем будем хранить два поля: НаименованиеИзФайла (Ключ) и Контрагент (Ссылка).

Разберем алгоритм работы с таким регистром:

  1. При загрузке сначала ищем в регистре по точному совпадению строки из файла.
  2. Если запись найдена — подставляем контрагента.
  3. Если не найдена — пытаемся искать по названию.
  4. Если и тут не вышло — просим пользователя выбрать контрагента и записываем его выбор в регистр для будущих загрузок.

Важный нюанс: Такой подход позволяет избежать повторных ручных операций, и со временем база сопоставлений станет достаточно полной для автоматической работы.

Метод 4. Поиск по банковским реквизитам

Выясним, есть ли более надежные способы идентификации, чем название. В любой банковской платежке всегда присутствуют Номер счета и БИК банка. Это уникальная связка, которая гораздо надежнее наименования.

Рекомендуется организовать поиск по следующей цепочке приоритетов:

  1. Поиск по ИНН (если он есть).
  2. Поиск по расчетному счету (через справочник БанковскиеСчета).
  3. Поиск по нормализованному наименованию.
  4. Поиск через регистр сопоставлений.

Пример запроса для поиска по счету:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    БанковскиеСчета.Владелец КАК Контрагент
               |ИЗ
               |    Справочник.БанковскиеСчета КАК БанковскиеСчета
               |ГДЕ
               |    БанковскиеСчета.НомерСчета = &НомерСчета
               |    И БанковскиеСчета.Банк.Код = &БИК";

Метод 5. Алгоритмы нечеткого поиска (Расстояние Левенштейна)

Когда строки почти совпадают, но содержат опечатки (например, «Мастер» и «Матсер»), на помощь приходят алгоритмы вычисления расстояния Левенштейна. Этот алгоритм определяет количество правок, необходимых для превращения одной строки в другую.

В 1С это можно реализовать перебором справочника (для небольших баз) или выгрузкой названий в массив и обработкой в коде. Мы можем установить порог схожести, например, 80%. Если сходство выше — предлагаем этого контрагента пользователю как приоритетного кандидата.

Метод 6. Полнотекстовый поиск (ППС)

Рассмотрим возможности встроенного механизма 1С — Полнотекстового поиска. Он поддерживает морфологию и нечеткий поиск «из коробки».

С помощью метода ПолнотекстовыйПоиск.СоздатьСписок() можно программно отправить запрос. Если добавить к поисковому слову символ #, система будет искать похожие слова, допуская ошибки в буквах. Это работает значительно быстрее, чем перебор всех записей справочника в цикле.

Метод 7. Использование внешних сервисов (API)

Проанализируем ситуацию, когда данных в базе совсем мало. Можно воспользоваться сервисами типа DaData. Мы отправляем «грязное» наименование через API, а сервис возвращает нам официальное название компании и её ИНН. Получив ИНН, мы легко находим или создаем контрагента в нашей базе 1С. Это самый современный и надежный способ очистки данных.

Заключение и рекомендации

Для достижения максимальной точности мы рекомендуем использовать гибридный подход:

Такая многоуровневая система проверки минимизирует ошибки и значительно ускорит процесс обработки банковских выписок.

← На главную