Как растянуть шапку отчета на СКД на всю ширину при динамической структуре?

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

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

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

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

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

Условное оформление в СКД позволяет задавать МинимальнаяШирина и МаксимальнаяШирина только для конкретных полей. Оно не умеет динамически высчитывать общую ширину сгенерированного табличного документа и применять ее к тексту заголовка. Как только пользователь меняет состав выводимых полей, ширина отчета меняется, а настройки условного оформления шапки остаются прежними, из-за чего верстка ломается.

Ограничения использования макетов компоновки

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

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

Решение 1: Программная постобработка результата (Рекомендуется)

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

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

  1. Первым делом мы отключаем стандартный вывод отчета платформой, устанавливая параметр СтандартнаяОбработка = Ложь.
  2. Далее мы программно формируем отчет в объект ТабличныйДокумент с помощью процессора компоновки данных и процессора вывода.
  3. После вывода анализируем полученный табличный документ. Наша задача — определить фактическое количество колонок (например, найдя крайнюю правую заполненную ячейку).
  4. Находим область нашей шапки.
  5. Применяем метод Объединить() к ячейкам заголовка, указывая диапазон от первой колонки до последней найденной колонки с данными. Текст при этом выравниваем по центру.

Этот алгоритм гарантированно растянет шапку на всю ширину отчета независимо от того, сколько колонок вывел пользователь.

Решение 2: Вывод данных через Таблицу Значений

Существует еще один надежный подход, который часто применяется для сложного форматирования в СКД. Мы можем скомпоновать результат не напрямую в табличный документ, а выгрузить его сначала в объект ТаблицаЗначений.

Посмотрим на алгоритм действий при этом методе:

  1. Программно инициируем компоновку данных и направляем вывод в объект ТаблицаЗначений.
  2. Система автоматически формирует таблицу со всеми колонками, которые запросил пользователь (включая динамически добавленные).
  3. Мы анализируем коллекцию колонок полученной таблицы значений и узнаем точное их количество.
  4. Затем мы программно, построчно (или используя построитель отчета), формируем итоговый ТабличныйДокумент. Сначала мы выводим шапку отчета, сразу программно объединяя ячейки на количество колонок таблицы значений.
  5. После вывода растянутой шапки мы выводим сами строки с данными из таблицы.

Дополнительно: Установка параметров заголовка программным путем

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

Пример поиска и установки параметра "Заголовок" в настройках компоновщика:


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

Подведем итоги: если ваш отчет предполагает изменение структуры пользователем, не тратьте время на условное оформление шапки — оно не справится с задачей расчета общей ширины. Оптимальным решением является перенос логики вывода в процедуру ПриКомпоновкеРезультата, где вы сможете программно вычислить ширину таблицы и объединить ячейки заголовка.

← На главную