Как найти и объединить нечеткие дубли в справочнике Номенклатура в 1С?

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

Задвоение позиций в справочнике СправочникСсылка.Номенклатура — одна из самых распространенных проблем в учетных системах, особенно в конфигурациях масштаба 1С:Управление торговлей 10.3 или 1С:ERP при многотысячной номенклатурной базе. Ситуация усложняется тем, что наименования дублирующихся позиций часто не совпадают посимвольно: слова идут в разном порядке, присутствуют опечатки, смешана русская и латинская раскладка, а цифро-буквенные обозначения написаны слитно или через пробел (например, «Велосипед STELS Navigator 600 V 26» и «Велосипед Navigator 600V 26 Stels»).

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

Этап 1. Предварительная нормализация наименований

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

Проанализируем обязательные шаги подготовки строк:

  1. Устранение подмены раскладки (мимикрии символов): часто буквы русской раскладки визуально совпадают с латиницей («Н», «Р», «С», «О», «А», «Е», «Х», «В», «М», «Т», «К»). Заменим латинские символы на русские аналоги в наименовании для приведения к единому алфавитному пространству.
  2. Очистка от спецсимволов и лишних пробелов: удаляем знаки препинания (точки, запятые, дефисы, слэши, кавычки), переводим строку в единый регистр через НРег() и сжимаем множественные пробелы в один.
  3. Нормализация слитного и раздельного написания: разделяем пробелами границы между буквами и цифрами (например, превращаем «600V» в «600 V»), чтобы артикульные обозначения разбивались на одинаковые токены.
  4. Сортировка слов (токенизация): разбиваем очищенную строку на массив отдельных слов, сортируем их по алфавиту и собираем обратно в строку. Это полностью нейтрализует проблему перестановки слов (например, «Stels Navigator» и «Navigator Stels» превратятся в одинаковую строку «navigator stels»).

Посмотрим на пример функции для предварительной подготовки наименования в 1С:


Функция НормализоватьНаименование(Знач ИсходнаяСтрока) Экспорт
    // 1. Приведение к нижнему регистру
    СтрокаОчистки = НРег(СокрЛП(ИсходнаяСтрока));
    
    // 2. Замена похожих латинских букв на кириллицу
    МассивЛатиница  = "a,b,c,e,h,k,m,o,p,t,x";
    МассивКириллица = "а,в,с,е,н,к,м,о,р,т,х";
    СписокЛат = СтрРазделить(МассивЛатиница, ",");
    СписокКир = СтрРазделить(МассивКириллица, ",");
    
    Для Индекс = 0 По СписокЛат.ВГраница() Цикл
        СтрокаОчистки = СтрЗаменить(СтрокаОчистки, СписокЛат[Индекс], СписокКир[Индекс]);
    КонецЦикла;
    
    // 3. Замена спецсимволов на пробелы
    СпецСимволы = ".,/-_()""'№;:*!?";
    Для Индекс = 1 По СтрДлина(СпецСимволы) Цикл
        Символ = Сред(СпецСимволы, Индекс, 1);
        СтрокаОчистки = СтрЗаменить(СтрокаОчистки, Символ, " ");
    КонецЦикла;
    
    // 4. Разбиение на слова и сортировка
    МассивСлов = СтрРазделить(СтрокаОчистки, " ", Ложь);
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Слово", Новый ОписаниеТипов("Строка"));
    
    Для Каждого Слово Из МассивСлов Цикл
        ТекСлово = СокрЛП(Слово);
        Если Не ПустаяСтрока(ТекСлово) Тогда
            ТЗ.Добавить().Слово = ТекСлово;
        КонецЕсли;
    КонецЦикла;
    
    ТЗ.Сортировать("Слово Возр");
    
    Результат = "";
    Для Каждого СтрТЗ Из ТЗ Цикл
        Результат = Результат + ?(ПустаяСтрока(Результат), "", " ") + СтрТЗ.Слово;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Этап 2. Алгоритмы нечеткого поиска и сравнения

