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

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

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

Проанализируем типичную ситуацию: у нас есть отчет на СКД, в котором один из наборов данных — это запрос, возвращающий динамический список. В тексте запроса используются параметры, например, &Контрагент или &Период. Мы хотим, чтобы значения для этих параметров брались из реквизитов формы отчета и устанавливались программно перед формированием. Попытка сделать это в обработчике ПриСозданииНаСервере, как мы привыкли для обычных форм, не даст результата. Динамический список в отчете не будет отфильтрован. Давайте выясним причину и найдем правильный подход.

Почему не работает установка параметров в `ПриСозданииНаСервере`?

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

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

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

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

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

  1. Подготовка схемы компоновки данных.

    Убедимся, что в нашей схеме СКД есть набор данных типа "Запрос", и в тексте этого запроса определены необходимые параметры. Например:

    
    ВЫБРАТЬ
        Продажи.Номенклатура,
        Продажи.Количество,
        Продажи.Сумма
    ИЗ
        РегистрНакопления.Продажи КАК Продажи
    ГДЕ
        Продажи.Контрагент = &Контрагент
        И Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
    

    Здесь у нас три параметра: &Контрагент, &НачалоПериода и &КонецПериода.

  2. Создание обработчика события.

    В модуле нашего отчета создадим процедуру-обработчик для события ПриКомпоновкеРезультата. Это ключевой шаг. Сигнатура процедуры должна выглядеть так:

    
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
        // Здесь будет наш код
    КонецПроцедуры
    
  3. Получение и изменение настроек компоновщика.

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

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

    Настройки компоновщика содержат коллекцию ПараметрыДанных. Чтобы изменить параметр, его нужно сначала найти в этой коллекции по имени. Для поиска используется метод НайтиЗначениеПараметра, которому в качестве аргумента передается объект ПараметрКомпоновкиДанных с указанием имени искомого параметра.

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

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

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

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

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

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

  1. Всегда используйте серверный обработчик события отчета ПриКомпоновкеРезультата.
  2. Внутри обработчика получайте текущие настройки через КомпоновщикНастроек.ПолучитьНастройки().
  3. Находите нужный параметр в коллекции Настройки.ПараметрыДанных с помощью метода НайтиЗначениеПараметра().
  4. Устанавливайте не только Значение параметра, но и обязательно флаг Использование = Истина.
  5. После внесения всех изменений загрузите модифицированные настройки обратно, вызвав КомпоновщикНастроек.ЗагрузитьНастройки(Настройки).

Этот подход является универсальным и правильным с точки зрения архитектуры платформы 1С. Он позволяет гибко управлять поведением отчета, передавая в него любые необходимые данные из формы или других источников в момент его формирования.

← На главную