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