При работе со справочниками в 1С (особенно с такими крупными, как «Номенклатура» или «Контрагенты») часто возникает задача очистки базы от дублирующихся элементов. Пользователи могут вводить одно и то же наименование с опечатками, перестановкой слов или незначительными различиями в символах. Стандартный язык запросов 1С транслируется в SQL и не имеет встроенного оператора вроде «ПОХОЖИЕ» для нечеткого сравнения строк.
В этой статье мы подробно разберем, почему простой посимвольный расчет процента схожести не всегда эффективен, с какими ограничениями платформы можно столкнуться и какие проверенные инструменты и алгоритмы существуют в экосистеме 1С для решения этой задачи.
На первый взгляд кажется, что достаточно посчитать процент совпадающих букв в наименованиях. Однако на практике такой подход («наивное» сравнение) приводит к огромному количеству ложных срабатываний. Рассмотрим несколько примеров:
Поэтому для качественного поиска дублей необходимо использовать специализированные алгоритмы и встроенные механизмы платформы.
Если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), вам не нужно заново изобретать алгоритмы сравнения. В БСП уже интегрирована подсистема поиска и удаления дублей, использующая расстояние Левенштейна-Дамерау.
Для настройки нечеткого сравнения мы можем использовать следующие возможности:
СравнениеСтрокНаПодобие в процедуре ПриОпределенииПараметровПоискаДублей общего модуля подсистемы.ПроцентСовпаденияСтрок для установки порога чувствительности алгоритма (например, те самые 80%).СловаИсключения, который позволяет игнорировать при сравнении «шумовые» слова (например: «ООО», «ИП» для контрагентов или «шт», «кг», «уп» для номенклатуры).Платформа 1С имеет встроенный оптимизированный механизм полнотекстового поиска, который поддерживает морфологию русского языка и нечеткое сравнение. Мы можем использовать его программно через объект ПолнотекстовыйПоиск.
Для этого выполняются следующие шаги:
ПорогНечеткости (в процентах от 0 до 100), определяющее чувствительность поиска к опечаткам.# позволяет искать слова с опечатками. Поисковый запрос вида масло#2 найдет варианты с одной или двумя опечатками («масла», «маслом», «мало»).* позволяет выполнять поиск по началу слова, помогая находить однокоренные позиции.Если необходимо быстро отобрать потенциальные дубликаты непосредственно на уровне СУБД без загрузки всех элементов в память сервера 1С, эффективным решением является метод триграмм.
Рассмотрим, как работает этот метод:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
(ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%каб%" ТОГДА 1 Иначе 0 КОНЕЦ +
ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%абе%" ТОГДА 1 Иначе 0 КОНЕЦ +
ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%бел%" ТОГДА 1 Иначе 0 КОНЕЦ +
ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%ель%" ТОГДА 1 Иначе 0 КОНЕЦ) / 4 КАК ПроцентСходства
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
(ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%каб%" ТОГДА 1 Иначе 0 КОНЕЦ +
ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%абе%" ТОГДА 1 Иначе 0 КОНЕЦ +
ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%бел%" ТОГДА 1 Иначе 0 КОНЕЦ +
ВЫБОР КОГДА Номенклатура.Наименование ПОДОБНО "%ель%" ТОГДА 1 Иначе 0 КОНЕЦ) / 4 >= 0.8
Этот метод позволяет СУБД мгновенно отсечь до 95% заведомо неподходящих записей еще до того, как данные будут переданы на сервер приложений 1С.
Каким бы хорошим ни был алгоритм нечеткого сравнения, его эффективность вырастет в разы, если перед сравнением произвести предварительную нормализацию (очистку) строк. Перед запуском сравнения рекомендуется выполнить следующие действия:
Для очень больших баз данных (более 100 000 элементов) расчет расстояний на встроенном языке 1С может работать медленно из-за квадратичной сложности алгоритма сравнения. В таких случаях вычисления переносят во внешние C++ компоненты (Native API) или используют специализированные внешние веб-сервисы дедупликации через REST API.