Как массово исправить дубли единиц измерения в 1С:Номенклатуре?

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

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

В этой статье мы подробно разберем, как устроена архитектура хранения единиц измерения в старых и классических конфигурациях 1С (таких как Управление торговлей 10.3, Комплексная автоматизация 1.1 или Управление производственным предприятием 1.3), выясним причину появления дублей и рассмотрим пошаговый алгоритм их устранения.

Архитектурная ловушка: Единицы измерения против Классификатора

Для начала проанализируем ситуацию и поймем, почему в вашей базе данных количество записей в справочнике единиц измерения совпало с количеством позиций номенклатуры. На самом деле, для большинства классических конфигураций 1С это абсолютно нормальное и штатное поведение системы. Дело в том, что в архитектуре 1С сосуществуют два разных объекта метаданных:

  1. Справочник КлассификаторЕдиницИзмерения (ОКЕИ). Это плоский общесистемный список, содержащий международные и национальные стандарты единиц измерения (штуки, килограммы, метры, литры). В идеальной базе данных этот справочник должен содержать строго уникальные записи. Для штук это одна запись с кодом 797.
  2. Справочник ЕдиницыИзмерения. Этот справочник является подчиненным по отношению к справочнику Номенклатура. Это означает, что у каждого элемента номенклатуры (например, «Мяч» или «Кроссовки») должен быть как минимум один собственный подчиненный элемент в справочнике ЕдиницыИзмерения.

Зачем нужна подчиненность? Подчиненный элемент хранит индивидуальные физические параметры конкретного товара в этой единице: вес, объем, штрихкод, а также коэффициент пересчета относительно базовой единицы. Например, для коробки печенья коэффициент будет равен 10, а для пачки — 1. Система физически не может использовать один и тот же элемент подчиненного справочника для разных товаров, так как у каждого товара свои уникальные весогабаритные характеристики.

Таким образом, если у вас в базе 4267 позиций номенклатуры, то наличие 4267 записей в подчиненном справочнике ЕдиницыИзмерения — это норма. Настоящая проблема заключается в том, что пользователи замусорили именно глобальный Классификатор единиц измерения, выбирая при создании номенклатуры некорректные или дублирующие записи («шт.», «ШТ»), либо некорректно заполнили текстовые наименования подчиненных единиц.

Пошаговый план исправления дублей в базе данных

Рассмотрим, как исправить накопившиеся ошибки и привести справочники в порядок. Все действия мы будем выполнять последовательно, двигаясь от простых инструментов к программным методам.

Шаг 1. Резервное копирование

Любые массовые изменения данных, особенно затрагивающие ключевые реквизиты номенклатуры и проведенные документы, могут привести к непредсказуемым последствиям. Перед началом работ обязательно создайте резервную копию информационной базы (файл .dt или средствами СУБД).

Шаг 2. Наведение порядка в Классификаторе единиц измерения

Наша первая задача — схлопнуть дублирующиеся записи в глобальном классификаторе. Для этого мы воспользуемся встроенным или внешним инструментом 1С.

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

Шаг 3. Программное выравнивание наименований подчиненных единиц

После слияния классификатора ссылки внутри подчиненного справочника ЕдиницыИзмерения будут вести на один правильный элемент классификатора. Однако текстовые наименования подчиненных единиц в карточках товаров по-прежнему могут отображаться криво (например, «шт.», «ШТ»), так как они записывались вручную при создании.

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

Посмотрим на пример кода, который решает эту задачу:


Выборка = Справочники.ЕдиницыИзмерения.Выбрать();
Пока Выборка.Следующий() Цикл
    // Проверим, заполнена ли связь с классификатором
    Если ЗначениеЗаполнено(Выборка.ЕдиницаПоКлассификатору) Тогда
        НаименованиеКлассификатора = Выборка.ЕдиницаПоКлассификатору.Наименование;
        
        // Если наименование в карточке отличается от классификатора, исправляем
        Если Выборка.Наименование <> НаименованиеКлассификатора Тогда
            ОбъектЕдиница = Выборка.ПолучитьОбъект();
            ОбъектЕдиница.Наименование = НаименованиеКлассификатора;
            
            Попытка
                ОбъектЕдиница.Записать();
                Сообщить("Успешно исправлена единица для товара: " + Выборка.Владелец);
            Исключение
                Сообщить("Не удалось записать единицу для товара: " + Выборка.Владелец + ". Ошибка: " + ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Этот простой скрипт быстро обойдет все 4267 записей, исправит текстовые опечатки пользователей и приведет визуальное отображение в карточках товаров к единому стандарту («шт» вместо «ш Т» или «шт.»).

Шаг 4. Слияние истинных дублей внутри одной номенклатуры

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

Для устранения таких ошибок мы можем использовать обработку поиска дублей, но уже с отбором по владельцу. Нам нужно найти элементы справочника ЕдиницыИзмерения, у которых совпадает реквизит Владелец (номенклатура) и реквизит ЕдиницаПоКлассификатору. После нахождения таких пар дубли необходимо заменить на один элемент, перепроведя документы движения.

Как предотвратить появление проблемы в будущем?

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

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

Таким образом, мы детально проанализировали внутреннее устройство работы с единицами измерения в 1С, выяснили причины возникновения дублей и навели полный порядок в информационной базе, защитив ее от будущих ошибок ввода.

← На главную