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

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

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

Понимание структуры параметров в СКД

Прежде чем переходить к написанию кода, проанализируем ситуацию с тем, где именно хранятся параметры в отчете (для анализа структуры удобно использовать консоль запросов и компоновки данных для разработчиков). В СКД за управление настройками отвечает специальный объект — КомпоновщикНастроек. Параметры могут находиться в трех разных «слоях»:

  1. Настройки (Settings): Основные настройки варианта отчета.
  2. Пользовательские настройки (UserSettings): То, что пользователь видит и может менять на форме.
  3. Фиксированные настройки (FixedSettings): Настройки, которые нельзя изменить через интерфейс, они жестко накладываются программно.

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

Использование объекта СтандартныйПериод

Если в вашем отчете параметр имеет тип СтандартныйПериод, рассмотрим подробнее, как с ним взаимодействовать. Этот объект удобен тем, что содержит сразу две даты: ДатаНачала и ДатаОкончания. Посмотрим на пример инициализации такого объекта и передачи его в настройки:


// Создаем новый стандартный период
НовыйПериод = Новый СтандартныйПериод;
НовыйПериод.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;
// Или устанавливаем даты вручную
НовыйПериод.ДатаНачала = НачалоМесяца(ТекущаяДата());
НовыйПериод.ДатаОкончания = КонецМесяца(ТекущаяДата());

// Устанавливаем параметр в настройках компоновщика
ПараметрПериод = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
    ПараметрПериод.Значение = НовыйПериод;
    ПараметрПериод.Использование = Истина;
КонецЕсли;

Установка параметров в управляемых формах

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

Чтобы гарантированно изменить период, мы должны найти параметр именно в ПользовательскиеНастройки. Разберем по шагам универсальный метод поиска параметра по его идентификатору:


&НаСервере
Процедура УстановитьПериодНаСервере()
    
    // Определяем нужные даты
    НачалоПериода = НачалоКвартала(ТекущаяДата());
    КонецПериода = КонецКвартала(ТекущаяДата());
    
    // Ищем параметр "СтандартныйПериод" среди пользовательских настроек
    ИдентификаторНастройки = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период").ИдентификаторПользовательскойНастройки;
    
    ЭлементНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ИдентификаторНастройки);
    
    Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраКомпоновкиДанных") Тогда
        ЭлементНастройки.Значение.ДатаНачала = НачалоПериода;
        ЭлементНастройки.Значение.ДатаОкончания = КонецПериода;
        ЭлементНастройки.Использование = Истина;
    КонецЕсли;

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

Работа с раздельными параметрами Даты Начала и Даты Конца

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

Посмотрим на пример реализации для такого случая:


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

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

Использование фиксированных настроек для запрета изменений

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


// Пример установки фиксированного периода
НовыеФиксированныеНастройки = Новый НастройкиКомпоновкиДанных;
ПараметрПериод = НовыеФиксированныеНастройки.ПараметрыДанных.Элементы.Добавить();
ПараметрПериод.Параметр = Новый ПараметрКомпоновкиДанных("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата()));
ПараметрПериод.Использование = Истина;

// Применяем к отчету
Отчет.КомпоновщикНастроек.ЗагрузитьФиксированныеНастройки(НовыеФиксированныеНастройки);

Заключение и рекомендации

Мы рассмотрели основные способы программного управления периодом в отчетах СКД. Подводя итог, можно выделить следующие рекомендации:

Используя эти методы, вы сможете сделать работу с отчетами в 1С:Предприятии более удобной и эффективной для конечных пользователей.

← На главную