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