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