Как объединить несколько колонок в шапке СКД общим заголовком и скрыть их подзаголовки?

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

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

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

Способ 1: Использование механизма условного оформления

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

Давайте разберем этот процесс по шагам:

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

Важная особенность метода: Хотя текст подзаголовков визуально исчезнет (заменится пробелами), сама строка ячеек под общим заголовком физически останется в табличном документе. Визуально это будет выглядеть как пустая строка под главным названием группы. Если такой вариант визуально не устраивает, перейдем к следующим методам.

Способ 2: Настройка расположения полей в группе

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

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

  1. Перейдем на вкладку Настройки, выберем нужную группировку или отчет в целом и перейдем на детальную вкладку Выбранные поля.
  2. Выделим созданную ранее группу полей (которая объединяет наши колонки).
  3. В правой части окна настроек найдем свойство Расположение. По умолчанию там установлено значение «Авто» или «Горизонтально» (что приводит к созданию двухстрочной шапки с подзаголовками).
  4. Попробуем изменить это свойство на одно из следующих значений:
    • Вместе — при такой настройке все поля группы будут выведены в одной-единственной колонке, а их значения разделятся запятыми или другими системными разделителями. В качестве шапки будет выведено только имя группы. Этот вариант идеально подходит, если не требуется строгое разделение данных по ячейкам таблицы.
    • Вертикально — поля будут выводиться строго друг под другом в пределах одной колонки. Шапка у колонки будет одна (название группы), а подзаголовки отдельных элементов выводиться не будут.

Способ 3: Создание индивидуального макета заголовка

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

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

  1. Перейдем на вкладку Макеты в конструкторе СКД.
  2. Нажмем кнопку добавления нового макета и выберем пункт Добавить макет группировки.
  3. В окне выбора укажем имя той группировки полей, для которой мы переопределяем заголовок.
  4. В открывшемся поле табличного документа нарисуем шапку вручную. Объединим необходимые ячейки по горизонтали и напишем общий заголовок. Строку с подзаголовками мы просто не создаем.
  5. Для каждой ячейки, которая должна выводить данные, укажем тип заполнения Параметр и свяжем ее с соответствующим полем нашей компоновки данных. Например, для вывода параметров назначим имена параметров шапки в свойствах ячеек.

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

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

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

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


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

КонецПроцедуры

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

← На главную