Задвоение позиций в справочнике СправочникСсылка.Номенклатура — одна из самых распространенных проблем в учетных системах, особенно в конфигурациях масштаба 1С:Управление торговлей 10.3 или 1С:ERP при многотысячной номенклатурной базе. Ситуация усложняется тем, что наименования дублирующихся позиций часто не совпадают посимвольно: слова идут в разном порядке, присутствуют опечатки, смешана русская и латинская раскладка, а цифро-буквенные обозначения написаны слитно или через пробел (например, «Велосипед STELS Navigator 600 V 26» и «Велосипед Navigator 600V 26 Stels»).
Разберем комплексный подход к решению этой задачи: от предварительной нормализации текста и алгоритмов нечеткого сравнения до безопасной замены дублей в базе данных и организационных мер контроля.
Прежде чем запускать ресурсоемкие алгоритмы сопоставления строк, необходимо устранить базовый строковый шум. Если сравнивать исходные строки напрямую, эффективность алгоритмов падает в разы.
Проанализируем обязательные шаги подготовки строк:
НРег() и сжимаем множественные пробелы в один.Посмотрим на пример функции для предварительной подготовки наименования в 1С:
Функция НормализоватьНаименование(Знач ИсходнаяСтрока) Экспорт
// 1. Приведение к нижнему регистру
СтрокаОчистки = НРег(СокрЛП(ИсходнаяСтрока));
// 2. Замена похожих латинских букв на кириллицу
МассивЛатиница = "a,b,c,e,h,k,m,o,p,t,x";
МассивКириллица = "а,в,с,е,н,к,м,о,р,т,х";
СписокЛат = СтрРазделить(МассивЛатиница, ",");
СписокКир = СтрРазделить(МассивКириллица, ",");
Для Индекс = 0 По СписокЛат.ВГраница() Цикл
СтрокаОчистки = СтрЗаменить(СтрокаОчистки, СписокЛат[Индекс], СписокКир[Индекс]);
КонецЦикла;
// 3. Замена спецсимволов на пробелы
СпецСимволы = ".,/-_()""'№;:*!?";
Для Индекс = 1 По СтрДлина(СпецСимволы) Цикл
Символ = Сред(СпецСимволы, Индекс, 1);
СтрокаОчистки = СтрЗаменить(СтрокаОчистки, Символ, " ");
КонецЦикла;
// 4. Разбиение на слова и сортировка
МассивСлов = СтрРазделить(СтрокаОчистки, " ", Ложь);
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Слово", Новый ОписаниеТипов("Строка"));
Для Каждого Слово Из МассивСлов Цикл
ТекСлово = СокрЛП(Слово);
Если Не ПустаяСтрока(ТекСлово) Тогда
ТЗ.Добавить().Слово = ТекСлово;
КонецЕсли;
КонецЦикла;
ТЗ.Сортировать("Слово Возр");
Результат = "";
Для Каждого СтрТЗ Из ТЗ Цикл
Результат = Результат + ?(ПустаяСтрока(Результат), "", " ") + СтрТЗ.Слово;
КонецЦикла;
Возврат Результат;
КонецФункции
Когда наименования нормализованы, переходим к вычислению степени сходства между карточками номенклатуры. Рассмотрим основные алгоритмические подходы:
ПолнотекстовыйПоиск с оператором нечеткости ~ позволяет быстро получать выборку кандидатов на дубли непосредственно через поисковый индекс платформы без сканирования всей таблицы.Если в базе содержится 40 000 позиций номенклатуры, попарное сравнение «каждый с каждым» потребует приблизительно (40 000 × 39 999) / 2 = 799 980 000 операций. Вычисление такого объема на встроенном языке 1С приведет к зависанию системы на многие часы.
Применим методику блокирования (кластеризации) для сокращения пространства поиска:
Номенклатура (например, «Велосипеды» сравниваются только с «Велосипедами»).Артикул, Производитель или ВидНоменклатуры, выполняем поиск дублей строго внутри совпадений по этим реквизитам.В типовых конфигурациях 1С присутствуют встроенные механизмы, которые можно использовать в качестве базового инструмента:
Процесс слияния найденных дублей нельзя полностью автоматизировать — финальное решение всегда должен принимать ответственный оператор или товаровед. Ошибочное объединение разных позиций приводит к искажению складских остатков и финансового результата.
Разберем учетные правила и риски при замене номенклатуры в 1С:Управление торговлей 10.3:
НайтиПоСсылкам() и перезапись документов прошлых периодов (ДокументСсылка.ПоступлениеТоваровУслуг, ДокументСсылка.РеализацияТоваровУслуг) приводит к нарушению партионных цепочек в регистре накопления ПартииТоваровНаСкладах. Потребуется полное перепроведение документов и восстановление последовательности партий.СписаниеТоваров и ОприходованиеТоваров (или КорректировкаЗаписейРегистров), а старую карточку переименовать с префиксом «[НЕ ИСПОЛЬЗОВАТЬ]», очистить штрихкод и переместить в архивную папку.После наведения порядка в справочнике необходимо устранить саму причину возникновения дубликатов:
Номенклатура у менеджеров и операторов. Ввод новых позиций передается выделенному сотруднику (контент-менеджеру или товароведу) по регламенту.ПередЗаписью модуля объекта справочника Номенклатура внедряем обязательную проверку на дубли по нормализованному наименованию и артикулу с предупреждением пользователя.