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

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

При разработке в современных конфигурациях 1С, таких как «Комплексная автоматизация», «ERP Управление предприятием» или «Управление торговлей 11», программисты часто сталкиваются с подсистемой «Свойства» из Библиотеки стандартных подсистем (БСП). Одной из наиболее распространенных проблем является ситуация, когда программно записанное значение отображается в консоли запросов или в некоторых отчетах, но при открытии карточки объекта (например, номенклатуры) соответствующее поле на форме остается пустым. Рассмотрим подробно, почему это происходит и как правильно работать с дополнительными реквизитами различных типов.

Анализ проблемы: почему поле на форме остается пустым

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


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

На первый взгляд код кажется логичным, однако он содержит критическую ошибку в типизации данных. В системе 1С дополнительные реквизиты могут иметь различные типы: Строка, Число, Булево, Дата или Дополнительное значение. Последний тип является ссылочным.

Выясним причину странного поведения формы: если тип реквизита в ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения установлен как «Дополнительное значение», система ожидает не строку «Тестовый производитель», а ссылку на элемент специального справочника ЗначенияСвойствОбъектов. Когда мы передаем строку в поле, которое ожидает ссылку, платформа может физически записать эту строку в таблицу (поскольку тип значения в табличной части дополнительных реквизитов — Характеристика.ДополнительныеРеквизитыИСведения, который является составным), но механизмы отрисовки формы БСП не смогут сопоставить эту строку с элементами справочника и оставят поле пустым.

Работа со справочником ЗначенияСвойствОбъектов

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

Рассмотрим по шагам алгоритм правильного заполнения:

  1. Получаем ссылку на сам дополнительный реквизит (свойство).
  2. Проверяем наличие нужного нам значения в справочнике ЗначенияСвойствОбъектов с фильтром по владельцу.
  3. Если значение не найдено — создаем его программно.
  4. Передаем полученную ссылку в массив для записи через УправлениеСвойствами.ЗаписатьСвойстваУОбъекта.

Пример правильной реализации кода

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


Функция ПолучитьСсылкуНаДопЗначение(СвойствоСсылка, ЗначениеНаименование)
    
    // Ищем существующее значение среди подчиненных данному свойству
    СсылкаНаЗначение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(ЗначениеНаименование, Истина, , СвойствоСсылка);
    
    Если СсылкаНаЗначение.Пустая() Тогда
        // Если не нашли, создаем новое значение
        НовоеЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
        НовоеЗначение.Наименование = ЗначениеНаименование;
        НовоеЗначение.Владелец     = СвойствоСсылка;
        НовоеЗначение.Записать();
        
        СсылкаНаЗначение = НовоеЗначение.Ссылка;
    КонецЕсли;
    
    Возврат СсылкаНаЗначение;
    
КонецФункции

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

МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый Структура("Свойство, Значение", СвойствоПроизводитель, НужнаяСсылка));

УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНоменклатура, МассивРеквизитов);

Важный момент: использование метода НайтиПоНаименованию для поиска самого свойства (ПВХ) может быть опасным в тиражных решениях, так как наименования могут дублироваться. Рекомендуется использовать поиск по идентификатору или другие уникальные признаки.

Различия между реквизитами и сведениями

Разберем еще один нюанс, который часто путают разработчики. В 1С существует два механизма расширения свойств:

Метод УправлениеСвойствами.ЗаписатьСвойстваУОбъекта удобен тем, что он универсален. Он сам определяет, куда именно нужно записать данные — в табличную часть или в регистр сведений, основываясь на настройках самого свойства в плане видов характеристик.

Обновление данных на форме

Проанализируем ситуацию: вы запустили код, данные в базе обновились, но в открытой в данный момент карточке товара значение всё равно не появилось. Это происходит потому, что форма «не знает» об изменениях, совершенных непосредственно в базе данных.

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

Помните: правильная работа с типами данных — залог корректного отображения информации в интерфейсе 1С. Всегда проверяйте, какой тип значения ожидает конкретный реквизит в плане видов характеристик ДополнительныеРеквизитыИСведения.

← На главную