Как программно свернуть только первую группировку строк в отчете на СКД, оставив остальные раскрытыми?

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

При разработке сложных отчетов на Системе Компоновки Данных (СКД), где иногда используются даже две разных схемы в отчете, мы часто сталкиваемся с задачей оптимизации внешнего вида результата. Одна из распространенных ситуаций: первая группировка отчета содержит технические параметры или общие категории (например, Организация или Склад), которые занимают много места на экране, но пользователю в данный момент важнее видеть детализацию (номенклатуру, документы), расположенную на уровнях ниже.

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

Постановка задачи

Предположим, у нас есть отчет со следующей структурой группировок (для анализа структуры удобно использовать консоль запросов — для этого отлично подойдет консоль СКД в составе расширения Infostart Toolkit):

  1. Параметры отчета / Организация (Уровень 0) — нужно свернуть по умолчанию.
  2. Контрагент (Уровень 1) — нужно оставить развернутым.
  3. Документ движения (Уровень 2) — нужно оставить развернутым.

Если мы воспользуемся стандартным методом табличного документа, который часто предлагают на форумах:


ДокументРезультат.ПоказатьУровеньГруппировокСтрок(0);

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

Способ 1. Использование стандартных настроек СКД (Рекомендуемый)

Самый правильный и "чистый" способ управления видимостью группировок — это использование встроенных возможностей Системы Компоновки Данных (аналогично тому, как решается задача, когда нет данных — нет столбцов). Нам не обязательно писать код, если мы можем настроить поведение схемы.

Разберем, как это сделать в конфигураторе или в пользовательском режиме:

  1. Откройте схему компоновки данных вашего отчета.
  2. Перейдите на вкладку Настройки.
  3. В дереве структуры отчета выберите ту группировку, которую необходимо выводить в свернутом виде (в нашем случае — самую верхнюю).
  4. В правой части окна настроек перейдите на вкладку Дополнительные настройки (обычно она находится внизу или в отдельной закладке свойств элемента структуры).
  5. Найдите параметр Начальное состояние групп (или Тип развертывания в зависимости от версии платформы).
  6. Установите значение Свернуто.

Для остальных группировок (вложенных) убедитесь, что этот параметр стоит в значении Авто или Развернуто.

Как это работает: При формировании отчета компоновщик макета автоматически проставит признаки видимости для соответствующих областей табличного документа. Это наиболее производительный метод, так как он не требует повторного обхода уже сформированного документа.

Способ 2. Программное управление настройками перед формированием

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

Разберем пример кода, который нужно поместить в модуль объекта отчета (в событие ПриКомпоновкеРезультата) или в код формы перед вызовом метода СкомпоноватьРезультат.


// Получаем настройки из компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

// Обращаемся к структуре отчета. 
// Допустим, нам нужно свернуть первую группировку в списке.
Если Настройки.Структура.Количество() > 0 Тогда
    ПерваяГруппировка = Настройки.Структура[0];
    
    // Проверяем, что это действительно группировка, а не диаграмма или таблица
    Если ТипЗнч(ПерваяГруппировка) = Тип("ГруппировкаКомпоновкиДанных") Тогда
        
        // Устанавливаем параметр вывода "ТипРазвертыванияГруппировок"
        // Этот параметр находится в коллекции параметров вывода группировки (не отчета в целом!)
        
        ПараметрРазвертывания = ПерваяГруппировка.ПараметрыВывода.НайтиЗначениеПараметра(
            Новый ПараметрКомпоновкиДанных("GroupType")); // Или "ТипГруппировки" / "ExpansionType"
            
        // Более надежный способ через системное перечисление:
        ПерваяГруппировка.ПараметрыВывода.УстановитьЗначениеПараметра(
            "ТипРазвертыванияГруппировок", 
            ТипРазвертыванияГруппировокКомпоновкиДанных.Свернуто);
            
    КонецЕсли;
КонецЕсли;

// Важно: далее нужно использовать именно переменную "Настройки" для компоновки,
// а не КомпоновщикНастроек.Настройки, если вы делаете это вручную.

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

