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

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

При программном заполнении дополнительных свойств номенклатуры (например, при парсинге файлов XML или подготовке данных для выгрузки на сайт 1С-Битрикс) разработчики часто сталкиваются со следующей проблемой. Код отрабатывает без ошибок, данные прописываются в регистр сведений, и значение даже визуально появляется на форме номенклатуры. Однако при клике по полю или открытии карточки значение характеристики оказывается пустым.

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

Выясним причину: почему сбрасывается значение свойства?

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

  1. План видов характеристик (ПВХ) СвойстваОбъектов — определяет сам вид свойства (например, «Детальная картинка», «Цвет», «Размер») и допустимый тип данных для этого свойства.
  2. Регистр сведений ЗначенияСвойствОбъектов — хранит конкретные значения свойств для каждого элемента справочника Номенклатура (измерение Объект).

Главная причина очистки значения: реквизит ТипЗначения в элементе ПВХ СвойстваОбъектов содержит объект ОписаниеТипов. Если вы пытаетесь программно записать в регистр значение (например, строку с текстом или ссылкой на файл "image.jpg"), но в самом элементе ПВХ для этого свойства задан другой тип (например, СправочникСсылка.ЗначенияСвойствОбъектов), платформа 1С при чтении или отображении данных автоматически приведен значение к пустому типу Неопределено.

Разберем по шагам порядок настройки и записи свойств

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

Шаг 1. Проверка и настройка ПВХ «СвойстваОбъектов»

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

  1. Перейдем в элемент Плана видов характеристик СвойстваОбъектов (например, через меню «Операции» — «План видов характеристик»).
  2. Найдем нужное свойство (например, «Детальная картинка»).
  3. Убедимся, что в поле Назначение выбран справочник Номенклатура.
  4. Проверим поле Тип значения:

    Если вы планируете хранить текстовый путь к файлу или ссылку строкой, необходимо выбрать тип Строка.

    Если свойство предполагают выбор из предопределенного списка значений, задайте тип СправочникСсылка.ЗначенияСвойствОбъектов.

  5. Сохраним изменения в элементе ПВХ.

Шаг 2. Корректная программная запись в регистр сведений

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

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


ВидСвойства = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Детальная картинка");

Если ЗначениеЗаполнено(ВидСвойства) Тогда
    
    // Создаем менеджер записи для работы с конкретной строкой регистра
    Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    
    // Сначала задаем ключевые измерения
    Запись.Объект   = НоменклатурнаяПозиция.Ссылка;
    Запись.Свойство = ВидСвойства;
    
    // Читаем существующую запись из БД по заданным измерениям
    Запись.Прочитать();
    
    // Засваиваем значение (должно соответствовать ТипуЗначения из ПВХ!)
    Запись.Значение = СтрXML.ДетальнаяКартинка; // Строковое значение
    
    // Записываем данные с замещением
    Запись.Записать(Истина);
    
КонецЕсли;

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


// Пример создания значения свойства, если тип свойства - Справочник.ЗначенияСвойствОбъектов
ЗначениеНаименование = СокрЛП(СтрXML.ЗначениеСвойства);

ЗначениеСсылка = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(ЗначениеНаименование, Истина, , ВидСвойства);

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

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

Важные особенности выгрузки изображений на сайт 1С-Битрикс

Посмотрим на практический нюанс при интеграции с веб-сайтами. Если ваша цель — передача детальных картинок номенклатуры в Битрикс, обратите внимание на следующий момент:

  1. Простая запись текстового пути к файлу в текстовое свойство номенклатуры передаст на сайт лишь текстовую строку. Сам файл изображения при этом не попадет в архив обмена CommerceML.
  2. Стандартный модуль обмена 1С-Битрикс для передачи файлов картинок использует штатное хранилище присоединяемых файлов конфигурации:

    В конфигурациях УТ 10.3 и УПП — справочник ХранилищеДополнительнойИнформации.

    В современных конфигурациях на БСП (УТ 11, КА 2, ERP) — подчиненный справочник НоменклатураПрисоединенныеФайлы.

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

← На главную