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