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

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

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

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

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

  1. Настройки (Settings) — это общие настройки схемы компоновки данных.
  2. Пользовательские настройки (User Settings) — это те настройки, которые выведены на форму отчета и которые пользователь может редактировать напрямую.

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

Установка периода через параметры данных

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

Проанализируем пример кода для установки значения в основных настройках:


// Определим даты начала и окончания
ДатаНачала = НачалоМесяца(ТекущаяДата());
ДатаОкончания = КонецМесяца(ТекущаяДата());

// Создадим объект СтандартныйПериод
НовыйПериод = Новый СтандартныйПериод;
НовыйПериод.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод;
НовыйПериод.ДатаНачала = ДатаНачала;
НовыйПериод.ДатаОкончания = ДатаОкончания;

// Найдем параметр в компоновщике
ПараметрПериод = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период");

Если ПараметрПериод <> Неопределено Тогда
    ПараметрПериод.Значение = НовыйПериод;
    ПараметрПериод.Использование = Истина;
КонецЕсли;

В данном примере мы используем метод Найти(), чтобы избежать ошибок при отсутствии параметра в схеме. Установка свойства Использование = Истина гарантирует, что параметр будет применен при компоновке результата.

Работа с пользовательскими настройками

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

Посмотрим на алгоритм действий:

  1. Находим параметр в основных настройках.
  2. Получаем его уникальный идентификатор.
  3. По этому идентификатору ищем элемент в коллекции пользовательских настроек.
  4. Устанавливаем значение.

Рассмотрим реализацию в коде:


// Укажем имя параметра, заданное в схеме СКД
ИмяПараметра = "Период";
Настройки = Отчет.КомпоновщикНастроек.Настройки;

// Ищем параметр в основных настройках
ЭлементНастройки = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);

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

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

Где лучше размещать код установки периода?

Выясним, в каких обработчиках событий модуля формы отчета следует выполнять данные манипуляции:

1. В обработчике ПриСозданииНаСервере

Это самое подходящее место для установки начальных значений при открытии отчета. Пользователь увидит уже заполненный период сразу после загрузки формы.

2. В обработчике ПриЗагрузкеВариантаНаСервере

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

3. В командах формы

Если вы реализуете кнопки быстрого выбора периода (например, "Сегодня", "Вчера", "Текущий месяц"), код будет размещен в обработчиках этих команд на сервере.

Особенности работы с типом СтандартныйПериод

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

Проанализируем пример установки текущего квартала:


ВыбранныйПериод = Новый СтандартныйПериод;
ВыбранныйПериод.Вариант = ВариантСтандартногоПериода.ЭтотКвартал;

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

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

Типичные ошибки при работе с параметрами СКД

Разберем ситуации, в которых код может не сработать:

Таким образом, мы рассмотрели основные механизмы управления периодом в отчетах. Правильное сочетание работы с основными и пользовательскими настройками позволяет создавать гибкие и удобные интерфейсы для конечных пользователей.

← На главную