При активной работе множества пользователей в информационных базах 1С часто возникает классическая проблема засорения нормативно-справочной информации (НСИ). Типичный сценарий: сотрудники при создании новых позиций номенклатуры вручную вводят единицы измерения, не проверяя их наличие в системе. В результате в базе появляется огромное количество дублирующих записей с различным написанием: «шт», «шт.», «ШТ», «ш Т» и так далее.
В этой статье мы подробно разберем, как устроена архитектура хранения единиц измерения в старых и классических конфигурациях 1С (таких как Управление торговлей 10.3, Комплексная автоматизация 1.1 или Управление производственным предприятием 1.3), выясним причину появления дублей и рассмотрим пошаговый алгоритм их устранения.
Для начала проанализируем ситуацию и поймем, почему в вашей базе данных количество записей в справочнике единиц измерения совпало с количеством позиций номенклатуры. На самом деле, для большинства классических конфигураций 1С это абсолютно нормальное и штатное поведение системы. Дело в том, что в архитектуре 1С сосуществуют два разных объекта метаданных:
КлассификаторЕдиницИзмерения (ОКЕИ). Это плоский общесистемный список, содержащий международные и национальные стандарты единиц измерения (штуки, килограммы, метры, литры). В идеальной базе данных этот справочник должен содержать строго уникальные записи. Для штук это одна запись с кодом 797.ЕдиницыИзмерения. Этот справочник является подчиненным по отношению к справочнику Номенклатура. Это означает, что у каждого элемента номенклатуры (например, «Мяч» или «Кроссовки») должен быть как минимум один собственный подчиненный элемент в справочнике ЕдиницыИзмерения.Зачем нужна подчиненность? Подчиненный элемент хранит индивидуальные физические параметры конкретного товара в этой единице: вес, объем, штрихкод, а также коэффициент пересчета относительно базовой единицы. Например, для коробки печенья коэффициент будет равен 10, а для пачки — 1. Система физически не может использовать один и тот же элемент подчиненного справочника для разных товаров, так как у каждого товара свои уникальные весогабаритные характеристики.
Таким образом, если у вас в базе 4267 позиций номенклатуры, то наличие 4267 записей в подчиненном справочнике ЕдиницыИзмерения — это норма. Настоящая проблема заключается в том, что пользователи замусорили именно глобальный Классификатор единиц измерения, выбирая при создании номенклатуры некорректные или дублирующие записи («шт.», «ШТ»), либо некорректно заполнили текстовые наименования подчиненных единиц.
Рассмотрим, как исправить накопившиеся ошибки и привести справочники в порядок. Все действия мы будем выполнять последовательно, двигаясь от простых инструментов к программным методам.
Любые массовые изменения данных, особенно затрагивающие ключевые реквизиты номенклатуры и проведенные документы, могут привести к непредсказуемым последствиям. Перед началом работ обязательно создайте резервную копию информационной базы (файл .dt или средствами СУБД).
Наша первая задача — схлопнуть дублирующиеся записи в глобальном классификаторе. Для этого мы воспользуемся встроенным или внешним инструментом 1С.
КлассификаторЕдиницИзмерения.797).ЕдиницыИзмерения, ссылающиеся на дубли, перенаправит их ссылки на выбранный эталон, а сами дубли в классификаторе пометит на удаление.После слияния классификатора ссылки внутри подчиненного справочника ЕдиницыИзмерения будут вести на один правильный элемент классификатора. Однако текстовые наименования подчиненных единиц в карточках товаров по-прежнему могут отображаться криво (например, «шт.», «ШТ»), так как они записывались вручную при создании.
Чтобы быстро исправить это визуальное несоответствие, напишем и выполним простую программную обработку. Мы переберем все элементы справочника ЕдиницыИзмерения и синхронизируем их наименования с наименованием родительского элемента из классификатора.
Посмотрим на пример кода, который решает эту задачу:
Выборка = Справочники.ЕдиницыИзмерения.Выбрать();
Пока Выборка.Следующий() Цикл
// Проверим, заполнена ли связь с классификатором
Если ЗначениеЗаполнено(Выборка.ЕдиницаПоКлассификатору) Тогда
НаименованиеКлассификатора = Выборка.ЕдиницаПоКлассификатору.Наименование;
// Если наименование в карточке отличается от классификатора, исправляем
Если Выборка.Наименование <> НаименованиеКлассификатора Тогда
ОбъектЕдиница = Выборка.ПолучитьОбъект();
ОбъектЕдиница.Наименование = НаименованиеКлассификатора;
Попытка
ОбъектЕдиница.Записать();
Сообщить("Успешно исправлена единица для товара: " + Выборка.Владелец);
Исключение
Сообщить("Не удалось записать единицу для товара: " + Выборка.Владелец + ". Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Этот простой скрипт быстро обойдет все 4267 записей, исправит текстовые опечатки пользователей и приведет визуальное отображение в карточках товаров к единому стандарту («шт» вместо «ш Т» или «шт.»).
Иногда пользователи совершают критическую ошибку: создают для одной и той же номенклатуры две абсолютно одинаковые подчиненные единицы (например, две записи «шт» с коэффициентом 1). Это приводит к путанице в документах и отчетах.
Для устранения таких ошибок мы можем использовать обработку поиска дублей, но уже с отбором по владельцу. Нам нужно найти элементы справочника ЕдиницыИзмерения, у которых совпадает реквизит Владелец (номенклатура) и реквизит ЕдиницаПоКлассификатору. После нахождения таких пар дубли необходимо заменить на один элемент, перепроведя документы движения.
Очистить базу — это лишь половина дела. Если не настроить систему контроля, пользователи очень быстро вернут справочники в исходное хаотичное состояние. Чтобы предотвратить повторное появление дублей, внедрим следующие организационные и технические меры:
КлассификаторЕдиницИзмерения. Добавлять новые единицы в классификатор должен исключительно ответственный администратор НСИ (нормативно-справочной информации) строго по общегосударственному классификатору ОКЕИ.Таким образом, мы детально проанализировали внутреннее устройство работы с единицами измерения в 1С, выяснили причины возникновения дублей и навели полный порядок в информационной базе, защитив ее от будущих ошибок ввода.