Переход со старых версий программ (например, «Торговля и Склад 7.7») на современные конфигурации вроде «Управление торговлей 11» (УТ 11) часто сопровождается трудностями переноса данных. Одной из ключевых проблем является перенос свойств номенклатуры. В старых решениях свойства хранились в отдельных подчиненных справочниках. В УТ 11, разработанной на базе Библиотеки стандартных подсистем (БСП), для этого используется механизм дополнительных реквизитов и сведений, тесно связанный с видами номенклатуры.
В этой статье мы подробно разберем, как устроена архитектура хранения свойств в УТ 11, и покажем готовые программные решения для трех основных задач: получения списка свойств, привязки нового свойства к виду номенклатуры и записи значений.
Прежде чем переходить к написанию кода, разберем структуру метаданных, которая отвечает за свойства в БСП:
ДополнительныеРеквизитыИСведения.НаборыДополнительныхРеквизитовИСведений. Каждому виду номенклатуры сопоставлен свой предопределенный или пользовательский набор свойств.ЗначенияСвойствОбъектов (или ЗначенияСвойствОбъектовИерархия), где реквизит Владелец ссылается на конкретное свойство из ПВХ.ДополнительныеРеквизиты (колонки Свойство и Значение).Рассмотрим два основных способа получения данных: быстрый способ через запрос (подходит для массовой обработки) и использование стандартного метода БСП (подходит для получения единичных данных).
Способ 1. Получение данных через запрос
Запрос к табличной части номенклатуры — самый производительный вариант, когда нужно быстро выгрузить или проанализировать свойства объекта.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
| НоменклатураДополнительныеРеквизиты.Значение КАК Значение
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Ссылка = &СсылкаНоменклатуры";
Запрос.УстановитьПараметр("СсылкаНоменклатуры", СсылкаНаНоменклатуру);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Свойство: " + Выборка.Свойство + " | Значение: " + Выборка.Значение);
КонецЦикла;
Способ 2. Использование программного интерфейса БСП
Если нам нужно оперативно получить значение конкретного свойства для одного объекта в коде, мы можем использовать функцию общего модуля БСП:
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаНоменклатуру, СсылкаНаСвойствоПВХ);
Чтобы новое свойство стало доступно для заполнения в карточке товара, его необходимо связать с набором свойств этого вида номенклатуры. Проанализируем по шагам, как это реализовать в коде:
ДополнительныеРеквизитыИСведения.НаборыДополнительныхРеквизитовИСведений (обычно имя набора соответствует шаблону справочника или конкретному виду номенклатуры).Посмотрим на пример кода:
// 1. Получаем объект набора свойств для конкретного вида номенклатуры
// Например, у вида номенклатуры есть реквизит НаборСвойств
НаборОбъект = ВидНоменклатурыСсылка.НаборСвойств.ПолучитьОбъект();
// 2. Проверяем, нет ли уже этого свойства в наборе
НайденныеСтроки = НаборОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", СсылкаНаСвойствоПВХ));
Если НайденныеСтроки.Количество() = 0 Тогда
// 3. Добавляем свойство в табличную часть набора
НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = СсылкаНаСвойствоПВХ;
НоваяСтрока.ПометкаУдаления = Ложь;
// Записываем измененный набор свойств
НаборОбъект.Записать();
КонецЕсли;
При записи значений важно учитывать, создаем ли мы новый объект с нуля или обновляем свойства уже существующего в базе элемента.
Вариант 1. Запись значений через стандартный метод БСП (для существующих объектов)
Этот способ является наиболее безопасным и рекомендуемым. Метод БСП автоматически заботится о блокировках, транзакциях, очистке неактуального кэша и проверках прав доступа.
// Подготовим таблицу с новыми значениями свойств
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаСвойств.Колонки.Добавить("Значение");
// Заполняем строку таблицы
НоваяСтрока = ТаблицаСвойств.Добавить();
НоваяСтрока.Свойство = СсылкаНаСвойствоПВХ;
НоваяСтрока.Значение = НовоеЗначениеРеквизита; // Ссылка на ЗначенияСвойствОбъектов или простой тип
// Вызываем стандартный метод БСП для записи свойств у объекта
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНаНоменклатуру, ТаблицаСвойств);
Вариант 2. Прямая запись при создании нового объекта номенклатуры
Если мы пишем обработку переноса данных и создаем новые элементы номенклатуры «на лету», удобнее заполнять табличную часть объекта напрямую перед его первой записью в базу данных. Выясним, как правильно работать со значениями типа «Дополнительное значение».
НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
НовыйТовар.Наименование = "Ремень приводной клиновой";
НовыйТовар.ВидНоменклатуры = СсылкаНаВидНоменклатуры;
// Добавляем строку в табличную часть дополнительных реквизитов объекта
НоваяСтрокаРеквизита = НовыйТовар.ДополнительныеРеквизиты.Добавить();
НоваяСтрокаРеквизита.Свойство = СсылкаНаСвойствоПВХ;
// Если значение свойства — элемент из списка, то предварительно создаем его в базе
// и обязательно назначаем Владельцем наше свойство из ПВХ
Если НужноеЗначениеТекстом <> "" Тогда
// Ищем, существует ли уже такое значение для данного свойства
ЗначениеСсылка = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(НужноеЗначениеТекстом, Истина, , СсылкаНаСвойствоПВХ);
Если ЗначениеСсылка.Пустая() Тогда
// Создаем новое значение в справочнике
НовоеЗначениеОбъект = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
НовоеЗначениеОбъект.Наименование = НужноеЗначениеТекстом;
НовоеЗначениеОбъект.Владелец = СсылкаНаСвойствоПВХ;
НовоеЗначениеОбъект.Записать();
ЗначениеСсылка = НовоеЗначениеОбъект.Ссылка;
КонецЕсли;
НоваяСтрокаРеквизита.Значение = ЗначениеСсылка;
КонецЕсли;
// Записываем карточку номенклатуры
НовыйТовар.Записать();
При работе с механизмами свойств в УТ 11 следует помнить о важных технических особенностях платформы и конфигурации:
ЗначенияСвойствОбъектов критически важно заполнять реквизит Владелец (указывая ссылку на свойство из ПВХ). Если этого не сделать, платформа не сможет сопоставить значения конкретному свойству, и при попытке интерактивного выбора в пользовательском интерфейсе список значений окажется пуст.ДополнительныеСведения. Для работы с ними используются другие методы чтения и записи БСП.