Как получить свойство номенклатуры в запросе и сгруппировать печатную форму в 1С?

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

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

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

1. Формирование запроса для получения свойства номенклатуры

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

Разберем пример получения конкретного свойства (например, «Температурный режим»):


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

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

Запрос.Текст = 
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	ПеремещениеТоваровТовары.НомерСтроки КАК НомерСтроки,
|	ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
|	ПеремещениеТоваровТовары.Номенклатура.Наименование КАК Наименование,
|	ВЫРАЗИТЬ(ПеремещениеТоваровТовары.Номенклатура.НаименованиеПолное КАК СТРОКА(250)) КАК Товар,
|	ПеремещениеТоваровТовары.Номенклатура.Код КАК Код,
|	ПеремещениеТоваровТовары.Номенклатура.Артикул КАК Артикул,
|	ПеремещениеТоваровТовары.Количество КАК Количество,
|	ПеремещениеТоваровТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|	ПеремещениеТоваровТовары.Цена КАК Цена,
|	ПеремещениеТоваровТовары.ХарактеристикаНоменклатуры КАК Характеристика,
|	ПеремещениеТоваровТовары.СерияНоменклатуры КАК Серия,
|	ЕСТЬNULL(ЗначенияСвойствОбъектов.Значение, ""Без температурного режима"") КАК ТемпературныйРежим
|ИЗ
|	Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|		ПО ПеремещениеТоваровТовары.Номенклатура = ЗначенияСвойствОбъектов.Объект
|			И ЗначенияСвойствОбъектов.Свойство = &Свойство
|ГДЕ
|	ПеремещениеТоваровТовары.Ссылка = &ТекущийДокумент
|УПОРЯДОЧИТЬ ПО
|	ТемпературныйРежим,
|	ПеремещениеТоваровТовары.НомерСтроки
|ИТОГИ ПО
|	ТемпературныйРежим";

Обратим внимание на ключевые моменты в написании этого запроса:

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

2. Настройка программного вывода группировок в макет

При стандартном выгрузке результата запроса в таблицу значений или при линейном обходе группировка не отобразится. Для формирования иерархического документа необходимо обходить результат запроса по группировкам с помощью методов Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).

Рассмотрим алгоритм вывода макета по шагам:

  1. Подготовить в макете две отдельные области: область для заголовка группировки (например, ШапкаГруппы) и область для детальных строк с товарами (СтрокаДетали).
  2. Выполнить запрос и получить верхнеуровневую выборку по группировкам.
  3. Во внешнем цикле выводить заголовок группы и заполнять параметры температурного режима.
  4. Во внутреннем цикле получать детальные записи для текущей группы и выводить строки товаров.

Пример кода вывода печатной формы:


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

// Получаем выборку верхнего уровня по группировке
ВыборкаГруппа = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Макет = ПолучитьМакет("Макет");
ОбластьШапкаГруппы = Макет.ПолучитьОбласть("ШапкаГруппы");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

ТабличныйДокумент = Новый ТабличныйДокумент;

Пока ВыборкаГруппа.Следующий() Цикл
	
	// Выводим заголовок группировки (например, "Температурный режим: +2...+8 C")
	ОбластьШапкаГруппы.Параметры.ТемпературныйРежимЗаголовок = ВыборкаГруппа.ТемпературныйРежим;
	ТабличныйДокумент.Вывести(ОбластьШапкаГруппы);
	
	// Получаем детальные записи, входящие в текущую группу
	ВыборкаДетали = ВыборкаГруппа.Выбрать();
	
	Пока ВыборкаДетали.Следующий() Цикл
		
		ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ВыборкаДетали);
		ТабличныйДокумент.Вывести(ОбластьСтрока);
		
	КонецЦикла;
	
КонецЦикла;

3. Особенности работы с макетом печатной формы

Проанализируем частые ошибки при проектировании макета внешней печатной формы:

  1. Пересечение областей макета: Убедитесь, что параметры области группы и детальной строки не перекрывают друг друга по колонкам. Если параметр вывода температурного режима поместить в колонки, занятые номером строки, данные не отобразятся или перекроются.
  2. Именование параметров в разных секциях: Если печатная форма содержит несколько видов строк (например, розничные цены и оптовые цены), параметр свойства должен быть добавлен во все соответствующие области макета. В противном случае при вызове альтернативной области система выдаст ошибку обращения к несуществующему параметру.
  3. Пробелы в наименованиях элементов: Если поиск свойства производится по наименованию через метод НайтиПоНаименованию(), проверьте отсутствие лишних пробелов в начале или конце наименования в справочнике. Добавление пробела часто используется пользователями для принудительной сортировки элементов в списках, что приводит к ненайденным ссылкам в коде.

4. Повышение надежности получения свойств

Поиск объектов по наименованию (НайтиПоНаименованию("Температурный режим")) является потенциально уязвимым решением, так как пользователь базы данных может переименовать свойство. Для повышения устойчивости решения рекомендуются следующие подходы:

← На главную