Как свернуть многоуровневую шапку группировок в СКД без использования фиксированных макетов

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

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

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

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

Способ 1. Объединение полей в одну группировку (лучшее решение)

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

Такая структура неизбежно порождает трехэтажную шапку. Но что если нам не требуется подводить промежуточные итоги по каждому договору и документу в виде отдельных строк, а нужно просто вывести их в одной строке таблицы? Решение очень простое: объединить эти поля в рамках одной группировки.

Рассмотрим по шагам, как настроить такую группировку:

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

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

Способ 2. Трюк №3 — использование «Шапки-невидимки»

Иногда объединить поля в одну группировку невозможно по технологическим причинам (например, требуются промежуточные итоги по иерархии), но заголовки некоторых группировок все равно нужно скрыть. В сообществе разработчиков 1С этот прием известен как «Трюк №3».

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

Разберем по шагам реализацию этого приема:

  1. Откройте схему компоновки данных и перейдите на вкладку «Макеты».
  2. Нажмите кнопку «Добавить макет» (зеленый плюс) и выберите пункт «Добавить макет заголовка группировки».
  3. В появившемся диалоговом окне укажите:
    • Имя группировки: задайте уникальное имя латиницей, например, Невидимка.
    • Тип макета: выберите значение Заголовок.
  4. Важный нюанс! Поле «Область» для созданного макета заполнять и связывать с ячейками таблицы не нужно. Оставьте его абсолютно пустым.
  5. Перейдите обратно на вкладку «Настройки».
  6. Выберите в дереве настроек ту вложенную группировку, шапку которой необходимо скрыть. Кликните по ней правой кнопкой мыши и выберите команду «Установить имя».
  7. Введите имя Невидимка (точно так же, как назвали макет).

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

Способ 3. Группировка выбранных полей (для красивого объединения ресурсов)

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

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

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

Посмотрим, как это работает на практике. СКД автоматически сгенерирует красивую двухэтажную шапку: сверху будет одна общая ячейка «Стоимость», растянутая на две колонки, а под ней — «Заказано» и «Оплачено». Если пользователь в настройках отчета отключит флажок у поля «Стоимость заказано», общая ячейка «Стоимость» автоматически сожмется до размеров одной оставшейся колонки. Никакой жесткой фиксации, стопроцентная динамика!

Способ 4. Тонкая настройка системных полей размещения

Иногда избавиться от «лестничной» структуры шапки и строк помогает правильное перераспределение стандартных настроек компоновки. Обратите внимание на вкладку «Другие настройки» на уровне отчета или конкретной группировки. Здесь есть два критически важных параметра:

Способ 5. Программный вывод и постобработка (для самых сложных случаев)

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

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

Посмотрим на пример шаблона кода в модуле отчета:


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

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

Резюме

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

  1. Если поля логически находятся на одном уровне детализации — используйте Способ 1 (Объединение полей в одну группировку). Это самое простое и надежное решение.
  2. Если нужно скрыть конкретный заголовок — применяйте Способ 2 (Шапка-невидимка через пустой макет).
  3. Для группировки ресурсов всегда используйте встроенные возможности группировки выбранных полей (Способ 3).
  4. Если требуется тонкая доработка вывода «на лету» — пишите алгоритм постобработки в событии ПриКомпоновкеРезультата (Способ 5).
← На главную