Как программно получить список возможных значений дополнительного реквизита в 1С

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

При разработке в современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), таких как ERP, Управление торговлей 11 или Бухгалтерия предприятия 3.0, часто возникает задача работы с дополнительными реквизитами. Одной из типичных проблем является необходимость получить не просто значение, установленное у конкретного объекта (например, у номенклатуры), а весь перечень возможных значений, которые администратор системы задал для этого реквизита. Рассмотрим подробно, как устроена эта подсистема и как извлечь нужные данные программно.

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

Прежде чем переходить к написанию кода, проанализируем структуру метаданных. В 1С дополнительные реквизиты и сведения не являются «жестко» прописанными полями таблиц базы данных. Они хранятся в универсальных структурах:

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

Разберем ситуацию: нам нужно программно сформировать список выбора или обработать все возможные варианты реквизита «Вид кожи» для справочника номенклатуры. Выясним, как это сделать максимально эффективно.

Способ 1. Получение списка значений через запрос

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


ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Ссылка КАК Значение,
    ЗначенияСвойствОбъектов.Наименование КАК Наименование,
    ЗначенияСвойствОбъектов.ЭтоГруппа КАК ЭтоГруппа,
    ЗначенияСвойствОбъектов.Родитель КАК Родитель
ИЗ
    Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
    ЗначенияСвойствОбъектов.Владелец = &СсылкаНаСвойствоПВХ
    И ЗначенияСвойствОбъектов.ПометкаУдаления = ЛОЖЬ
УПОРЯДОЧИТЬ ПО
    Наименование

Обратим внимание на важные детали в этом запросе:

Способ 2. Программный поиск ссылки на доп. реквизит

Часто программисты сталкиваются с проблемой: «А как получить саму &СсылкаНаСвойствоПВХ?». Искать по наименованию НайтиПоНаименованию("Цвет") крайне не рекомендуется, так как пользователь может переименовать реквизит в интерфейсе, и ваш код сломается. Рассмотрим правильный путь через программный идентификатор (имя для разработчика).

В БСП у каждого дополнительного реквизита есть уникальный идентификатор. Чтобы найти реквизит для конкретного набора (например, для определенного вида номенклатуры), можно воспользоваться методами общего модуля УправлениеСвойствами. Проанализируем пример получения ссылки на свойство:


// Пример получения ссылки на дополнительный реквизит по его имени в конфигурации
ИмяНабора = "Справочник_Номенклатура_Общие"; // Или конкретный вид номенклатуры
ИмяСвойства = "Цвет_87f5466"; // Внутреннее имя, заданное в ПВХ

СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цвет");
// Но лучше использовать поиск по идентификатору, если БСП позволяет

Способ 3. Работа с иерархическими списками значений

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

1. Выполняем запрос (как в первом способе).
2. Выгружаем результат в дерево значений методом РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).

Посмотрим на пример кода, который выводит иерархию в консоль сообщений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Значения.Ссылка КАК Ссылка,
    |	Значения.Наименование КАК Наименование
    |ИЗ
    |	Справочник.ЗначенияСвойствОбъектов КАК Значения
    |ГДЕ
    |	Значения.Владелец = &Владелец
    |ИТОГИ ПО
    |	Ссылка ИЕРАРХИЯ";

Запрос.УстановитьПараметр("Владелец", НужныйДопРеквизит);
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

Пока Выборка.Следующий() Цикл
    // Выводим с отступами в зависимости от уровня
    Отступ = "";
    Для Сч = 1 По Выборка.Уровень() Цикл
        Отступ = Отступ + "---";
    КонецЦикла;
    Сообщить(Отступ + Выборка.Наименование);
КонецЦикла;

Особенности работы через Консоль запросов

Многие начинающие разработчики жалуются, что консоль запросов «не видит» дополнительные реквизиты в таблице Справочник.Номенклатура. Это происходит потому, что они не являются реальными реквизитами таблицы. Выясним причину и решение:

В запросе дополнительные реквизиты — это записи во вложенной таблице (табличной части). Чтобы увидеть значение конкретного реквизита для номенклатуры, нужно делать соединение:


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

Если же ваша цель — именно список возможных значений (как в исходном вопросе), то к таблице Справочник.Номенклатура обращаться вообще не нужно. Работайте напрямую со справочником ЗначенияСвойствОбъектов, как мы рассмотрели выше.

Использование функций БСП

В конфигурациях с БСП рекомендуется использовать программный интерфейс модуля УправлениеСвойствами. Это гарантирует корректную работу даже при обновлении системы. Рассмотрим полезные функции:

Резюме

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

  1. Определите ссылку на свойство в ПВХ ДополнительныеРеквизитыИСведения.
  2. Выполните запрос к Справочнику ЗначенияСвойствОбъектов с фильтром по полю Владелец.
  3. Если значения иерархические, обязательно учитывайте поля ЭтоГруппа и Родитель для корректного отображения структуры.

Такой подход является универсальным для большинства современных решений на платформе 1С:Предприятие 8.3 и позволяет гибко работать с динамически расширяемыми данными без изменения состава метаданных в конфигураторе. Для быстрого поиска готовых примеров и функций программного интерфейса подсистем можно воспользоваться справочником методов БСП.

← На главную