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