При разработке отчетов на Системе компоновки данных (СКД) часто возникает задача сделать заголовок «умным». Например, если пользователь выбрал в параметрах определенное значение перечисления, заголовок должен содержать одну формулировку, а если выбрано другое — совершенно иную. Простого вывода значения параметра в заголовок часто недостаточно, так как требуется склонение слов, использование разных языков или добавление специфического текста. В этой статье мы подробно разберем, как реализовать динамический заголовок несколькими способами: от простой настройки макетов до программного управления процессом компоновки.
Этот метод считается наиболее быстрым и не требует написания сложного программного кода. Суть заключается в создании фиктивной группировки, которая будет выполнять роль заголовка.
Разберем этот метод по шагам:
ЗаголовокОтчета (через контекстное меню «Установить имя»).ЗаголовокОтчета.Отчет сформирован по параметру: [ТекстЗаголовка].ТекстЗаголовка напишем выражение. Например: ВЫБОР КОГДА &Параметр1 = Значение(Перечисление.ТипыНоменклатуры.Товар) ТОГДА "по товарам" ИНАЧЕ "по услугам" КОНЕЦ.Важный нюанс: по умолчанию такой заголовок будет выводиться столько раз, сколько строк в результате запроса. Чтобы заголовок вывелся один раз, убедитесь, что у группировки «ЗаголовокОтчета» нет выбранных полей и она не подчинена другим группировкам.
Если логика формирования заголовка слишком сложна для языка выражений СКД (например, требуется обращение к сторонним метаданным или сложная проверка прав), лучше всего использовать программный вывод. Рассмотрим пример кода для внешнего отчета.
Проанализируем процедуру в модуле объекта отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
// Получаем текущие настройки пользователя
ИтоговыеНастройки = КомпоновщикНастроек.ПолучитьНастройки();
// Устанавливаем программно стандартный параметр вывода "Заголовок"
ПараметрЗаголовок = ИтоговыеНастройки.ПараметрыВывода.Элементы.Найти("Title");
Если ПараметрЗаголовок <> Неопределено Тогда
ПараметрЗаголовок.Использование = Истина;
// Получаем значение нашего параметра
ЗначениеПараметра = ИтоговыеНастройки.ПараметрыДанных.Элементы.Найти("ВидОперации");
Если ЗначениеПараметра <> Неопределено Тогда
Если ЗначениеПараметра.Значение = Перечисления.ВидыОпераций.Продажа Тогда
ПараметрЗаголовок.Значение = "Отчет по продажам за период";
Иначе
ПараметрЗаголовок.Значение = "Отчет по возвратам товаров";
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Далее выполняем стандартный цикл компоновки макета и вывода
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ИтоговыеНастройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Этот способ хорош тем, что заголовок устанавливается в стандартное системное поле Title. Это гарантирует, что заголовок всегда будет находиться в самом верху, над всеми отборами и параметрами.
Рассмотрим ситуацию, когда нам нужно вывести заголовок на разных языках или правильно просклонять значение параметра (родительный падеж). В СКД это можно сделать с помощью вычисляемых полей или выражений параметров.
Для локализации (многоязычности) используем функцию НСтр(). В выражении параметра макета или вычисляемого поля пишем:
НСтр("ru='Отчет по магазину'; en='Store report'") + " " + Представление(&Магазин)
Для склонения можно использовать функции общих модулей. Если в вашей конфигурации есть модуль для работы со склонениями (например, в БСП это СклонениеПредставленийОбъектов), выражение может выглядеть так:
"Этот отчет построен для " + ОбщийМодульСклонения.Просклонять(Представление(&Параметр1), 2) + " и все ок"
Обратите внимание: чтобы функция общего модуля была доступна в СКД, у этого модуля должны быть установлены флаги «Вызов сервера» и «Клиент».
Выясним причину, почему кастомный заголовок (сделанный через группировку) часто оказывается ниже блока с выбранными фильтрами. В СКД стандартный порядок вывода такой: 1. Системный заголовок, 2. Параметры, 3. Отборы, 4. Тело отчета (группировки).
Как поднять кастомный заголовок выше отборов:
ПриКомпоновкеРезультата, где вы сами управляете порядком вывода областей в ТабличныйДокумент.Иногда удобно создать отдельное Вычисляемое поле, которое будет содержать готовую строку заголовка. В выражении этого поля мы можем прописать сложную логику ВЫБОР КОГДА....
Плюс этого метода в том, что поле можно выводить в любую часть отчета. Однако помните, что если вычисляемое поле зависит от параметров данных, оно будет вычисляться для каждой строки. Поэтому для заголовка такое поле лучше выводить в отдельной верхней группировке, как было описано в первом способе, предварительно установив ресурс Максимум(МоеПолеЗаголовка), чтобы избежать дублей текста при выводе детальных записей.
Проанализировав все варианты, можно сделать вывод: для простых текстовых замен идеально подходит Макет группировки, а для сложных условий с изменением структуры или использованием системных механизмов 1С — Программная обработка события компоновки.