Как программно развернуть или свернуть определенную строку в Табличном документе 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При создании сложных отчетов, многоуровневых прайс-листов или аналитических ведомостей в системе 1С:Предприятие, разработчики часто сталкиваются с необходимостью управления иерархией. Стандартная группировка строк позволяет пользователю самостоятельно нажимать на «плюсики», но для повышения удобства работы иногда требуется, чтобы определенные важные строки были развернуты автоматически, а второстепенные — скрыты.

В этой статье мы разберем по шагам все доступные механизмы управления состоянием строк в объекте ТабличныйДокумент. Мы проанализируем ситуацию как на этапе формирования документа, так и при работе с уже готовым отчетом.

Способ 1. Использование параметров метода Вывести()

Самый эффективный и производительный способ управления группировками — это определение их состояния непосредственно в момент построения отчета. Рассмотрим подробнее синтаксис метода Вывести(), который используется для добавления областей в итоговый документ.

Многие разработчики используют только первые два параметра, однако метод поддерживает расширенную настройку:


// Синтаксис:
// ТабличныйДокумент.Вывести(Область, Уровень, ИмяГруппы, Открыта)

Разберем назначение параметров:

  1. Область — исходная область ячеек (макет).
  2. Уровень — числовое значение, определяющее вложенность строки (0, 1, 2 и т.д.).
  3. ИмяГруппы — строковый идентификатор, позволяющий позже обращаться к этой группе.
  4. Открыта — Булево значение. Если передать Истина, группа будет сразу отображена в развернутом виде. Если Ложь — строка будет скрыта под «плюсиком».

Посмотрим на практический пример реализации, когда нам нужно развернуть только те группы, которые соответствуют определенному условию (например, группы с ненулевыми итогами):


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

Для Каждого ТекущиеДанные Из СписокВыгрузки Цикл
    
    // Определяем логику: развернуть, если сумма > 1000
    ЭтоРазвернутаяГруппа = ?(ТекущиеДанные.Сумма > 1000, Истина, Ложь);
    
    // Выводим строку с указанием уровня и состояния
    ТабДок.Вывести(ОбластьСтрока, ТекущиеДанные.Уровень, , ЭтоРазвернутаяГруппа);
    
КонецЦикла;

Способ 2. Метод РазвернутьГруппу() для готового документа

Если табличный документ уже сформирован или мы работаем с существующим файлом, метод Вывести() нам не поможет. В этом случае мы воспользуемся специализированным методом объекта ТабличныйДокумент — РазвернутьГруппу(). Это именно то решение, которое позволяет программно «нажать на плюс» у конкретной строки.

Проанализируем параметры этого метода:


// Синтаксис:
// ТабличныйДокумент.РазвернутьГруппу(НомерСтроки, Глубина)

Важные особенности:

Пример использования:


// Развернуть группу, начинающуюся на 10-й строке, на один уровень вниз
ТабДокумент.РазвернутьГруппу(10, 1);

// Полностью свернуть группу на 25-й строке
ТабДокумент.РазвернутьГруппу(25, -1);

Способ 3. Управление через свойство области Свернута

Выясним причину, почему прямой вызов ТабДокумент.Область("R2").Развернуть() часто выдает ошибку или не срабатывает. Дело в том, что в объектной модели 1С метод Развернуть() у области не является стандартным для всех типов коллекций. Вместо этого у объекта ОбластьЯчеекТабличногоДокумента существует свойство Свернута.

Важное условие: данное свойство работает корректно только в том случае, если выбранная область в точности совпадает с границами существующей группы (строк или колонок).


// Получаем область конкретной строки
ОбластьГруппировки = ТабДок.Область(5, , 5, ); // Строка №5
// Проверяем, является ли она частью группировки, и меняем состояние
ОбластьГруппировки.Свернута = Ложь; // Разворачиваем

Способ 4. Массовое управление через ПоказатьУровень()

Иногда задача стоит шире: не развернуть конкретную строку, а подготовить весь документ к печати так, чтобы были видны, например, только уровни до второго включительно. Для этого идеально подходит метод ПоказатьУровень().

Рассмотрим, как это работает:


// Показать все уровни до 2-го, остальные свернуть
ТабДокумент.ПоказатьУровень(2);

Это действие аналогично нажатию кнопок с цифрами (1, 2, 3...) на панели группировок табличного документа. Оно применяется ко всему документу сразу, что очень удобно для быстрой настройки визуального представления отчета.

Способ 5. Программное создание групп методом Сгруппировать()

Если ваш документ заполнялся без использования уровней в методе Вывести(), вы можете создать иерархию «постфактум». Для этого используется метод Сгруппировать(). Он позволяет не только объединить строки, но и сразу задать их начальное состояние.


// Сгруппировать строки с 10 по 20
// Параметры: Начало, Конец, Имя, Открыта
ТабДок.СгруппироватьСтроки(10, 20, "ГруппаПродаж", Ложь);

Здесь четвертый параметр Ложь сразу создаст группу в свернутом состоянии. Это отличная альтернатива, если структура вложенности определяется сложной логикой уже после того, как все данные были помещены в таблицу.

Способ 6. Использование Автогруппировки

Не забудем про свойство АвтогруппировкаСтрок. Если установить его в значение Истина, платформа будет автоматически выстраивать дерево группировок на основе уровней, переданных в методе Вывести().

Совет: Всегда проверяйте последовательность вывода. Чтобы группировка работала предсказуемо, строки должны выводиться последовательно: сначала родитель (уровень 0), затем его дочерние элементы (уровень 1), затем следующий родитель. Если нарушить этот порядок, программное управление сворачиванием может работать некорректно.

Интерактивное управление и события

В завершение рассмотрим ситуацию, когда нам нужно реагировать на действия пользователя. В управляемых формах у поля табличного документа есть событие ПриРазворачиванииГруппировки.

С его помощью мы можем реализовать «ленивую загрузку» данных:

  1. Пользователь нажимает на «плюс».
  2. Срабатывает событие.
  3. Программа проверяет, заполнены ли дочерние строки.
  4. Если нет — данные подгружаются из базы именно в этот момент.

Это позволяет значительно ускорить открытие тяжелых отчетов, изначально показывая их в свернутом и пустом виде.

Подводя итог, можно сказать, что наиболее универсальным и рекомендуемым способом является использование параметров метода Вывести() во время формирования документа. Если же документ уже готов, используйте РазвернутьГруппу() для точечного управления или ПоказатьУровень() для массового изменения видимости.

← На главную