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