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