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

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

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

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

Решение 1: Использование встроенной функции СКД в настройках параметра

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

Проанализируем шаги:

  1. Откройте схему компоновки данных вашего отчета в конфигураторе.
  2. Перейдите на вкладку "Параметры". Здесь перечислены все параметры, которые используются в отчете.
  3. Выберите нужный параметр с типом "Дата".
  4. В панели свойств этого параметра найдите группу "Заполнение". Нас интересует свойство "Выражение".
  5. В поле "Выражение" впишите название встроенной функции СКД без кавычек и скобок: ТекущаяДатаСеанса.

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

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

Решение 2: Использование вычисляемого поля

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

Разберем по шагам:

  1. В той же схеме компоновки данных перейдите на вкладку "Вычисляемые поля".
  2. Создайте новое поле, например, с именем ДатаСеансаПользователя.
  3. В колонке "Путь к данным" укажите это же имя.
  4. В колонке "Выражение" укажите уже знакомую нам функцию: ТекущаяДатаСеанса.

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

Решение 3: Программная установка параметра из формы отчета

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

Логика здесь следующая: нужно получить дату сеанса на сервере, передать ее в форму и установить как значение для параметра компоновщика настроек. Параллельно с этим часто решаются и другие задачи, например, программное изменение заголовка группировки отчета.

Посмотрим на пример кода:

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


&НаСервереБезКонтекста
Функция ПолучитьТекущуюДатуСеанса()
    Возврат НачалоДня(ОбщегоНазначения.ТекущаяДатаСеанса());
КонецФункции

Теперь в модуле формы отчета, в процедуре, которая выполняется при создании формы на сервере, вызовем эту функцию и установим значение параметра.


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Установим начальные значения при открытии формы
    УстановитьНачальныеЗначенияПараметров();
КонецПроцедуры

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

Этот подход дает максимальную гибкость, но он более трудоемкий. В большинстве случаев достаточно первого, декларативного способа.

Ключевое различие: ТекущаяДатаСеанса и ТекущаяДата

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

Таким образом, для установки стабильного значения по умолчанию, привязанного к рабочему дню пользователя, всегда следует использовать ТекущаяДатаСеанса.

← На главную