Как программно получить, создать и установить дополнительные реквизиты номенклатуры в 1С:Управление торговлей 11?

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

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

В этой статье мы подробно разберем, как устроена архитектура хранения свойств в УТ 11, и покажем готовые программные решения для трех основных задач: получения списка свойств, привязки нового свойства к виду номенклатуры и записи значений.

Архитектура хранения дополнительных реквизитов в УТ 11

Прежде чем переходить к написанию кода, разберем структуру метаданных, которая отвечает за свойства в БСП:

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

Решение А: Программное получение списка свойств и их значений у номенклатуры

Рассмотрим два основных способа получения данных: быстрый способ через запрос (подходит для массовой обработки) и использование стандартного метода БСП (подходит для получения единичных данных).

Способ 1. Получение данных через запрос

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
    |	НоменклатураДополнительныеРеквизиты.Значение КАК Значение
    |ИЗ
    |	Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    |ГДЕ
    |	НоменклатураДополнительныеРеквизиты.Ссылка = &СсылкаНоменклатуры";

Запрос.УстановитьПараметр("СсылкаНоменклатуры", СсылкаНаНоменклатуру);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("Свойство: " + Выборка.Свойство + " | Значение: " + Выборка.Значение);
КонецЦикла;

Способ 2. Использование программного интерфейса БСП

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


ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаНоменклатуру, СсылкаНаСвойствоПВХ);

Решение Б: Программное добавление нового свойства к виду номенклатуры

Чтобы новое свойство стало доступно для заполнения в карточке товара, его необходимо связать с набором свойств этого вида номенклатуры. Проанализируем по шагам, как это реализовать в коде:

  1. Создаем или находим свойство в плане видов характеристик ДополнительныеРеквизитыИСведения.
  2. Находим нужный набор в справочнике НаборыДополнительныхРеквизитовИСведений (обычно имя набора соответствует шаблону справочника или конкретному виду номенклатуры).
  3. Добавляем строку в табличную часть набора свойств.

Посмотрим на пример кода:


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

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

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

Решение В: Программное присвоение значения свойству номенклатуры

При записи значений важно учитывать, создаем ли мы новый объект с нуля или обновляем свойства уже существующего в базе элемента.

Вариант 1. Запись значений через стандартный метод БСП (для существующих объектов)

Этот способ является наиболее безопасным и рекомендуемым. Метод БСП автоматически заботится о блокировках, транзакциях, очистке неактуального кэша и проверках прав доступа.


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

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

// Вызываем стандартный метод БСП для записи свойств у объекта
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНаНоменклатуру, ТаблицаСвойств);

Вариант 2. Прямая запись при создании нового объекта номенклатуры

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


НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
НовыйТовар.Наименование = "Ремень приводной клиновой";
НовыйТовар.ВидНоменклатуры = СсылкаНаВидНоменклатуры;

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

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

// Записываем карточку номенклатуры
НовыйТовар.Записать();

Важные нюансы и ограничения платформы

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

← На главную