Способ 3. Постобработка Табличного Документа

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

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

Посмотрим на алгоритм действий:

  1. Мы знаем, что нам нужен Уровень 0 (самый верхний).
  2. Нам нужно найти все строки, которые являются заголовками групп этого уровня.
  3. Установить для них свойство свернутости.

Однако, здесь есть нюанс: простого метода "Свернуть только уровень X" нет. Есть метод ПоказатьУровеньГруппировокСтрок(N), который показывает уровни от 0 до N, скрывая все, что глубже N+1. Это нам не подходит, так как мы хотим обратного: скрыть 0, но видеть 1.

Поэтому нам придется работать с коллекцией областей. Но более эффективный способ — перехватить вывод или найти области по уровням.

Пример кода для постобработки:


// ДокументРезультат - это ваш сформированный табличный документ
МаксимальныйИндекс = ДокументРезультат.ВысотаТаблицы;
ТекущийУровень = 0; // Нам нужно свернуть уровень 0

// Обходим строки (это может быть медленно на больших отчетах)
Для ИндексСтроки = 1 По МаксимальныйИндекс Цикл
    
    // Получаем уровень текущей строки
    УровеньСтроки = ДокументРезультат.Область(ИндексСтроки, 1).УровеньГруппировки;
    
    // Если мы нашли строку нужного уровня
    Если УровеньСтроки = ТекущийУровень Тогда
        // Мы пытаемся получить группу, которой принадлежит эта строка
        // В 1С нет прямого метода "ПолучитьГруппуПоСтроке", 
        // но мы можем управлять этим через глобальное сворачивание, 
        // что не подходит.
        
        // Более рабочий вариант - использование именованных секций, 
        // если они заданы в макете. Но в СКД макет генерируется автоматически.
    КонецЕсли;
КонецЦикла;

Внимание: Прямое управление свойством Свернута для конкретной строки через код в 1С затруднено, так как свойство доступно для группы строк. Группы в табличном документе создаются методами НачатьГруппуСтрок() / ЗакончитьГруппуСтрок(). После вывода СКД эти группы уже существуют.

Если вы хотите использовать именно постобработку, проще воспользоваться следующим алгоритмом:


// Сначала сворачиваем все до верхнего уровня (видим только уровень 0)
ДокументРезультат.ПоказатьУровеньГруппировокСтрок(1); 

// Затем программно "кликаем" плюсики? Нет, это невозможно.

Именно поэтому вариант с постобработкой табличного документа для задачи "свернуть верх, оставить низ" является самым сложным и ненадежным. Рекомендуется использовать Способ 1 или Способ 2.

Способ 4. "Костыль" через Условное оформление

В обсуждении на форуме был предложен интересный нестандартный подход, который стоит рассмотреть, если другие методы не срабатывают по каким-то причинам. Это использование Условного оформления для визуального скрытия строк.

Суть метода:

  1. В настройках отчета заходим в Условное оформление.
  2. Добавляем новый элемент.
  3. В условии отбора указываем поля, соответствующие нашей первой группировке (или уровню группировки, если доступно системное поле СистемныеПоля.Уровень).
  4. В настройках оформления устанавливаем параметр Максимальная Высота равным 1 (или минимально возможному значению).

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

Однако этот метод имеет существенные недостатки:

Итоговые рекомендации

Давайте подведем итог. Для решения задачи сворачивания только первой группировки в отчете СКД:

  1. Лучший выбор: Использовать настройку Тип развертывания: Свернуто в настройках группировки СКД. Это штатный механизм, работающий быстро и корректно.
  2. Для динамических задач: Программно устанавливать параметр вывода ТипРазвертыванияГруппировок в дереве настроек компоновщика перед выполнением отчета.
  3. Избегать: Попыток манипулировать уровнями группировок через ТабличныйДокумент после вывода, так как объектная модель 1С плохо приспособлена для выборочного сворачивания верхних уровней при открытых нижних без сложных итераций.

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

← На главную