Как в СКД вывести произвольный текст в заголовок колонки с помощью параметра?

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

При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача сделать заголовки колонок динамическими. Классический пример: в отчете фигурируют показатели "Цена" и "Стоимость", и нам необходимо, чтобы в шапке таблицы отображалось не просто слово "Цена", а, например, "Цена (Оптовая)" или "Цена (Закупочная)" в зависимости от выбранного пользователем параметра ТипЦен.

Стандартными средствами на вкладке "Наборы данных" или "Выбранные поля" можно задать только статический заголовок. В данной статье мы подробно разберем, как обойти это ограничение, используя возможности макетов, программное управление настройками и хитрости условного оформления. Мы проанализируем ситуацию и выберем оптимальный метод для каждой конкретной задачи.

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

Многие разработчики ошибочно полагают, что создание макета в СКД требует отрисовки всей строки группировки. На самом деле, система позволяет создать макет только для одного конкретного заголовка. Это самый "чистый" и эффективный способ, так как он не требует написания кода и сохраняет все преимущества стандартного вывода.

Рассмотрим по шагам, как это реализовать:

  1. Перейдем на закладку "Макеты" в схеме компоновки данных.
  2. Нажмем кнопку "Добавить" (пиктограмма с плюсом) и в выпадающем списке выберем пункт "Добавить макет заголовка поля".
  3. В появившемся окне выберем поле, заголовок которого нужно изменить (например, Цена).
  4. В области редактирования ячеек (табличный документ) выделим ячейку и в её свойствах установим тип заполнения "Шаблон" или "Параметр".
  5. Если мы выбрали "Шаблон", в тексте ячейки напишем: Цена ([&ТипЦен]).
  6. В нижней таблице параметров макета система автоматически создаст строку для ТипЦен. В колонке "Выражение" укажем наш параметр: ПараметрыДанных.ТипЦен.

При таком подходе СКД при генерации отчета сама подставит строковое представление выбранного типа цен непосредственно в заголовок колонки. Это избавляет от необходимости перерисовывать макет всей группировки или таблицы.

Способ 2. Программное изменение заголовков в Компоновщике настроек

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

Обычно этот код размещают в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Давайте разберем пример кода, который ищет поля "Цена" и "Стоимость" и меняет их заголовки на значения, хранящиеся в переменных НовыйЗаголовокЦена и НовыйЗаголовокСтоимость:


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

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

Важно помнить, что если пользователь в пользовательских настройках сам изменил заголовок, программный код может его перезаписать. Поэтому данный метод лучше использовать, когда заголовки должны жестко следовать логике параметров.

Способ 3. Условное оформление (Фиксированные варианты)

Выясним, можно ли использовать Условное оформление для решения задачи. К сожалению, в поле "Текст" условного оформления нельзя напрямую вписать формулу или подставить параметр. Однако, если количество возможных вариантов заголовка ограничено и заранее известно (например, только "Оптовая", "Розничная" и "Закупочная"), можно использовать следующий прием:

  1. Перейдем на вкладку "Настройки" -> "Условное оформление".
  2. Создадим новый элемент оформления.
  3. В поле "Оформление" установим желаемый текст в поле "Текст" (например, "Цена (Оптовая)").
  4. В поле "Условие" добавим проверку параметра: ПараметрыДанных.ТипЦен Равно Значение(Справочник.ТипыЦен.Оптовая).
  5. В поле "Оформляемые поля" выберем поле Цена.
  6. В "Области использования" обязательно поставим галочку только напротив пункта "В заголовке поля".

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

Способ 4. Использование функций общих модулей в макетах

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

В ячейке макета заголовка с типом "Шаблон" мы можем написать конструкцию вида:

[ОбщийМодульОтчеты.СформироватьЗаголовокДляЦены(&ТипЦен)]

Где ОбщийМодульОтчеты — это модуль с установленным флагом "Вызов сервера" и "Клиент", а СформироватьЗаголовокДляЦены — экспортная функция, принимающая значение параметра и возвращающая строку.

Пример функции:


Функция СформироватьЗаголовокДляЦены(ТипЦенСсылка) Экспорт
    Если ЗначениеЗаполнено(ТипЦенСсылка) Тогда
        Возврат "Цена за " + Строка(ТипЦенСсылка);
    Иначе
        Возврат "Цена (тип не указан)";
    КонецЕсли;
КонецФункции

Резюме и рекомендации

Мы рассмотрели различные подходы к динамическому формированию заголовков в СКД. Подведем итог:

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

← На главную