При разработке отчетов в системе 1С с использованием Системы Компоновки Данных (СКД) часто возникает необходимость автоматически устанавливать текущую дату в качестве значения одного из параметров. Это позволяет формировать отчеты с актуальными данными без ручного ввода даты пользователем. Однако, не всегда очевидно, как правильно это сделать, особенно если требуется учитывать не только текущую дату, но и ее приведение к началу или концу дня. В этой статье мы подробно разберем, как установить текущую дату в параметрах СКД, а также рассмотрим нюансы, связанные с приведением даты к концу дня и настройкой доступности параметров.
Предположим, у нас есть выборка данных, например, остатки товаров на складе, и в условиях этой выборки используется параметр &ТекущаяДата. Мы хотим, чтобы этот параметр автоматически заполнялся текущей датой и временем при открытии отчета.
ТекущаяДата.ТекущаяДата().Вот как это будет выглядеть:
ТекущаяДата()
Такой подход является корректным. При формировании отчета параметр ТекущаяДата будет автоматически заполнен текущей датой и временем сервера, на котором выполняется 1С.
Обратите внимание на флажок "Ограничение доступности" рядом с параметром. Если этот флажок установлен, то значение параметра, заданное в схеме компоновки данных (например, ТекущаяДата()), будет браться из схемы и не будет доступно для изменения пользователем в настройках отчета. Если мы хотим, чтобы пользователь мог при необходимости изменить эту дату, то необходимо снять флажок "Ограничение доступности". В этом случае, значение, заданное в "Выражении", будет использоваться как значение по умолчанию, но пользователь сможет его скорректировать.
Часто для отчетов по остаткам или срезам последних значений требуется, чтобы дата параметра соответствовала не просто текущему моменту, а концу дня (23:59:59). Это гарантирует, что в отчет будут включены все данные за выбранный день. Например, если мы строим отчет по остаткам на сегодня, и параметр имеет значение 01.01.2024 10:00:00, то остатки будут рассчитаны именно на это время, не учитывая операции, произошедшие позже в этот же день. Для корректного включения всего дня, нам нужно значение 01.01.2024 23:59:59.
Мы попытаемся использовать функцию КонецДня(ТекущаяДата()) напрямую в поле "Выражение" параметра СКД. Однако, выясним, что такой синтаксис, как правило, не поддерживается в этом контексте и может вызвать ошибку. В поле "Выражение" ожидаются функции языка запросов или специфический синтаксис СКД.
Для установки значения параметра на конец текущего дня следует использовать функцию КОНЕЦПЕРИОДА(). Эта функция является частью языка запросов 1С и прекрасно подходит для использования в выражениях параметров СКД.
ТекущаяДата или ДатаОкончания).
КОНЕЦПЕРИОДА(ТекущаяДата(), "ДЕНЬ")
Обратите внимание: единица периода (в данном случае "ДЕНЬ") обязательно должна быть заключена в двойные кавычки.
Такое выражение гарантирует, что параметр будет инициализирован текущей датой с временем 23:59:59. Это идеально подходит для отчетов, где необходимо учитывать данные за весь текущий день.
Помимо установки значения "конец дня" непосредственно в выражении параметра СКД, существует альтернативный подход: оставить параметр в СКД как простую ТекущаяДата() (или просто "Дата" без времени), а преобразование к концу дня выполнять уже в тексте запроса источника данных СКД.
Рассмотрим пример. Если у нас в запросе используется параметр &ТекущаяДата для условия, мы можем обернуть его функцией КОНЕЦПЕРИОДА() непосредственно в тексте запроса:
ВЫБРАТЬ
ХХХ_ВнутреннееПеремещение_2.Ссылка
ИЗ
Документ.ХХХ_ВнутреннееПеремещение КАК ХХХ_ВнутреннееПеремещение_2
ГДЕ
ХХХ_ВнутреннееПеремещение_2.СрокВозврата < КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ)
В этом случае, параметр &ТекущаяДата в схеме компоновки данных может быть установлен просто как ТекущаяДата() (или даже просто иметь произвольное значение, если мы хотим, чтобы пользователь его вводил), а вся логика приведения к концу дня будет заложена в сам текст запроса. Этот метод также является рабочим и может быть предпочтительнее, если логика "конец дня" относится только к конкретному запросу, а не ко всем использованиям данного параметра.
КОНЕЦПЕРИОДА(ТекущаяДата(), "ДЕНЬ")):
КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ)):
КОНЕЦПЕРИОДА() каждый раз, когда параметр используется для условия "до конца дня", что может усложнить запрос и сделать его менее читаемым.Выбор между этими двумя подходами зависит от конкретной задачи и стиля разработки. Оба являются допустимыми и приводят к одинаковому результату.
Помимо значения и выражения, мы можем настроить тип данных параметра. Если пользователю требуется указывать только дату без времени (только день, месяц, год), то в свойствах параметра СКД в поле "Тип" мы можем выбрать Дата, а затем в поле "Состав даты" указать Дата. Это позволит вводить только дату без учета времени, что может быть удобнее для пользователя и предотвратит возможные ошибки при ручном вводе.
Для более сложных сценариев, когда требуется предоставить пользователю выбор стандартных периодов (например, "Текущий месяц", "Прошлый год", "Квартал"), мы можем создать в СКД параметр типа СтандартныйПериод. Этот тип параметра автоматически создает два служебных параметра: НачалоПериода и КонецПериода (или &Период.ДатаНачала и &Период.ДатаОкончания, если параметр называется Период).
&Период.ДатаНачала значение будет иметь время 00:00:00.&Период.ДатаОкончания значение будет иметь время 23:59:59, что очень удобно для корректного включения всего последнего дня в отчет за период.Этот подход значительно упрощает работу с датами при построении отчетов за произвольные или стандартные периоды, предоставляя гибкий механизм для пользователя.
Мы выяснили, что установка текущей даты в параметрах СКД — это довольно простая задача, которую можно решить несколькими способами. Для простой текущей даты и времени используем ТекущаяДата(). Если же нам нужен конец дня, то оптимальным решением будет КОНЕЦПЕРИОДА(ТекущаяДата(), "ДЕНЬ") в выражении параметра. Кроме того, мы всегда можем выполнить преобразование к концу дня непосредственно в тексте запроса. Не забывайте про флажок "Ограничение доступности" для управления возможностью изменения параметра пользователем, а также про настройку типа данных для удобства ввода. Использование СтандартныйПериод предоставит расширенные возможности для работы с периодами отчетов. Эти знания помогут нам создавать более гибкие и удобные отчеты в 1С.