Как изменить значения реквизитов Услуга, Набор и Комплект в справочнике Номенклатура?

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

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

Выясним причину: архитектурная логика типовых конфигураций

Проанализируем устройство типового справочника. Флаги Услуга, Набор и Комплект в большинстве конфигураций не устанавливаются пользователем напрямую на форме. Их значения определяются реквизитом ВидНоменклатуры. В коде типовых конфигураций можно встретить процедуру инициализации этих свойств:


Процедура ЗаполнитьПризнакиПоВидуНоменклатуры()
    Услуга   = (ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга);
    Набор    = (ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор);
    Комплект = (ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Комплект);
КонецПроцедуры

Таким образом, чтобы изменить признак услуги на товар в пользовательском режиме, необходимо изменить значение поля ВидНоменклатуры, выбрав вид с типом Товар. Однако в этот момент платформа часто выдает предупреждение: «Номенклатура используется в товародвижении» и блокирует запись.

Рассмотрим, почему возникает эта блокировка:

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

Способ 1. Создание новой номенклатурной позиции (Рекомендуемый методический путь)

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

  1. Создаем новый элемент в справочнике Номенклатура с корректным реквизитом ВидНоменклатуры.
  2. Старую позицию переименовываем (добавляем префикс [НЕ ИСПОЛЬЗОВАТЬ] или [ОШИБКА]), чтобы исключить ее выбор сотрудниками в дальнейшем, либо переносим в архивную группу.
  3. Все новые операции отражаем исключительно по созданной корректной позиции. Прошлые периоды остаются неизменными, что гарантирует сохранность данных бухгалтерского и складского учета.

Способ 2. Замена значений с корректировкой документов

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

  1. Создаем новую правильную позицию номенклатуры.
  2. С помощью сервисных инструментов («Поиск и замена значений») заменяем ссылки в базе.
  3. Открываем документы, где фигурировала эта номенклатура, и переносим строки из табличной части «Услуги» в табличную часть «Товары» (или наоборот). Без переноса строк между табличными частями простое изменение ссылки приведет к ошибкам проведения.
  4. Перепроводим документы и выполняем повторный расчет себестоимости.
  5. После освобождения старого элемента от ссылок его можно пометить на удаление.

Способ 3. Программное изменение реквизита через код 1С

Если принято осознанное решение принудительно изменить булев признак или вид номенклатуры обработкой, рассмотрим программные варианты реализации.

Посмотрим на базовый пример изменения реквизита в объекте:


ОбъектНоменклатуры = СсылкаНаНоменклатуру.ПолучитьОбъект();
ОбъектНоменклатуры.Услуга = Ложь;
ОбъектНоменклатуры.Записать();

При попытке выполнить данный код для номенклатуры, участвующей в движениях, сработает типовая проверка в модуле объекта (в событии ПередЗаписью), и запись будет прервана платформой.

Чтобы обойти внутренние проверки конфигурации, в платформе 1С применяется свойство ОбменДанными.Загрузка. Проанализируем пример кода с подавлением проверок:


ОбъектНоменклатуры = СсылкаНаНоменклатуру.ПолучитьОбъект();
ОбъектНоменклатуры.ОбменДанными.Загрузка = Истина;
ОбъектНоменклатуры.Услуга = Ложь;
ОбъектНоменклатуры.Записать();

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

← На главную