Как в СКД объединить колонки под общей шапкой?

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

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

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

Способ 1. Параллельные группировки колонок в настройках СКД

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

Давайте разберем по шагам, как настроить такую схему компоновки:

  1. Откроем схему компоновки данных и перейдем на вкладку Настройки.
  2. В структуре отчета (в окне настройки табличной части) найдем область Колонки.
  3. Вместо одной группировки по полю Месяц добавим две параллельные группировки по этому же полю. Для этого создадим первую группировку по полю Месяц, а затем рядом с ней (на том же уровне иерархии) создадим вторую группировку по полю Месяц.
  4. Выделим первую группировку Месяц и перейдем в нижнюю часть экрана на вкладку Выбранные поля. Снимем флаг Авто, чтобы управлять списком полей вручную.
  5. Нажмем правой кнопкой мыши в пустом пространстве выбранных полей и выберем пункт Новая группа.
  6. В появившемся окне укажем заголовок группы — «Количество». В свойстве Расположение обязательно выберем значение Горизонтально. Это укажет системе, что ресурсы внутри группы должны располагаться в одну строку.
  7. Перетащим внутрь созданной группы «Количество» только ресурс Количество.
  8. Теперь выделим вторую группировку Месяц в структуре колонок таблицы. Проделаем аналогичные действия: снимем флаг Авто во вкладке выбранных полей, добавим новую группу с заголовком «Сумма» (расположение — Горизонтально) и поместим туда только ресурс Сумма.

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

Способ 2. Трюк с точкой в пути к данным (для статических колонок)

Если наши колонки не формируются динамически по периодам, а являются заранее известными статическими полями (например, «План» и «Факт» для количества), мы можем применить изящный визуальный трюк через определение путей к данным.

Проанализируем этот метод детально:

  1. Перейдем на вкладку Наборы данных в схеме компоновки данных.
  2. Найдем колонку Путь к данным для тех полей, которые мы планируем объединить под общей шапкой.
  3. Изменим пути к данным, используя конструкцию с точкой. Например, вместо стандартного пути КоличествоПлан запишем Количество.План, а вместо КоличествоФакт запишем Количество.Факт.
  4. В колонке Заголовок для этих полей укажем понятные пользователю названия: «План» и «Факт».
  5. Перейдем в настройки отчета и добавим эти поля в выбранные поля.

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

Способ 3. Использование макетов компоновки данных

Использование вкладки Макеты — это классический и наиболее гибкий способ кастомизации внешнего вида отчета в 1С. Он позволяет полностью переопределить стандартное оформление ячеек шапки.

Рассмотрим, как настроить макет для нашей задачи:

  1. Перейдем на вкладку Макеты в конструкторе схемы компоновки данных.
  2. Нажмем кнопку Добавить макет и выберем тип Макет заголовка группировки.
  3. В появившемся окне выберем имя группировки колонок, для которой мы переопределяем заголовок (например, группировка по полю Месяц).
  4. В табличном документе макета выделим область ячеек, которая будет служить нашей новой шапкой. Объединим верхние ячейки стандартными средствами платформы (через контекстное меню или панель инструментов).
  5. В объединенной ячейке напишем текст, например: «Показатели за [МесяцПредставление]». Квадратные скобки укажут системе, что это параметр.
  6. В свойствах этой ячейки укажем тип заполнения — Параметр. В таблице параметров ниже свяжем параметр МесяцПредставление с реальным полем СКД Месяц.
  7. Под объединенной ячейкой нарисуем подразделы для наших ресурсов (например, «Количество» и «Сумма») и настроим границы и цвета ячеек.

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

Способ 4. Программная постобработка табличного документа

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

Выясним, как это реализовать. Нам потребуется переопределить стандартную обработку компоновки. Откроем модуль объекта отчета и напишем обработчик события ПриКомпоновкеРезультата:


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

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

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

← На главную