Когда наименования нормализованы, переходим к вычислению степени сходства между карточками номенклатуры. Рассмотрим основные алгоритмические подходы:

  1. Коэффициент Жаккара по токенам (словам): вычисляем отношение размера пересечения множеств слов двух строк к размеру их объединения. Если пересечение слов составляет более 80–90%, позиции помещаются в группу потенциальных дублей.
  2. Сравнение по N-граммам (Q-граммам): разбиваем строки на подстроки фиксированной длины (обычно биграммы из 2 символов или триграммы из 3 символов) и оцениваем пересечение множеств N-грамм. Этот метод устойчив к опечаткам в корнях слов и пропускам букв.
  3. Расстояние Левенштейна и Дамерау-Левенштейна: определяет минимальное количество операций вставки, удаления, замены и перестановки соседних символов для превращения одной строки в другую. Метод высокоточен, но требует значительных вычислительных ресурсов.
  4. Использование внешних библиотек (например, StrMatch.dll): внешние компоненты, оптимизированные на C/C++, позволяют выполнять нечеткое сопоставление со скоростью десятков тысяч сравнений в секунду с поддержкой весовых коэффициентов для цифр и букв.
  5. Полнотекстовый поиск 1С: использование встроенного механизма ПолнотекстовыйПоиск с оператором нечеткости ~ позволяет быстро получать выборку кандидатов на дубли непосредственно через поисковый индекс платформы без сканирования всей таблицы.

Этап 3. Оптимизация производительности при больших объемах

Если в базе содержится 40 000 позиций номенклатуры, попарное сравнение «каждый с каждым» потребует приблизительно (40 000 × 39 999) / 2 = 799 980 000 операций. Вычисление такого объема на встроенном языке 1С приведет к зависанию системы на многие часы.

Применим методику блокирования (кластеризации) для сокращения пространства поиска:

  1. Ограничение по группам справочника: сравниваем элементы только внутри одинаковых или смежных иерархических папок справочника Номенклатура (например, «Велосипеды» сравниваются только с «Велосипедами»).
  2. Кластеризация по точным реквизитам: если у номенклатуры заполнены реквизиты Артикул, Производитель или ВидНоменклатуры, выполняем поиск дублей строго внутри совпадений по этим реквизитам.
  3. Блокинг по числовым маркерам: извлекаем из наименования все числа (например, «600», «26»). Карточки сравниваются между собой только в том случае, если наборы их числовых параметров полностью идентичны. Это предотвращает ошибочное слияние товаров разных размеров, объемов или фасовок (например, масло «1л» и «4л», обувь «42» и «35» размера).

Этап 4. Штатные инструменты платформы и конфигураций

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

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

Этап 5. Безопасная замена и учетные риски при объединении позиций

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

Разберем учетные правила и риски при замене номенклатуры в 1С:Управление торговлей 10.3:

  1. Партионный учет и закрытые периоды: прямая замена ссылки через НайтиПоСсылкам() и перезапись документов прошлых периодов (ДокументСсылка.ПоступлениеТоваровУслуг, ДокументСсылка.РеализацияТоваровУслуг) приводит к нарушению партионных цепочек в регистре накопления ПартииТоваровНаСкладах. Потребуется полное перепроведение документов и восстановление последовательности партий.
  2. Блокировки таблиц: массовая замена ссылок накладывает исключительные блокировки на документы и регистры. Эту процедуру следует выполнять монопольно во внерабочее время.
  3. Альтернатива физическому удалению: если по дублю были движения в прошлых закрытых периодах, безопаснее перенести его текущий остаток на правильную позицию документами СписаниеТоваров и ОприходованиеТоваров (или КорректировкаЗаписейРегистров), а старую карточку переименовать с префиксом «[НЕ ИСПОЛЬЗОВАТЬ]», очистить штрихкод и переместить в архивную папку.

Этап 6. Предотвращение повторного появления дублей

После наведения порядка в справочнике необходимо устранить саму причину возникновения дубликатов:

  1. Использование регистра «Номенклатура контрагентов»: для сопоставления разных наименований одного и того же товара из накладных поставщиков используем штатный механизм номенклатуры контрагентов, не создавая новые карточки в основном справочнике.
  2. Ограничение прав доступа: отключаем право прямого создания элементов справочника Номенклатура у менеджеров и операторов. Ввод новых позиций передается выделенному сотруднику (контент-менеджеру или товароведу) по регламенту.
  3. Проверка при записи: в событии ПередЗаписью модуля объекта справочника Номенклатура внедряем обязательную проверку на дубли по нормализованному наименованию и артикулу с предупреждением пользователя.
← На главную