Как выровнять макеты группировок шапки и подвала по правому краю в СКД?

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

Часто при разработке сложных отчетов в 1С возникает задача: вывести красиво оформленную шапку и подвал (например, с подписями ответственных лиц), которые должны быть четко выровнены по правому краю основной таблицы с данными. На первый взгляд, задача кажется тривиальной. Разработчик создает отдельные группировки для шапки и подвала, назначает им собственные макеты, но при формировании отчета обнаруживает, что правые края этих областей "разъезжаются" и не совпадают с правой границей основной таблицы. Рассмотрим подробнее, почему так происходит, и разберем по шагам все эффективные способы решения этой задачи.

Почему возникает проблема: анализируем ограничения архитектуры СКД

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

Платформа 1С физически не умеет автоматически синхронизировать ширину колонок пользовательского макета одной группировки с шириной колонок другой группировки. Если ваша основная таблица динамически меняет ширину (например, из-за изменения состава пользовательских полей, настроек видимости колонок или вывода динамической кросс-таблицы), макет шапки об этом "не знает". Следовательно, выровнять правый край стандартными визуальными настройками через панель свойств не получается — макет шапки остается зафиксированным в своих исходных границах.

Решение 1: Использование типов макета "Общий итог заголовок" и "Общий итог подвал"

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

  1. Откройте схему компоновки данных и перейдите на вкладку Макеты.
  2. Добавьте новый макет, выбрав Макет заголовка группировки (привяжите его к вашей основной группировке данных).
  3. Для шапки отчета выберите тип макета: Общий итог заголовок.
  4. Для подвала отчета добавьте еще один макет и выберите тип: Общий итог подвал.

Преимущество данного метода: В этом случае ваши шапка и подвал будут встроены непосредственно в общую сетку колонок основной таблицы. Ширина колонок будет единой на протяжении всего отчета. Теперь вы сможете просто задать выравнивание текста по правому краю в нужной ячейке макета, и оно автоматически и идеально совпадет с правым краем таблицы с данными.

Решение 2: Программное выравнивание областей в ПриКомпоновкеРезультата

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

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


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

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

Решение 3: Вывод результата в Таблицу Значений для сложных кросс-таблиц

Разберем ситуацию, когда количество колонок в отчете заранее неизвестно (например, при использовании переменных периодов в кросс-таблице). В таких случаях невозможно заранее нарисовать точный макет. Эксперты рекомендуют выводить результат компоновки не напрямую в ТабличныйДокумент, а в промежуточный объект ТаблицуЗначений.

  1. В обработчике переопределяем стандартную компоновку.
  2. Направляем результат процессора вывода в ТаблицаЗначений.
  3. Анализируем полученную таблицу: теперь мы точно знаем итоговое количество колонок и их состав.
  4. Программно формируем итоговый табличный документ, перенося данные из таблицы значений, и динамически формируем шапку и подвал с точным пониманием размеров.

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

Решение 4: Добавление пустых колонок (обходной маневр)

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

В модуле макета или даже визуально можно добавить в начало областей шапки и подвала пустые колонки. Это сместит нужные нам данные вправо. Если вы используете программный вывод, это можно делать динамически в обработчике ПриКомпоновкеМакета. Также иногда спасает применение условного оформления с параметром ГоризонтальноеПоложение (прижать вправо), но это сработает корректно только если ширина самой области совпадает с шириной таблицы.

Решение 5: Избавление от "паразитных" сдвигов колонок

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

  1. Перейдите в настройки группировки, которая отвечает за шапку.
  2. На вкладке Выбранные поля убедитесь, что снята галочка Авто.
  3. На вкладке Другие настройки установите параметр Макет оформления в значение Без оформления.

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

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

← На главную