При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача сделать заголовки колонок динамическими. Классический пример: в отчете фигурируют показатели "Цена" и "Стоимость", и нам необходимо, чтобы в шапке таблицы отображалось не просто слово "Цена", а, например, "Цена (Оптовая)" или "Цена (Закупочная)" в зависимости от выбранного пользователем параметра ТипЦен.
Стандартными средствами на вкладке "Наборы данных" или "Выбранные поля" можно задать только статический заголовок. В данной статье мы подробно разберем, как обойти это ограничение, используя возможности макетов, программное управление настройками и хитрости условного оформления. Мы проанализируем ситуацию и выберем оптимальный метод для каждой конкретной задачи.
Многие разработчики ошибочно полагают, что создание макета в СКД требует отрисовки всей строки группировки. На самом деле, система позволяет создать макет только для одного конкретного заголовка. Это самый "чистый" и эффективный способ, так как он не требует написания кода и сохраняет все преимущества стандартного вывода.
Рассмотрим по шагам, как это реализовать:
Цена).Цена ([&ТипЦен]).ТипЦен. В колонке "Выражение" укажем наш параметр: ПараметрыДанных.ТипЦен.При таком подходе СКД при генерации отчета сама подставит строковое представление выбранного типа цен непосредственно в заголовок колонки. Это избавляет от необходимости перерисовывать макет всей группировки или таблицы.
Если по каким-то причинам использование макетов неудобно (например, логика формирования заголовка слишком сложная для простого шаблона), мы можем изменить заголовки программно. Рассмотрим ситуацию, когда нам нужно программно перебрать выбранные поля и подменить их свойства перед выводом отчета.
Обычно этот код размещают в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Давайте разберем пример кода, который ищет поля "Цена" и "Стоимость" и меняет их заголовки на значения, хранящиеся в переменных НовыйЗаголовокЦена и НовыйЗаголовокСтоимость:
// Сначала создадим соответствие доступных полей для быстрого поиска
ЗаголовкиПолей = Новый Соответствие;
Для Каждого ДоступноеПолеВыбора Из КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы Цикл
Если ДоступноеПолеВыбора.Заголовок = "Цена" Тогда
ЗаголовкиПолей.Вставить(ДоступноеПолеВыбора.Поле, НовыйЗаголовокЦена);
КонецЕсли;
Если ДоступноеПолеВыбора.Заголовок = "Стоимость" Тогда
ЗаголовкиПолей.Вставить(ДоступноеПолеВыбора.Поле, НовыйЗаголовокСтоимость);
КонецЕсли;
КонецЦикла;
// Теперь пройдем по фактически выбранным полям в настройках
Для Каждого ВыбранноеПоле Из КомпоновщикНастроек.Настройки.Выбор.Элементы Цикл
Если ТипЗнч(ВыбранноеПоле) = Тип("ВыбранноеПолеКомпоновкиДанных") Тогда
НовыйЗаголовок = ЗаголовкиПолей.Получить(ВыбранноеПоле.Поле);
Если НовыйЗаголовок <> Неопределено Тогда
ВыбранноеПоле.Заголовок = НовыйЗаголовок;
ВыбранноеПоле.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Важно помнить, что если пользователь в пользовательских настройках сам изменил заголовок, программный код может его перезаписать. Поэтому данный метод лучше использовать, когда заголовки должны жестко следовать логике параметров.
Выясним, можно ли использовать Условное оформление для решения задачи. К сожалению, в поле "Текст" условного оформления нельзя напрямую вписать формулу или подставить параметр. Однако, если количество возможных вариантов заголовка ограничено и заранее известно (например, только "Оптовая", "Розничная" и "Закупочная"), можно использовать следующий прием:
ПараметрыДанных.ТипЦен Равно Значение(Справочник.ТипыЦен.Оптовая).Цена.Для каждого типа цен придется создать отдельную строку оформления. Этот метод трудозатратный при большом количестве вариантов, но он полностью визуальный и не требует использования макетов или кода.
Проанализируем ситуацию, когда текст заголовка должен формироваться по очень сложной логике, которую невозможно уложить в простой шаблон. В этом случае мы можем совместить Способ 1 (Макет заголовка) и вызов функции из Общего модуля.
В ячейке макета заголовка с типом "Шаблон" мы можем написать конструкцию вида:
[ОбщийМодульОтчеты.СформироватьЗаголовокДляЦены(&ТипЦен)]
Где ОбщийМодульОтчеты — это модуль с установленным флагом "Вызов сервера" и "Клиент", а СформироватьЗаголовокДляЦены — экспортная функция, принимающая значение параметра и возвращающая строку.
Пример функции:
Функция СформироватьЗаголовокДляЦены(ТипЦенСсылка) Экспорт
Если ЗначениеЗаполнено(ТипЦенСсылка) Тогда
Возврат "Цена за " + Строка(ТипЦенСсылка);
Иначе
Возврат "Цена (тип не указан)";
КонецЕсли;
КонецФункции
Мы рассмотрели различные подходы к динамическому формированию заголовков в СКД. Подведем итог:
Помните, что гибкость СКД позволяет комбинировать эти методы. Правильный выбор инструмента поможет вам создавать профессиональные и понятные отчеты с минимальными затратами на поддержку кода.