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