Как в СКД сделать общий заголовок над колонками динамических дат

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

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

В этой статье мы подробно разберем, как «окультурить» внешний вид отчета и добиться вывода единого заголовка над всеми динамическими колонками дат. Мы проанализируем три различных подхода: от чисто визуальных хитростей до программной обработки результата.

Метод 1. Программное объединение в ПриКомпоновкеРезультата

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

Для начала нам необходимо отказаться от стандартной обработки формирования. В модуле отчета находим или создаем предопределенную процедуру ПриКомпоновкеРезультата.

Проанализируем пример кода:


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

Важно помнить, что при использовании СтандартнаяОбработка = Ложь мы берем на себя ответственность за вывод всех данных. Этот метод позволяет не только объединять ячейки, но и динамически менять оформление (цвета, шрифты) в зависимости от финального размера таблицы.

Метод 2. Использование пользовательских макетов группировки

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

Разберем алгоритм настройки макета:

  1. Перейдем на закладку «Макеты» в конструкторе СКД.
  2. Добавим новый «Макет группировки». Выберем имя группировки, которая отвечает за вывод дат в колонках (например, ДатаПлатежа), и тип макета «Заголовок».
  3. В области макета нарисуем две строки. В нижней строке укажем параметр (саму дату), а в верхней строке напишем наш общий текст: «Даты ожидаемых платежей».
  4. Основная проблема здесь в том, что верхняя ячейка все равно будет дублироваться. Чтобы этого избежать, часто применяют прием с Условным оформлением или созданием фиктивной иерархической группировки выше дат.

Рассмотрим нюанс: чтобы верхняя надпись не повторялась, она должна принадлежать группировке более высокого уровня, которая охватывает все даты. Но так как даты — это динамические колонки одной группировки, «честного» способа сделать это через макет без объединения ячеек в коде практически нет. Однако можно использовать макет оформления для всей таблицы, чтобы задать общий стиль заголовков.

Метод 3. Центрирование текста через вычисляемые поля (без кодинга)

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

Выполним следующие шаги:

1. Вкладка «Вычисляемые поля». Создадим поле ПорядковыйНомерКолонки. В выражении ресурсов для него напишем:

ВычислитьВыражение("Количество(ДатаПлатежа)", , "Группировка", "Первая", "Текущая")

2. Создадим поле ОбщееКоличествоКолонок с выражением:

ВычислитьВыражение("Количество(ДатаПлатежа)", , "Группировка")

3. На вкладке «Настройки» в «Условном оформлении» добавим новое правило:

4. Добавим второе правило оформления: если ПорядковыйНомерКолонки НЕ равен середине, то Текст устанавливается в пустую строку. Таким образом, над всеми колонками, кроме центральной, будет пустота, а в центре красоваться наш заголовок. Визуально это выглядит почти как объединенная ячейка, особенно если убрать границы между ними.

Метод 4. Группировка выбранных полей (Спецзаголовок)

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

Рассмотрим порядок действий:

  1. Выделите поле (или поля), которые выводятся в колонках.
  2. Нажмите правую кнопку мыши и выберите пункт «Сгруппировать поля».
  3. В появившемся окне введите заголовок группы: «Даты ожидаемых платежей».
  4. В свойстве «Расположение» выберите «Вертикально» или «Спецзаголовок».

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

Выводы и рекомендации

Подведем итоги нашего анализа. Выбор метода зависит от ваших требований к отчету:

Помните, что работа с ТабличнымДокументом после вывода СКД — это мощный инструмент, который позволяет превратить стандартный «серый» отчет в профессиональный бизнес-инструмент.

← На главную