Как сгруппировать несколько полей на одном уровне в СКД без отображения лишних заголовков групп в шапке?

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

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

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

В чем суть проблемы и почему так происходит?

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

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

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

---

Способ 1. Настройка выбранных полей на уровне конкретной группировки (без макетов)

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

Рассмотрим этот процесс по шагам:

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

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

---

Способ 2. Программная пост-обработка в событии ПриКомпоновкеРезультата

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

Суть метода заключается в том, что мы намеренно задаем группам уникальные технические заголовки (например, ##Скрыть1## и ##Скрыть2##). Благодаря уникальности имен СКД не объединит наши колонки. А после вывода отчета мы найдем эти маркеры в табличном документе и аккуратно их «зачистим».

Разберем по шагам реализацию этого механизма в модуле объекта отчета:

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

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

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

---

Способ 3. Визуальная маскировка через условное оформление

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

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

Для этого выполним следующие действия:

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

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

---

Способ 4. «Шапка-невидимка» через минимальное использование макетов

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

Рассмотрим этот изящный прием подробнее:

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

Что произойдет при выводе отчета? СКД, дойдя до вывода шапки для группировки ИмяМоейГруппировки, обратится к макету и увидит, что он пустой. Система просто проигнорирует вывод этой части шапки, при этом само тело таблицы с детальными записями и показателями выведется стандартным автоматическим образом. Мы получим красивую таблицу без лишних строк в шапке, сохранив при этом работоспособность пользовательских настроек.

---

Резюме и рекомендации

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

← На главную