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

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

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

Способ 1. Запрос к табличной части объекта

Дополнительные реквизиты хранятся непосредственно в объекте (в нашем случае — в справочнике Номенклатура) в специальной табличной части с именем ДополнительныеРеквизиты. Это позволяет нам обратиться к данным напрямую через запрос. Разберем этот метод на примере получения веса номенклатуры — для этого подойдёт обработка для учета весовых и габаритных характеристик.

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


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

Запрос.УстановитьПараметр("Номенклатура", СсылкаНаНоменклатуру);
// Рекомендуется передавать ссылку на свойство, а не искать его по наименованию в тексте запроса
Запрос.УстановитьПараметр("Свойство", СсылкаНаДопРеквизит);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    ОбщийВес = Выборка.ЗначениеВеса;
КонецЕсли;

Важный нюанс: Обратите внимание, что поиск свойства по строковому наименованию (например, Свойство.Наименование = "Общий вес") внутри запроса является плохой практикой. Если пользователь изменит название реквизита в пользовательском режиме, ваш программный код перестанет работать. Правильнее всего один раз найти ссылку на свойство и передать её как параметр.

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

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

Проанализируем пример использования функции ПолучитьЗначенияСвойств:


// Подготовим массив объектов, для которых нужно получить данные
Объекты = Новый Массив;
Объекты.Добавить(НоменклатураСсылка);

// Получим таблицу со всеми дополнительными реквизитами объекта
ТаблицаСвойств = УправлениеСвойствами.ПолучитьЗначенияСвойств(Объекты);

// Теперь мы можем найти нужное нам свойство в полученной таблице
ПараметрыОтбора = Новый Структура("Свойство", СсылкаНаСвойствоВес);
НайденныеСтроки = ТаблицаСвойств.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() > 0 Тогда
    ЗначениеРеквизита = НайденныеСтроки[0].Значение;
КонецЕсли;

Этот способ хорош тем, что он инкапсулирует логику поиска. Даже если в будущих обновлениях платформы 1С или конфигурации изменится структура хранения свойств, ваш код останется работоспособным, так как он опирается на стандартный API.

Способ 3. Работа с «Именем для разработчика»

Выясним, как избежать привязки к переменчивым заголовкам реквизитов, которые видят пользователи. В настройках дополнительных реквизитов (вкладка «Дополнительно») есть поле «Имя для разработчика». Если заполнить это поле (например, значением ОбщийВесНоменклатуры), то поиск свойства станет максимально безопасным — для этого подойдёт универсальная выгрузка дополнительных реквизитов и характеристик.

Посмотрим, как найти свойство по этому внутреннему имени:


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

Если НЕ СсылкаНаСвойство.Пустая() Тогда
    // Теперь используем полученную ссылку в запросе или в функциях БСП
КонецЕсли;

Второй параметр Истина в методе НайтиПоНаименованию указывает системе, что поиск следует вести именно по уникальному имени для разработчика, а не по заголовку, который видит пользователь в интерфейсе.

Способ 4. Получение нескольких реквизитов одним запросом (Транспонирование)

Рассмотрим ситуацию, когда для одной позиции номенклатуры нам нужно получить сразу несколько характеристик, например: «Вес», «Ширина» и «Длина». Если делать обычное левое соединение с табличной частью, в результате запроса мы получим три строки для одной номенклатуры. Чтобы "развернуть" эти данные в одну строку с тремя колонками, применим метод группировки с условием — это ускоряет расчет весо-объемных характеристик для вывода в документы.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДопРеквизиты.Ссылка КАК Номенклатура,
    |	МАКСИМУМ(ВЫБОР
    |			КОГДА ДопРеквизиты.Свойство = &СвойствоВес
    |				ТОГДА ДопРеквизиты.Значение
    |			ИНАЧЕ 0
    |		КОНЕЦ) КАК Вес,
    |	МАКСИМУМ(ВЫБОР
    |			КОГДА ДопРеквизиты.Свойство = &СвойствоШирина
    |				ТОГДА ДопРеквизиты.Значение
    |			ИНАЧЕ 0
    |		КОНЕЦ) КАК Ширина
    |ИЗ
    |	Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
    |ГДЕ
    |	ДопРеквизиты.Ссылка В(&МассивНоменклатуры)
    |ГРУППИРОВАТЬ ПО
    |	ДопРеквизиты.Ссылка";

Запрос.УстановитьПараметр("МассивНоменклатуры", СписокТоваров);
Запрос.УстановитьПараметр("СвойствоВес", СсылкаВес);
Запрос.УстановитьПараметр("СвойствоШирина", СсылкаШирина);

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

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

Важные замечания по типам данных

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

  1. Типизация в запросах: Поле Значение в табличной части имеет составной тип. Если вы планируете выполнять арифметические операции с числовыми доп. реквизитами прямо в запросе, обязательно используйте оператор ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15, 3)).
  2. Реквизиты vs Сведения: Не путайте "Дополнительные реквизиты" и "Дополнительные сведения". Реквизиты хранятся в самом объекте (табличная часть), а сведения — в независимом регистре сведений ДополнительныеСведения. Если ваш запрос к табличной части ничего не возвращает, возможно, данные были настроены как "Сведения". В этом случае запрос нужно делать к регистру сведений по измерениям Объект и Свойство.
  3. Очистка данных: При прямых запросах к табличной части учитывайте, что там могут оставаться "фантомные" записи (например, если свойство было удалено из набора, но значения в карточках объектов остались). Функции БСП фильтруют такие записи автоматически, а в прямых запросах может потребоваться дополнительное соединение с таблицей НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты для проверки актуальности.

Используя предложенные методы, вы сможете эффективно и безопасно работать с дополнительными свойствами объектов в любой конфигурации на платформе 1С:Предприятие 8.3.

← На главную