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