При работе в 1С:Управление торговлей 11.4 пользователи часто сталкиваются с ситуацией, когда в справочнике «Номенклатура» накапливается множество позиций-дублей. Типичный пример: «Холодильник № 10» и «Холодильник №10». Несмотря на очевидную идентичность для человека, стандартная обработка «Поиск и удаление дублей» при настройке «Похожие слова» может их не увидеть. Рассмотрим детально, почему это происходит и как решить проблему программными и административными методами.
Прежде всего, проанализируем ситуацию с технической стороны. Алгоритм «Похожие слова» в типовых решениях 1С базируется на механизме полнотекстового поиска. Система разбивает строку на отдельные «токены» (лексемы). Для программы «№ 10» — это два отдельных слова, а «№10» — одно слово. Из-за разного количества токенов алгоритм считает эти строки недостаточно похожими.
Для корректной работы перед любыми операциями с дублями мы рекомендуем обновить индекс полнотекстового поиска. Пройдите в раздел Администрирование — Поддержка и обслуживание — Полнотекстовый поиск и выполните обновление индекса. Однако, как показывает практика, одного этого действия часто бывает недостаточно.
Самый быстрый способ заставить стандартный поиск работать — привести все наименования к единому стандарту (убрать лишние пробелы). Мы можем воспользоваться встроенной обработкой «Групповое изменение реквизитов», которая позволяет выполнять произвольный алгоритм на встроенном языке 1С.
Рассмотрим по шагам, как убрать лишний пробел после символа «№»:
Объект.Наименование = СтрЗаменить(Объект.Наименование, "№ ", "№");
Этот код найдет все вхождения «№ » (с пробелом) и заменит их на «№» (без пробела). После выполнения этой обработки названия станут идентичными, и стандартный поиск дублей по «Полному совпадению» мгновенно их обнаружит.
Иногда встречаются более сложные задачи, например: «Холодильник № 10 вид № 171». Если нам нужно убрать пробел только после второго символа «№», или выполнить более точную замену, проанализируем пример кода, который можно использовать в обработке:
Рез = СтрНайти(Объект.Наименование, "№ ", НаправлениеПоиска.С Конца);
Если Рез > 0 Тогда
Объект.Наименование = Лев(Объект.Наименование, Рез) + Сред(Объект.Наименование, Рез + 2);
КонецЕсли;
В данном примере функция СтрНайти ищет вхождение с конца строки, что позволяет нам точечно воздействовать на последние символы в наименовании, сохраняя структуру начала строки.
Профессиональный подход к очистке справочника заключается в создании временного вспомогательного реквизита. Выясним, как это работает: Мы создаем алгоритм, который копирует наименование в отдельную переменную, удаляет из него вообще все пробелы, знаки препинания и приводит текст к нижнему регистру.
Пример функции нормализации:
Функция ПолучитьПоисковыйКлюч(ВходнаяСтрока)
Результат = НРег(ВходнаяСтрока);
Результат = СтрЗаменить(Результат, " ", "");
Результат = СтрЗаменить(Результат, "№", "");
// Добавьте замену других спецсимволов по необходимости
Возврат Результат;
КонецФункции
После такой обработки строки «Холодильник № 10» и «холодильник №10» превратятся в идентичный ключ холодильник10. Сравнивая эти ключи, вы со 100% вероятностью найдете все скрытые дубли.
Выполняя слияние дублей в 1С:УТ 11.4, необходимо учитывать архитектуру регистров. В этой конфигурации данные о товарах хранятся в специальных регистрах сведений — «Ключи аналитики учета номенклатуры». Проанализируем ситуацию: если вы просто удалите одну карточку и перенаправите ссылки на другую, записи в регистрах аналитики могут «зависнуть» или некорректно продублироваться.
Рекомендации после удаления дублей:
Для наиболее продвинутых случаев, когда нужно найти сложные паттерны (например, любые цифры после знака номера), мы можем задействовать объект VBScript.RegExp через COM-соединение. Это позволит заменить конструкцию «№ [любое количество пробелов] [цифра]» на «№[цифра]» одной командой. Это гораздо надежнее, чем вложенные функции Лев(), Прав() и Сред().
Чтобы проблема не вернулась снова, после очистки базы обязательно настройте контроль уникальности. В 1С:УТ 11.4 за это отвечает функционал «Проверять уникальность номенклатуры и характеристик по сочетанию реквизитов». Мы рекомендуем также рассмотреть использование расширений, которые выполняют нормализацию строки (удаление лишних пробелов) непосредственно в момент записи новой карточки номенклатуры. Это предотвратит создание «грязных» данных в будущем.