Как программно свернуть параметры и отборы в отчете СКД, не затрагивая основные данные

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает ситуация, когда в начале документа выводится служебная информация: заголовок, установленные параметры и выбранные пользователем отборы. Это полезно для понимания контекста данных, однако при формировании объемных отчетов эти блоки могут занимать значительную часть экрана. Стандартная попытка свернуть всё через ПоказатьУровеньГруппировокСтрок(0) приводит к тому, что схлопываются и все полезные данные отчета. В этой статье мы подробно разберем, как программно управлять видимостью и состоянием сворачивания именно области настроек.

Причина возникновения проблемы

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

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

Способ 1. Использование программного вывода с созданием группы

Этот метод считается наиболее «правильным» с точки зрения архитектуры 1С. Мы не просто выводим отчет одной командой, а перехватываем процесс вывода каждого элемента и оборачиваем секцию заголовка в отдельную группу табличного документа.

Для реализации этого метода необходимо переопределить процедуру ПриКомпоновкеРезультата в модуле объекта отчета. Разберем по шагам, как это сделать:


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

В данном примере мы используем метод НачатьГруппуСтрок. Второй параметр Ложь указывает системе, что группа должна быть сразу свернута после формирования. Таким образом, пользователь увидит отчет с данными, а параметры будут скрыты под «плюсиком» в самом верху.

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

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

Выясним причину, по которой этот метод может быть удобнее: он требует меньше кода. Однако нужно точно знать, за что «зацепиться» в тексте. Рассмотрим пример:


// В конце процедуры ПриКомпоновкеРезультата после стандартного вывода
// или в коде формы после компоновки

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

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

Способ 3. Использование пользовательских настроек (Варианты отчета)

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

Посмотрим на шаги настройки:

  1. Откройте СКД, перейдите на вкладку Настройки.
  2. Выберите вкладку Параметры.
  3. Для каждого параметра нажмите кнопку Свойства пользовательской настройки (иконка с ключом).
  4. Установите флаг Включать в пользовательские настройки.
  5. Аналогично поступите с отборами.
  6. В поле Режим редактирования выберите "Обычный" или "Быстрый доступ".

После этого в настройках самого отчета (в режиме «1С:Предприятие») можно зайти в «Изменить вариант» и на вкладке «Дополнительные настройки» установить значение Выводить параметры = Не выводить и Выводить отборы = Не выводить. В этом случае они вообще не будут загромождать табличный документ, оставаясь доступными в панели настроек формы. Это наиболее современный и удобный для пользователя подход.

Способ 4. Создание «Фиктивной» группировки в СКД

Рассмотрим еще один интересный прием. Мы можем создать в структуре СКД самую верхнюю группировку, которая не будет иметь полей группировки (детальные записи), но в ее имени или заголовке мы пропишем «Настройки».

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

В результате параметры станут частью интерактивной группировки самого отчета. Пользователь сможет сворачивать и разворачивать её стандартным «минусиком» и «плюсиком», а программно управлять её состоянием можно через тот же ДокументРезультат, зная, что это первая группировка в отчете.

Рекомендации

Подводя итог, можно сказать следующее:

  1. Если вам нужно жесткое управление и вы готовы писать код — используйте Способ 1 с программным выводом. Это дает стопроцентный контроль над структурой документа.
  2. Если вы хотите обеспечить максимальное удобство пользователю и работаете на управляемых формах — используйте Способ 3. Вынос параметров в панель настроек освобождает место на экране и выглядит профессионально.
  3. Если нужно быстро «скрыть» параметры без изменения логики вывода — используйте метод ТабличныйДокумент.ПоказатьСтроки(Начало, Конец, Ложь). Строки останутся в документе, но не будут видны, пока вы не измените их видимость программно (например, по кнопке на форме).

Помните, что использование ПоказатьУровеньГруппировокСтрок(0) — это самый простой, но и самый грубый инструмент. Для тонкой настройки отчетов СКД всегда лучше использовать явное определение областей или программный обход элементов результата компоновки.

← На главную