Как реализовать нечеткий поиск и поиск похожих элементов в справочниках 1С?

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

При работе со справочниками в 1С (особенно с такими крупными, как «Номенклатура» или «Контрагенты») часто возникает задача очистки базы от дублирующихся элементов. Пользователи могут вводить одно и то же наименование с опечатками, перестановкой слов или незначительными различиями в символах. Стандартный язык запросов 1С транслируется в SQL и не имеет встроенного оператора вроде «ПОХОЖИЕ» для нечеткого сравнения строк.

В этой статье мы подробно разберем, почему простой посимвольный расчет процента схожести не всегда эффективен, с какими ограничениями платформы можно столкнуться и какие проверенные инструменты и алгоритмы существуют в экосистеме 1С для решения этой задачи.

Проблема простого посимвольного сравнения

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

  1. Разные товары с похожим наименованием: Строки «Масло моторное Лукойл 1л» и «Масло моторное Лукойл 5л» различаются всего на 1 символ (более 95% схожести), но это принципиально разные позиции номенклатуры с разной ценой.
  2. Разный смысл при одинаковом наборе букв: Слова «пора», «шпора» и «пороша» имеют высокий процент совпадения букв, но абсолютно разные значения.
  3. Перестановка слов: Наименования «Пальто женское мех» и «Женское пальто мех» состоят из одних и тех же слов, но при обычном сравнении символов «в лоб» покажут низкий процент совпадения из-за разного порядка.

Поэтому для качественного поиска дублей необходимо использовать специализированные алгоритмы и встроенные механизмы платформы.

Решение 1. Использование встроенных механизмов БСП

Если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), вам не нужно заново изобретать алгоритмы сравнения. В БСП уже интегрирована подсистема поиска и удаления дублей, использующая расстояние Левенштейна-Дамерау.

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

Решение 2. Полнотекстовый поиск платформы (ПДП)

Платформа 1С имеет встроенный оптимизированный механизм полнотекстового поиска, который поддерживает морфологию русского языка и нечеткое сравнение. Мы можем использовать его программно через объект ПолнотекстовыйПоиск.

Для этого выполняются следующие шаги:

  1. Задается свойство ПорогНечеткости (в процентах от 0 до 100), определяющее чувствительность поиска к опечаткам.
  2. В строке запроса применяются специальные операторы. Например, оператор # позволяет искать слова с опечатками. Поисковый запрос вида масло#2 найдет варианты с одной или двумя опечатками («масла», «маслом», «мало»).
  3. Оператор * позволяет выполнять поиск по началу слова, помогая находить однокоренные позиции.

Решение 3. Метод N-грамм (триграмм) в запросах 1С

Если необходимо быстро отобрать потенциальные дубликаты непосредственно на уровне СУБД без загрузки всех элементов в память сервера 1С, эффективным решением является метод триграмм.

Рассмотрим, как работает этот метод:

  1. Исходное слово разбивается на тройки символов (триграммы). Например, слово «кабель» разбивается на: «каб», «абе», «бел», «ель».
  2. На встроенном языке 1С динамически формируется текст запроса, в котором для каждой триграммы прописывается условие подобия:

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    (ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%каб%" ТОГДА 1 Иначе 0 КОНЕЦ +
     ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%абе%" ТОГДА 1 Иначе 0 КОНЕЦ +
     ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%бел%" ТОГДА 1 Иначе 0 КОНЕЦ +
     ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%ель%" ТОГДА 1 Иначе 0 КОНЕЦ) / 4 КАК ПроцентСходства
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    (ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%каб%" ТОГДА 1 Иначе 0 КОНЕЦ +
     ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%абе%" ТОГДА 1 Иначе 0 КОНЕЦ +
     ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%бел%" ТОГДА 1 Иначе 0 КОНЕЦ +
     ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%ель%" ТОГДА 1 Иначе 0 КОНЕЦ) / 4 >= 0.8

Этот метод позволяет СУБД мгновенно отсечь до 95% заведомо неподходящих записей еще до того, как данные будут переданы на сервер приложений 1С.

Оптимизация и предварительная нормализация данных

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

  1. Привести сравниваемые наименования к нижнему регистру.
  2. Удалить все знаки препинания, лишние пробелы и спецсимволы.
  3. Разбить строку на отдельные слова, отсортировать их по алфавиту и собрать обратно. Это полностью решает проблему перестановки слов (например, строки «Пальто женское» и «Женское пальто» после такой нормализации превратятся в идентичную строку «женское пальто» и покажут 100% совпадение).

Для очень больших баз данных (более 100 000 элементов) расчет расстояний на встроенном языке 1С может работать медленно из-за квадратичной сложности алгоритма сравнения. В таких случаях вычисления переносят во внешние C++ компоненты (Native API) или используют специализированные внешние веб-сервисы дедупликации через REST API.

← На главную