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

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

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

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

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

Решение 1: Для отчетов, использующих стандартную форму БСП

Это самый распространенный случай для внешних отчетов (таких как универсальный отчет по метаданным), у которых не создана собственная уникальная форма. Библиотека стандартных подсистем предоставляет специальный механизм для переопределения поведения стандартной формы отчета прямо из модуля объекта самого отчета. Это позволяет «сообщить» форме, как мы хотим отобразить результат.

Рассмотрим по шагам, что нужно сделать:

  1. Откройте модуль объекта вашего отчета на СКД.
  2. Добавьте экспортную процедуру ОпределитьНастройкиФормы. Эта процедура вызывается стандартной формой для того, чтобы ваш отчет мог заявить о своих «особых требованиях». В нашем случае мы сообщаем, что хотим обрабатывать событие перед формированием отчета.
    
    Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    	
    	// Сообщаем стандартной форме, что наш отчет хочет 
    	// выполнить некий код перед непосредственным формированием.
    	Настройки.События.ПередФормированиемОтчета = Истина;
    	
    КонецПроцедуры
    
  3. Добавьте вторую экспортную процедуру ПередФормированиемОтчета. Раз мы в предыдущем шаге подписались на это событие, теперь нужно его обработать. Эта процедура будет вызвана в нужный момент жизненного цикла формы — как раз перед выводом результата. Здесь мы можем безопасно установить желаемый уровень группировок.
    
    Процедура ПередФормированиемОтчета(ФормаОтчета, ДополнительныеПараметры) Экспорт
    
    	// Устанавливаем свойство формы, отвечающее за уровень группировок.
    	// Стандартная форма БСП увидит это значение и применит его к результату.
    	ФормаОтчета.ВыбранныйУровеньГруппировок = 1;
    		
    КонецПроцедуры
    

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

Решение 2: Для отчетов с собственной управляемой формой

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

Наиболее подходящее место для сворачивания группировок — это обработчик события ПослеФормирования у поля табличного документа, в которое выводится результат отчета. К слову, если в процессе вам понадобится программное изменение заголовка группировки, это также лучше делать на этапе подготовки компоновки.

Посмотрим на пример:

  1. Откройте модуль формы вашего отчета.
  2. Найдите элемент формы типа ТабличныйДокумент, куда выводится результат. Допустим, он называется Результат.
  3. Создайте для этого элемента обработчик события ПослеФормирования на клиенте.
  4. Внутри обработчика вызовите нужный метод.
    
    &НаКлиенте
    Процедура РезультатПослеФормирования(Элемент, ДанныеРасшифровки, СтандартнаяОбработка)
    
        // Отчет уже полностью сформирован и выведен в элемент формы.
        // Теперь можно безопасно управлять его отображением.
        Элементы.Результат.ПоказатьУровеньГруппировокСтрок(1);
        
    КонецПроцедуры
    

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

Почему не работает вызов в `ПриКомпоновкеРезультата`

Давайте еще раз закрепим, почему первоначальный подход, показанный в теме форума, обречен на провал при использовании стандартных механизмов.

Вот пример кода, который не сработает, как ожидается, в отчете с формой БСП:


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

    // Эта строка выполнится, но ее результат будет отменен формой отчета
    ДокументРезультат.ПоказатьУровеньГруппировокСтрок(1);

КонецПроцедуры

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

Таким образом, ключ к решению — не сам метод ПоказатьУровеньГруппировокСтрок, а правильный момент и контекст его вызова. Используя штатные события БСП или события формы, вы встраиваете свою логику в жизненный цикл отчета в нужный момент, добиваясь предсказуемого результата.

← На главную