Почему не сохраняются дополнительные реквизиты номенклатуры в 1С и как это исправить?

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

Механизм дополнительных реквизитов и сведений Библиотеки стандартных подсистем (БСП) позволяет расширять состав данных объектов без изменения структуры метаданных в конфигураторе. Однако при работе с управляемыми формами разработчики нередко сталкиваются с ситуацией: дополнительный реквизит выводится на форму, пользователь заполняет его значение, но после нажатия кнопки записи и повторного открытия элемента поле снова оказывается пустым. Разберем подробнее, почему возникает такое поведение платформы и как правильно работать с дополнительными реквизитами как интерактивно, так и программно.

Причина 1. Пропущен вызов подсистемы свойств в модуле формы

Проанализируем механику работы дополнительных реквизитов в управляемом приложении. Элементы для ввода значений дополнительных реквизитов создаются на форме динамически в момент ее открытия, а сами значения временно помещаются в реквизиты формы. Чтобы введенные пользователем данные перенеслись обратно в табличную часть ДополнительныеРеквизиты объекта перед его непосредственной записью в базу данных, должен отработать специальный обработчик подсистемы БСП.

Если в типовой или доработанной конфигурации этот вызов отсутствует, данные формы просто не переносятся в объект при сохранении. Выясним, как восстановить корректную работу формы.

Разберем по шагам порядок исправления модуля формы элемента справочника:

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Перенос значений дополнительных реквизитов из элементов формы в табличную часть объекта
    УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
    
КонецПроцедуры

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

  1. В процедуре ПриСозданииНаСервере должен вызываться метод инициализации и динамического создания элементов формы: УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, ГруппаДляРеквизитов);
  2. В процедуре ПриЧтенииСозданииНаСервере или ПослеЗаписиНаСервере — методы заполнения и обновления значений;
  3. В процедуре ОбработкаОповещения — обновление состава отображаемых свойств при их изменении в общих настройках программы.

Причина 2. Особенности привязки к видам номенклатуры и наборам свойств

Если код формы содержит все необходимые вызовы, но реквизит по-прежнему сбрасывается или скрывается, рассмотрим системные настройки наборов свойств:

  1. Привязка к виду номенклатуры: В конфигурациях 1С:Управление торговлей, 1С:ERP и 1С:Комплексная автоматизация состав дополнительных реквизитов определяется реквизитом ВидНоменклатуры. Если реквизит добавлен в общий набор или в другой вид, при открытии номенклатуры с иным видом реквизит отображаться не будет.
  2. Смена вида номенклатуры: При изменении вида номенклатуры ранее сохраненные значения остаются в табличной части, но пропадают с экрана, так как отсутствуют в наборе свойств нового вида.
  3. Права доступа: Проверьте права текущего пользователя на чтение и запись плана видов характеристик ДополнительныеРеквизитыИСведения и справочника ЗначенияСвойствОбъектов.

Как программно заполнить и записать дополнительный реквизит

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

В объектах конфигурации значения дополнительных реквизитов хранятся в табличной части ДополнительныеРеквизиты. Для установки значения необходимо найти строку с нужным свойством (или добавить новую) и присвоить значение соответствующего типа.

Посмотрим на пример программной установки дополнительного реквизита:


// Получаем объект номенклатуры для редактирования
ОбъектНоменклатура = СсылкаНаНоменклатуру.ПолучитьОбъект();

// СсылкаНаСвойство — это ссылка на элемент ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения
// 1. Ищем существующую строку со свойством в табличной части
СтрокаТЧ = ОбъектНоменклатура.ДополнительныеРеквизиты.Найти(СсылкаНаСвойство, "Свойство");

Если СтрокаТЧ = Неопределено Тогда
    // Если свойства еще нет у объекта, добавляем новую строку
    СтрокаТЧ = ОбъектНоменклатура.ДополнительныеРеквизиты.Добавить();
    СтрокаТЧ.Свойство = СсылкаНаСвойство;
КонецЕсли;

// 2. Устанавливаем значение
// Если реквизит имеет тип "Значения свойств объектов", значение должно быть ссылкой на этот справочник
// Если реквизит числовой, строковый или булево — передается соответствующее примитивное значение
СтрокаТЧ.Значение = ЗначениеРеквизита;

// 3. Записываем объект
ОбъектНоменклатура.Записать();

Обратите внимание: если дополнительный реквизит имеет ссылочный тип (например, подчиненный справочнику свойств ЗначенияСвойствОбъектов), передача простого текста вместо ссылки приведет к ошибке типа или очистке значения при валидации. Значение свойства должно быть предварительно найдено или создано в справочнике ЗначенияСвойствОбъектов с указанием владельца — соответствующего элемента плана видов характеристик.

← На главную