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