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