В процессе работы с большими базами данных (от 15 000 позиций и выше) часто возникает ситуация, когда один и тот же товар заводится в справочник несколько раз под разными именами. Это происходит из-за человеческого фактора: один поставщик присылает накладную с названием «Молоко 1л. 2.5% Простоквашино», а другой — «Молоко Простоквашино 1 литр 2,5%». В результате возникают «пересортица» в отчетах, неразбериха с остатками и сложности при продаже на кассе.
В данной статье мы подробно разберем, как решить эту проблему, используя штатные механизмы 1С, перенести все накопленные остатки на одну «правильную» карточку товара и навсегда «закрыть кран» для появления новых дублей.
Для начала проанализируем, как 1С обрабатывает удаление дублей. Главное опасение пользователей заключается в том, что при удалении «лишнего» товара пропадут чеки, поступления или остатки. Это не так. Стандартная обработка Поиск и удаление дублей работает по принципу замены ссылок.
Рассмотрим этот процесс подробнее: когда мы указываем системе «Оригинал» (то, что останется) и «Дубль» (то, что нужно убрать), программа обходит всю базу данных. Она находит все упоминания дубля в документах ПоступлениеТоваровУслуг, РеализацияТоваровУслуг, ЧекККМ и в регистрах сведений (цены) и накопления (остатки). Затем она просто подставляет в эти места ссылку на оригинал. Таким образом, документ остается неизменным по дате и сумме, но «смотрит» теперь на правильный товар.
Перед началом любых массовых операций с базой обязательно создадим резервную копию. Это критически важно, так как процесс замены ссылок в 15 тысячах позиций — операция необратимая и ресурсоемкая.
Разберем, как найти дубли:
Номенклатура.Система проанализирует справочник и выдаст список групп похожих товаров. Проанализируем ситуацию: программа может ошибиться и посчитать похожими «Молоко 2.5%» и «Молоко 3.2%». Нам нужно вручную просмотреть список и отметить галочками только те позиции, которые действительно являются одним и тем же товаром.
После того как дубли найдены, нам нужно назначить «Главный» товар. Обычно выбирается та карточка, у которой наиболее полное и правильное название или которая чаще всего использовалась в последнее время.
Нажмем кнопку Отметить как оригинал для выбранной позиции. Все остальные товары в группе станут «дублями». После нажатия кнопки Удалить дубли программа запустит процесс пересчета ссылок. Выясним причину, почему это может занять время: 1С должна проверить каждую таблицу базы данных. Для 15 000 позиций и накопленной истории продаж это может занять от 20 минут до нескольких часов. Рекомендуется проводить процедуру, когда в базе нет активных пользователей. Для ускорения процесса при работе с MS SQL можно воспользоваться инструментом для быстрого поиска и замены дублей средствами SQL.
Многих волнует вопрос: перенесутся ли остатки? Да, остатки перенесутся автоматически. В 1С остатки хранятся в регистрах накопления в разрезе измерений, одним из которых является Номенклатура. Когда обработка меняет ссылку в записи регистра с «Дубля» на «Оригинал», общее количество товара на складе по «Оригиналу» суммируется.
Посмотрим на пример с ценами. Если у дубля была цена 100 рублей, а у оригинала — 105, в регистре сведений ЦеныНоменклатуры могут возникнуть конфликты на одну и ту же дату. Стандартная обработка умеет «схлопывать» такие записи, оставляя актуальную информацию.
Что касается штрихкодов: после слияния к одной карточке «Оригинала» будут привязаны все штрихкоды удаленных дублей. Это очень удобно — какой бы старый штрихкод вы ни считали на кассе, программа поймет, что это наш «Оригинал».
Проанализируем ситуацию с закрытыми периодами. Если вы используете «1С:Бухгалтерия», замена номенклатуры в прошлых периодах может вызвать вопросы у системы при перепроведении документов. Хотя сами документы не перепроводятся физически (проводки остаются старыми), программа может зафиксировать изменение аналитики и предложить пересчитать себестоимость.
Рекомендация: Если вы объединяете дубли в бухгалтерской базе, делайте это либо в текущем периоде (до закрытия месяца), либо будьте готовы к тому, что средняя стоимость списания товаров за прошлые периоды может незначительно измениться из-за объединения разных «партий» в один котел.
Бессмысленно черпать воду из лодки, пока не заделана пробоина. Чтобы дубли не появлялись снова, рассмотрим следующие настройки:
Администрирование — Номенклатура) включите проверку уникальности штрихкодов. Если штрихкод уже есть в базе, система просто не даст создать вторую карточку с таким же кодом.НоменклатураПоставщиков. Программа будет знать, что «Молоко от Поставщика А» — это ваше «Молоко Простоквашино», и при загрузке документа сама подставит нужную ссылку.Если стандартного поиска недостаточно (например, нужно найти товары с переставленными словами «Молоко Простоквашино» и «Простоквашино Молоко»), можно воспользоваться доработками. Для этого часто применяют алгоритмы нечеткого поиска, такие как расстояние Левенштейна. Для этой задачи можно использовать инструмент для аудита базы и нечеткого поиска дублей по алгоритму Левенштейна.
В коде это может выглядеть примерно так (фрагмент для разработчика):
// Пример использования функции сравнения строк для поиска дублей
Для Каждого СтрокаНоменклатуры Из ТаблицаТоваров Цикл
СтепеньСходства = СтрПодобие(СтрокаНоменклатуры.Наименование, ИскомоеНаименование);
Если СтепеньСходства > 0.8 Тогда // 80% совпадения
Сообщить("Найден потенциальный дубль: " + СтрокаНоменклатуры.Наименование);
КонецЕсли;
КонецЦикла;
Мы выяснили, что процедура удаления дублей в 1С является безопасной при соблюдении правил (наличие бэкапа и ручной контроль). Она полностью решает задачу переноса остатков и сохранения истории продаж, так как фактически переписывает историю базы под новые правила. Настроив один раз контроль уникальности и справочник номенклатуры поставщиков, вы избавите себя от необходимости проводить такую «генеральную уборку» в будущем.