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

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

В современных конфигурациях 1С (УНФ, ERP, УТ 11, БП 3.0), построенных на базе Библиотеки стандартных подсистем (БСП), механизм дополнительных реквизитов и сведений является крайне гибким инструментом. Однако у начинающих разработчиков часто возникают вопросы: как правильно обратиться к этим данным, где они физически хранятся и как найти конкретное значение (например, "Левый" или "Правый") для программной подстановки. В этой статье мы подробно разберем все способы решения данной задачи.

Различие в хранении: Дополнительные реквизиты vs Сведения

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

  1. Дополнительные реквизиты — они физически размещаются в табличной части ДополнительныеРеквизиты конкретного объекта (справочника или документа). Это позволяет хранить данные "внутри" объекта, но требует его перезаписи при изменении значения.
  2. Дополнительные сведения — хранятся в независимом регистре сведений ЗначенияСвойствОбъектов. Это удобно, когда нужно добавить информацию к объекту, не изменяя его версию и не блокируя его.

Разберем основные методы работы с этими данными.

Способ 1. Использование программного интерфейса БСП (рекомендуемый)

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

Рассмотрим ситуацию, когда нам нужно получить значение реквизита "Угол" у конкретного объекта:


// СсылкаНаОбъект - ссылка на документ или справочник
// ИмяСвойства - внутреннее имя или ссылка на ПланВидовХарактеристик
ЗначениеУгла = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаОбъект, "Угол");

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


МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Ссылка1);
МассивОбъектов.Добавить(Ссылка2);

ТаблицаЗначений = УправлениеСвойствами.ЗначенияСвойствОбъектов(МассивОбъектов, Ложь, Истина);

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

Способ 2. Поиск ссылки на конкретное значение ("Левый", "Правый")

Часто возникает задача не просто получить значение, которое уже записано в объекте, а найти ссылку на один из предопределенных вариантов значения (например, при загрузке данных из Excel). Рассмотрим, как найти ссылку на элемент "Левый" для свойства "Угол".

Важное предостережение: использование простого поиска НайтиПоНаименованию("Левый") крайне опасно. В справочнике ЗначенияСвойствОбъектов может быть десятки элементов с именем "Левый" для разных свойств (например, для "Угол" и "Сторона открывания").

Выясним правильный алгоритм поиска:

  1. Сначала находим само свойство в Плане видов характеристик.
  2. Затем ищем значение среди тех элементов, владельцем которых является наше свойство.

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


// 1. Находим само свойство (доп. реквизит)
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Угол");

// 2. Ищем значение "Левый" именно для этого свойства
ЗначениеСсылка = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Левый", Истина, , СвойствоСсылка);

Если ЗначениеСсылка.Пустая() Тогда
    Сообщить("Значение не найдено!");
КонецЕсли;

Способ 3. Получение значения через запрос

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


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

Запрос.УстановитьПараметр("СсылкаОбъекта", ОбъектСсылка);
Запрос.УстановитьПараметр("СвойствоСсылка", СвойствоСсылка);

РезультатЗапроса = Запрос.Выполнить();

Этот метод позволяет быстро вытянуть данные, не загружая в память весь объект СправочникОбъект. Обратите внимание, что если тип реквизита — "Число" или "Строка", в поле Значение будет лежать само число или текст. Если тип "Дополнительное значение", там будет ссылка.

Тонкости и советы по оптимизации

Разберем несколько важных нюансов, которые помогут сделать ваш код надежным:

Имя для разработчиков: В настройках дополнительного реквизита в интерфейсе 1С есть поле "Имя" (внутренний идентификатор). Мы рекомендуем искать свойство в коде не по синониму ("Угол"), который пользователь может переименовать, а именно по этому имени. Это сделает ваш код устойчивым к изменениям в пользовательском интерфейсе.

Кэширование: Если вы выполняете поиск свойств или их значений в цикле, обязательно используйте кэширование. Поиск ссылки на свойство (ПВХ) на каждой итерации цикла существенно замедляет работу. Рассмотрим пример с использованием структуры-кэша:


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

Для Каждого СтрокаТЧ Из ТаблицаДанных Цикл
    // Используем уже найденную ссылку из кэша
    ТекСвойство = КэшСвойств.Угол;
    // ... дальнейшая логика
КонецЦикла;

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

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

← На главную