Как в СКД заполнить пустую группировку заголовками ресурсов или скрыть ненужную колонку?

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

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

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

Почему возникает проблема «пустой колонки»?

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

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


Способ №1. Использование группировки «Дополнительная информация» (Решение проблемы)

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

Разберем по шагам, как настроить этот механизм:

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

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


Способ №2. Группировка выбранных полей (Альтернативный подход)

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

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

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

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


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

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

Рассмотрим алгоритм создания индивидуального макета:

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

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


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

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

Для этого мы переопределяем стандартный вывод отчета в модуле объекта. Проанализируем пример кода, который выполняет программный вывод и последующее объединение пустых ячеек:


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

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

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

← На главную