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

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

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

Установка текущей даты и времени в параметрах СКД

Предположим, у нас есть выборка данных, например, остатки товаров на складе, и в условиях этой выборки используется параметр &ТекущаяДата. Мы хотим, чтобы этот параметр автоматически заполнялся текущей датой и временем при открытии отчета.

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

Вот как это будет выглядеть:

ТекущаяДата()

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

Важный нюанс: флажок "Ограничение доступности"

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

Установка даты на конец дня в параметрах СКД

Часто для отчетов по остаткам или срезам последних значений требуется, чтобы дата параметра соответствовала не просто текущему моменту, а концу дня (23:59:59). Это гарантирует, что в отчет будут включены все данные за выбранный день. Например, если мы строим отчет по остаткам на сегодня, и параметр имеет значение 01.01.2024 10:00:00, то остатки будут рассчитаны именно на это время, не учитывая операции, произошедшие позже в этот же день. Для корректного включения всего дня, нам нужно значение 01.01.2024 23:59:59.

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

Для установки значения параметра на конец текущего дня следует использовать функцию КОНЕЦПЕРИОДА(). Эта функция является частью языка запросов 1С и прекрасно подходит для использования в выражениях параметров СКД.

  1. Переходим на закладку "Параметры" в схеме компоновки данных.
  2. Находим нужный параметр (например, ТекущаяДата или ДатаОкончания).
  3. В поле "Выражение" задаем следующее значение:

КОНЕЦПЕРИОДА(ТекущаяДата(), "ДЕНЬ")

Обратите внимание: единица периода (в данном случае "ДЕНЬ") обязательно должна быть заключена в двойные кавычки.

Такое выражение гарантирует, что параметр будет инициализирован текущей датой с временем 23:59:59. Это идеально подходит для отчетов, где необходимо учитывать данные за весь текущий день.

Альтернативное решение: преобразование даты в запросе

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

Рассмотрим пример. Если у нас в запросе используется параметр &ТекущаяДата для условия, мы можем обернуть его функцией КОНЕЦПЕРИОДА() непосредственно в тексте запроса:


ВЫБРАТЬ
    ХХХ_ВнутреннееПеремещение_2.Ссылка
ИЗ
    Документ.ХХХ_ВнутреннееПеремещение КАК ХХХ_ВнутреннееПеремещение_2
ГДЕ
    ХХХ_ВнутреннееПеремещение_2.СрокВозврата < КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ)

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

Сравнение подходов:

  1. Установка в выражении параметра СКД (КОНЕЦПЕРИОДА(ТекущаяДата(), "ДЕНЬ")):
    • Плюсы: Параметр логически всегда представляет конец дня, что делает его более универсальным для использования в различных частях запроса или в нескольких наборах данных СКД. Упрощает текст основного запроса, так как не нужно постоянно оборачивать параметр в функцию.
    • Минусы: Если параметр должен быть иногда "точкой во времени", а иногда "концом дня", то этот подход может быть менее гибким.
  2. Преобразование в тексте запроса (КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ)):
    • Плюсы: Позволяет управлять логикой "конец дня" непосредственно на уровне запроса, что может быть полезно, если эта логика специфична для данного набора данных или условия. Параметр в СКД остается "чистой" датой, что дает больше гибкости.
    • Минусы: Требует повторения функции КОНЕЦПЕРИОДА() каждый раз, когда параметр используется для условия "до конца дня", что может усложнить запрос и сделать его менее читаемым.

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

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

Настройка типа данных параметра

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

Использование стандартных периодов

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

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

Заключение

Мы выяснили, что установка текущей даты в параметрах СКД — это довольно простая задача, которую можно решить несколькими способами. Для простой текущей даты и времени используем ТекущаяДата(). Если же нам нужен конец дня, то оптимальным решением будет КОНЕЦПЕРИОДА(ТекущаяДата(), "ДЕНЬ") в выражении параметра. Кроме того, мы всегда можем выполнить преобразование к концу дня непосредственно в тексте запроса. Не забывайте про флажок "Ограничение доступности" для управления возможностью изменения параметра пользователем, а также про настройку типа данных для удобства ввода. Использование СтандартныйПериод предоставит расширенные возможности для работы с периодами отчетов. Эти знания помогут нам создавать более гибкие и удобные отчеты в 1С.

← На главную