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