При работе со справочником Номенклатура в типовых конфигурациях 1С (таких как «Управление торговлей 10.3», «Управление производственным предприятием 1.3» и схожих решениях) пользователи и разработчики часто сталкиваются с ситуацией, когда флаг Услуга, Набор или Комплект недоступен для редактирования интерактивно на форме элемента. Попробуем разобраться, почему система блокирует прямое изменение этих реквизитов и какими путями можно решить эту задачу.
Проанализируем устройство типового справочника. Флаги Услуга, Набор и Комплект в большинстве конфигураций не устанавливаются пользователем напрямую на форме. Их значения определяются реквизитом ВидНоменклатуры. В коде типовых конфигураций можно встретить процедуру инициализации этих свойств:
Процедура ЗаполнитьПризнакиПоВидуНоменклатуры()
Услуга = (ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга);
Набор = (ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор);
Комплект = (ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Комплект);
КонецПроцедуры
Таким образом, чтобы изменить признак услуги на товар в пользовательском режиме, необходимо изменить значение поля ВидНоменклатуры, выбрав вид с типом Товар. Однако в этот момент платформа часто выдает предупреждение: «Номенклатура используется в товародвижении» и блокирует запись.
Рассмотрим, почему возникает эта блокировка:
ТоварыНаСкладах, ПартииТоваровНаСкладах).Если по ошибочной номенклатуре уже зафиксированы движения в закрытых периодах, прямое изменение реквизита повлечет за собой ошибки при перепроведении документов и нестыковки в отчетах. Разберем по шагам правильную методическую последовательность действий:
Номенклатура с корректным реквизитом ВидНоменклатуры.Если документов с ошибочной позицией немного и отчетный период еще открыт, можно выполнить корректировку:
Если принято осознанное решение принудительно изменить булев признак или вид номенклатуры обработкой, рассмотрим программные варианты реализации.
Посмотрим на базовый пример изменения реквизита в объекте:
ОбъектНоменклатуры = СсылкаНаНоменклатуру.ПолучитьОбъект();
ОбъектНоменклатуры.Услуга = Ложь;
ОбъектНоменклатуры.Записать();
При попытке выполнить данный код для номенклатуры, участвующей в движениях, сработает типовая проверка в модуле объекта (в событии ПередЗаписью), и запись будет прервана платформой.
Чтобы обойти внутренние проверки конфигурации, в платформе 1С применяется свойство ОбменДанными.Загрузка. Проанализируем пример кода с подавлением проверок:
ОбъектНоменклатуры = СсылкаНаНоменклатуру.ПолучитьОбъект();
ОбъектНоменклатуры.ОбменДанными.Загрузка = Истина;
ОбъектНоменклатуры.Услуга = Ложь;
ОбъектНоменклатуры.Записать();
Важное предостережение: использование свойства ОбменДанными.Загрузка = Истина полностью отключает все типовые проверки в модуле объекта и подписках на события. Применять этот метод следует с крайней осторожностью. Если принудительно изменить признак услуги на товар без исправления старых документов товародвижения, первое же последующее перепроведение этих документов завершится критической ошибкой проведения из-за отсутствия складских остатков или несоответствия табличных частей.