Как установить параметры даты в СКД по умолчанию при каждом открытии отчета?

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

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

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

Выясним причину: почему СКД «игнорирует» выражения в схеме?

Когда мы прописываем в схеме компоновки данных для параметра выражение типа ТекущаяДата(), это значение устанавливается только при самом первом запуске отчета пользователем. Как только пользователь изменил дату и сформировал отчет, платформа сохраняет эти настройки в специальное хранилище. При следующем открытии КомпоновщикНастроек загружает значения из этого кэша, и они имеют приоритет над тем, что написано в конфигураторе.

Рассмотрим подробнее варианты решения этой задачи, начиная от самых простых и заканчивая наиболее гибкими программными методами.

Способ 1. Программная установка в форме отчета (Рекомендуемый)

Как было отмечено в обсуждении программной настройки отчетов, наиболее надежный способ — это вмешательство в модуль формы отчета. Если в вашем отчете используется автогенерируемая форма, вам необходимо создать её вручную. Рассмотрим по шагам, что нужно сделать:

  1. Создайте основную форму отчета.
  2. В модуле формы найдите или создайте обработчик события ПриОткрытии.
  3. Напишите процедуру, которая будет обращаться к компоновщику настроек и устанавливать нужные значения.

Проанализируем пример кода для управляемых форм:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    УстановитьНачальныеДатыНаСервере();
КонецПроцедуры

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

Обратите внимание на использование функции ТекущаяДатаСеанса() вместо ТекущаяДата(). Мы рекомендуем использовать именно её, так как она учитывает часовой пояс пользователя, что критично для клиент-серверных баз данных.

Способ 2. Работа со СтандартнымПериодом

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

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


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

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

Способ 3. Отключение сохранения настроек (Радикальный)

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

  1. Откройте свойства объекта Отчет в дереве метаданных.
  2. Найдите свойство Хранилище настроек.
  3. Если там указано стандартное хранилище, попробуйте очистить это поле или создать свое пустое хранилище.

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

Способ 4. Использование обработчика ПриКомпоновкеРезультата

Если вы не хотите создавать форму, можно прописать логику в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Однако помните, что этот код сработает не в момент открытия окна, а в момент нажатия кнопки Сформировать.


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

В данном примере мы добавили проверку НЕ Параметр.Использование. Это позволит устанавливать дату по умолчанию только в том случае, если пользователь сам не установил флажок использования параметра.

Дополнительные рекомендации

Разберем еще несколько нюансов, которые помогут сделать работу с отчетами более профессиональной:

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

← На главную