Как реализовать динамический заголовок отчета в СКД в зависимости от значения параметра?

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

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

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

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

Разберем этот метод по шагам:

  1. Перейдем на вкладку «Настройки» в схеме компоновки данных.
  2. В структуре отчета (левое дерево) добавим новую группировку выше всех остальных таблиц и группировок. Тип группировки — «Детальные записи».
  3. Установим этой группировке имя, например, ЗаголовокОтчета (через контекстное меню «Установить имя»).
  4. На вкладке «Выбранные поля» для этой конкретной группировки снимем флажок «Авто» и очистим список полей. Это нужно, чтобы группировка не выводила данные из самого запроса.
  5. Перейдем на вкладку «Макеты». Нажмем «Добавить макет группировки». В появившемся окне укажем имя группировки — ЗаголовокОтчета.
  6. В области ячеек выделим область для заголовка. В свойствах ячейки установим тип заполнения — «Шаблон».
  7. В тексте шаблона напишем выражение, например: Отчет сформирован по параметру: [ТекстЗаголовка].
  8. В параметрах макета (внизу вкладки) для параметра ТекстЗаголовка напишем выражение. Например: ВЫБОР КОГДА &Параметр1 = Значение(Перечисление.ТипыНоменклатуры.Товар) ТОГДА "по товарам" ИНАЧЕ "по услугам" КОНЕЦ.

Важный нюанс: по умолчанию такой заголовок будет выводиться столько раз, сколько строк в результате запроса. Чтобы заголовок вывелся один раз, убедитесь, что у группировки «ЗаголовокОтчета» нет выбранных полей и она не подчинена другим группировкам.

Способ 2. Программная установка заголовка в событии ПриКомпоновкеРезультата

Если логика формирования заголовка слишком сложна для языка выражений СКД (например, требуется обращение к сторонним метаданным или сложная проверка прав), лучше всего использовать программный вывод. Рассмотрим пример кода для внешнего отчета.

Проанализируем процедуру в модуле объекта отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
    
    // Получаем текущие настройки пользователя
    ИтоговыеНастройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Устанавливаем программно стандартный параметр вывода "Заголовок"
    ПараметрЗаголовок = ИтоговыеНастройки.ПараметрыВывода.Элементы.Найти("Title");
    Если ПараметрЗаголовок <> Неопределено Тогда
        ПараметрЗаголовок.Использование = Истина;
        
        // Получаем значение нашего параметра
        ЗначениеПараметра = ИтоговыеНастройки.ПараметрыДанных.Элементы.Найти("ВидОперации");
        
        Если ЗначениеПараметра <> Неопределено Тогда
            Если ЗначениеПараметра.Значение = Перечисления.ВидыОпераций.Продажа Тогда
                ПараметрЗаголовок.Значение = "Отчет по продажам за период";
            Иначе
                ПараметрЗаголовок.Значение = "Отчет по возвратам товаров";
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;

    // Далее выполняем стандартный цикл компоновки макета и вывода
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ИтоговыеНастройки, ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

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

Способ 3. Склонение и локализация заголовка

Рассмотрим ситуацию, когда нам нужно вывести заголовок на разных языках или правильно просклонять значение параметра (родительный падеж). В СКД это можно сделать с помощью вычисляемых полей или выражений параметров.

Для локализации (многоязычности) используем функцию НСтр(). В выражении параметра макета или вычисляемого поля пишем:

НСтр("ru='Отчет по магазину'; en='Store report'") + " " + Представление(&Магазин)

Для склонения можно использовать функции общих модулей. Если в вашей конфигурации есть модуль для работы со склонениями (например, в БСП это СклонениеПредставленийОбъектов), выражение может выглядеть так:

"Этот отчет построен для " + ОбщийМодульСклонения.Просклонять(Представление(&Параметр1), 2) + " и все ок"

Обратите внимание: чтобы функция общего модуля была доступна в СКД, у этого модуля должны быть установлены флаги «Вызов сервера» и «Клиент».

Проблема порядка вывода: заголовок ниже отборов

Выясним причину, почему кастомный заголовок (сделанный через группировку) часто оказывается ниже блока с выбранными фильтрами. В СКД стандартный порядок вывода такой: 1. Системный заголовок, 2. Параметры, 3. Отборы, 4. Тело отчета (группировки).

Как поднять кастомный заголовок выше отборов:

  1. Зайдем в настройки отчета, на вкладку «Другие настройки».
  2. Найдем параметр «Расположение отборов».
  3. Установим значение «В конце отчета» или «Не выводить».
  4. Если отборы все же нужны в начале, но под вашим заголовком, единственный надежный путь — полное программное формирование документа в ПриКомпоновкеРезультата, где вы сами управляете порядком вывода областей в ТабличныйДокумент.

Использование вычисляемых полей для логики

Иногда удобно создать отдельное Вычисляемое поле, которое будет содержать готовую строку заголовка. В выражении этого поля мы можем прописать сложную логику ВЫБОР КОГДА....

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

Проанализировав все варианты, можно сделать вывод: для простых текстовых замен идеально подходит Макет группировки, а для сложных условий с изменением структуры или использованием системных механизмов 1С — Программная обработка события компоновки.

← На главную