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