При обслуживании и коррекции нормативно-справочной информации (НСИ) после миграций данных или некорректного ввода пользователи и администраторы 1С часто сталкиваются с ошибкой: «Единица является единицей хранения остатков для номенклатуры и уже участвует в товародвижении. Изменить эту единицу уже нельзя!». Выясним причину этой проблемы и подробно разберем практические способы её решения.
Проанализируем, почему система 1С блокирует редактирование единицы измерения у номенклатуры:
ПередЗаписью) запускается проверка наличия записей в регистрах накопления (учет товаров на складах, партии товаров, заказы и т.д.). Если номенклатура хотя бы раз участвовала в проводимых документах, система запрещает стандартное изменение реквизита ЕдиницаХраненияОстатков во избежание рассинхронизации остатков.ЕдиницыИзмерения могут некорректно связаться с дублирующимися записями номенклатуры. В таких случаях реквизит Владелец подчиненной единицы указывает на чужой элемент номенклатуры, из-за чего единица считается невалидной для текущей позиции.Рассмотрим наиболее простой и безопасный способ исправления ссылки без написания дополнительного кода — использование типовой обработки «Поиск и замена значений».
ЕдиницыИзмерения, принадлежащий текущей номенклатуре.Важное примечание: Перепроведение документов после такой замены обычно не требуется, так как обработка меняет ссылки напрямую во всех связанных объектах и движениях. Однако перед выполнением операции обязательно рекомендуется сделать резервную копию базы данных.
Если необходимо программно исправить некорректные связи реквизитов ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов (например, когда реквизит Владелец подчиненного справочника указывает на чужой элемент номенклатуры), разберем использование режима загрузки данных.
Для отключения бизнес-логики и проверок в модуле объекта при записи устанавливают свойство ОбменДанными.Загрузка = Истина.
Посмотрим на пример кода, который проверяет принадлежность единицы измерения к текущей номенклатуре и очищает ошибочные ссылки:
Отказ = Ложь;
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не Выборка.ЭтоГруппа Тогда
Объект = Выборка.ПолучитьОбъект();
Изменен = Ложь;
// Проверяем соответствие владельца единицы хранения остатков
Если ЗначениеЗаполнено(Объект.ЕдиницаХраненияОстатков)
И Объект.ЕдиницаХраненияОстатков.Владелец <> Объект.Ссылка Тогда
Объект.ЕдиницаХраненияОстатков = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
Изменен = Истина;
КонецЕсли;
// Проверяем соответствие владельца единицы для отчетов
Если ЗначениеЗаполнено(Объект.ЕдиницаДляОтчетов)
И Объект.ЕдиницаДляОтчетов.Владелец <> Объект.Ссылка Тогда
Объект.ЕдиницаДляОтчетов = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
Изменен = Истина;
КонецЕсли;
Если Изменен Тогда
Попытка
// Отключаем проверки при записи
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
Исключение
Сообщить("Ошибка при записи номенклатуры: " + Объект.Наименование);
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Проанализируем ситуацию, когда физический пересчет коэффициентов не требуется, а проблема заключается лишь в наименовании или некорректном представлении единицы (например, вместо «шт» должно быть указано «компл» с коэффициентом 1:1).
В этом случае нет необходимости менять саму ссылку на реквизит ЕдиницаХраненияОстатков в номенклатуре. Достаточно открыть связанный элемент подчиненного справочника ЕдиницыИзмерения и скорректировать его наименование или изменить ссылку на классификатор ОКЕИ. Все ранее проведенные документы сохранят целостность и корректность отображения.
Если по номенклатуре уже существуют движения за закрытые периоды, которые нельзя затрагивать или изменять напрямую, разберем методически правильный порядок действий:
Этот подход гарантирует сохранность исторического учета и отчетов за прошлые периоды без риска искажения данных в регистрах накопления.