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