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