Приветствуем вас! Сегодня мы подробно разберем очень распространенную и неприятную проблему, с которой часто сталкиваются пользователи и разработчики в программе «1С:Бухгалтерия предприятия 3.0». Ситуация выглядит следующим образом: в справочнике номенклатуры присутствуют два практически одинаковых элемента. Вы пытаетесь использовать стандартный инструмент «Поиск и удаление дублей», но система упорно отказывается признавать их дубликатами. Вы пробовали различные режимы сравнения, перестраивали индексы полнотекстового поиска в конфигураторе, даже выгружали базу в формат .dt и загружали ее в чистую базу SQL — но эффекта ноль. Выясним причину этой проблемы и рассмотрим эффективные варианты ее решения.
Проанализируем ситуацию с технической точки зрения. Алгоритм нечеткого сравнения строк «по похожим словам» в платформе «1С:Предприятие 8» работает на основе токенизации — разбиения строки на отдельные слова и сравнения их весов. Если наименования элементов слишком длинные (содержат артикулы, характеристики, размеры, скобки, информацию о комиссии и ценах), то добавление даже пары уникальных слов в конец строки существенно снижает общий процент схожести двух строк. В результате алгоритм считает эти элементы разными позициями.
Кроме того, часто виной всему становятся скрытые спецсимволы. Например, при импорте номенклатуры из файлов Excel, XML-выгрузок или при обмене с сайтами в наименование могут попадать неразрывные пробелы (символ Символы.НПП с кодом ASCII 160) вместо обычных пробелов (код ASCII 32). Для пользователя на экране компьютера они выглядят абсолютно одинаково, но для поискового движка 1С словосочетание, разделенное неразрывными пробелами, превращается в одно огромное слово. В такой ситуации стандартный поиск дублей гарантированно выдаст пустой результат.
Давайте подробно разберем четыре практических метода, которые помогут вам решить эту задачу и корректно объединить дублирующиеся позиции в базе данных.
Если вам заранее известны конкретные элементы, которые нужно схлопнуть, нет необходимости заставлять программу анализировать весь справочник и пытаться сопоставить наименования. Мы можем настроить стандартную обработку «Поиск и удаление дублей» в обход ее базовых алгоритмов текстового сравнения.
Разберем по шагам, как это сделать:
Номенклатура.Ссылка, установите вид сравнения «В списке» и вручную добавьте в список оба ваших элемента-дубля. Таким образом, мы жестко ограничиваем область поиска только двумя проблемными элементами.Наименование. Вместо этого отметьте любой другой реквизит, который гарантированно совпадает у обеих позиций (например, признак Услуга, СтавкаНДС или ВидНоменклатуры).Поскольку область поиска ограничена только выбранными вами позициями, а указанный для сравнения реквизит у них совпадает, система мгновенно сгруппирует их как дубли. Вам останется лишь назначить один из элементов оригиналом, а второй — дубликатом, после чего запустить процесс объединения.
Посмотрим на пример еще одного простого решения проблемы, которое подходит для небольшого количества дублирующихся позиций. Мы можем вручную устранить различие в строках, чтобы задействовать стандартный поиск по точной строке.
Выполните следующие действия:
Ctrl+C).Ctrl+V). Таким образом, мы исключаем разницу в невидимых символах, пробелах и регистрах букв.Рассмотрим подробнее классический инструмент, который уже много лет выручает разработчиков и администраторов баз данных 1С. Универсальная обработка ПоискИЗаменаЗначений.epf (ее можно найти на диске ИТС или в открытых источниках) работает напрямую со ссылочной целостностью базы данных без анализа схожести наименований.
Принцип работы предельно прост: вы напрямую указываете программе, какую ссылку (наш дубликат) нужно найти во всех таблицах базы данных (в документах, регистрах, справочниках) и на какую ссылку (наш оригинал) ее нужно заменить. После выполнения замены дублирующий элемент полностью освобождается от связей, и его можно безболезненно удалить стандартной процедурой удаления помеченных объектов.
Если подобных позиций в вашей базе накопилось много, ручная обработка каждого элемента неэффективна. В этом случае целесообразно написать простую программную процедуру (или использовать групповое изменение реквизитов с произвольным кодом), которая очистит наименования справочника от неразрывных пробелов и двойных пробелов.
Рассмотрим пример кода на встроенном языке 1С:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
ИсходноеНаименование = ОбъектНоменклатуры.Наименование;
// Шаг 1. Заменяем неразрывные пробелы на стандартные пробелы
НовоеНаименование = СтрЗаменить(ИсходноеНаименование, Символы.НПП, " ");
// Шаг 2. Удаляем лишние двойные пробелы, если они образовались
Пока Найти(НовоеНаименование, " ") > 0 Цикл
НовоеНаименование = СтрЗаменить(НовоеНаименование, " ", " ");
КонецЦикла;
// Шаг 3. Удаляем пробелы по краям строки
НовоеНаименование = СокрЛП(НовоеНаименование);
// Шаг 4. Перезаписываем объект только при наличии изменений
Если ИсходноеНаименование <> НовоеНаименование Тогда
ОбъектНоменклатуры.Наименование = НовоеНаименование;
ОбъектНоменклатуры.Записать();
КонецЕсли;
КонецЦикла;
После выполнения данного скрипта все скрытые символы будут удалены, а наименования приведены к стандартному виду. После этого типовой «Поиск и удаление дублей» начнет отрабатывать быстро и корректно.
Критически важно обратить внимание на особенности работы обработок по замене дублей в закрытых периодах!
Когда обработка поиска и удаления дублей производит замену ссылок в проведенных документах прошлых периодов, она осуществляет запись объектов в режиме ОбменДанными.Загрузка = Истина. Это технический режим, который позволяет обойти запреты редактирования и изменить реквизиты в документе без его повторного проведения.
Однако при этом возникает опасная коллизия: в самом документе ссылка на номенклатуру меняется на новую (правильную), но движения этого документа в регистрах накопления и регистре бухгалтерии остаются прежними — там продолжает фигурировать старая (удаляемая) номенклатура! Это приводит к следующим серьезным последствиям:
Для предотвращения подобных ошибок настоятельно рекомендуется после объединения дублей перепровести измененные документы (если период открыт) либо использовать специализированные обработки, которые выполняют точечную корректировку движений по регистрам накопления и бухгалтерии без полного перепроведения документов.