Как изменить единицу хранения остатков номенклатуры, имеющей обороты в 1С

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

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

Причины возникновения проблемы

Проанализируем, почему система 1С блокирует редактирование единицы измерения у номенклатуры:

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

Способ 1. Стандартная обработка «Поиск и замена значений»

Рассмотрим наиболее простой и безопасный способ исправления ссылки без написания дополнительного кода — использование типовой обработки «Поиск и замена значений».

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

Важное примечание: Перепроведение документов после такой замены обычно не требуется, так как обработка меняет ссылки напрямую во всех связанных объектах и движениях. Однако перед выполнением операции обязательно рекомендуется сделать резервную копию базы данных.

Способ 2. Программная корректировка с отключением проверок

Если необходимо программно исправить некорректные связи реквизитов ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов (например, когда реквизит Владелец подчиненного справочника указывает на чужой элемент номенклатуры), разберем использование режима загрузки данных.

Для отключения бизнес-логики и проверок в модуле объекта при записи устанавливают свойство ОбменДанными.Загрузка = Истина.

Посмотрим на пример кода, который проверяет принадлежность единицы измерения к текущей номенклатуре и очищает ошибочные ссылки:


Отказ = Ложь;
Выборка = Справочники.Номенклатура.Выбрать();

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

Способ 3. Исправление наименования и классификатора без смены ссылки

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

В этом случае нет необходимости менять саму ссылку на реквизит ЕдиницаХраненияОстатков в номенклатуре. Достаточно открыть связанный элемент подчиненного справочника ЕдиницыИзмерения и скорректировать его наименование или изменить ссылку на классификатор ОКЕИ. Все ранее проведенные документы сохранят целостность и корректность отображения.

Способ 4. Методический подход через ввод остатков и пересортицу

Если по номенклатуре уже существуют движения за закрытые периоды, которые нельзя затрагивать или изменять напрямую, разберем методически правильный порядок действий:

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

Этот подход гарантирует сохранность исторического учета и отчетов за прошлые периоды без риска искажения данных в регистрах накопления.

← На главную