К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить сегодняшнюю дату в 1С

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

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

Для большинства прикладных задач — подстановка даты в документ, сравнение сроков, вычисление периодов — рекомендуется использовать ТекущаяДатаСеанса(). Функция ТекущаяДата() без параметров возвращает дату компьютера, на котором выполняется код, и её поведение зависит от того, где исполняется фрагмент: на клиенте или на сервере.

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

Функция ТекущаяДатаСеанса() — основной способ

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

Пример использования:

ДатаСегодня = ТекущаяДатаСеанса();

Сообщить("Сегодня: " + Формат(ДатаСегодня, "ДЛФ=D"));

Функция доступна и на толстом, и на тонком, и на веб-клиенте, и на сервере. В запросах дату сеанса обычно передают параметром, чтобы запрос оставался детерминированным и корректно кэшировался:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.Реализация

|ГДЕ Дата >= &НачалоСегодня";

Запрос.УстановитьПараметр("НачалоСегодня", НачалоДня(ТекущаяДатаСеанса()));

Функция ТекущаяДата() и почему с ней осторожно

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

Начиная с версии платформы 8.3 вызов ТекущаяДата() без параметров на сервере выдаёт предупреждение при проверке конфигурации, а в новых разработках считается устаревшим приёмом. Вместо него предлагается либо ТекущаяДатаСеанса(), либо вариант с явным указанием часового пояса.

Функция поддерживает необязательный параметр — часовой пояс в виде строки (например, "Europe/Moscow"). Тогда дата приводится к указанному поясу независимо от настроек сервера:

ДатаВМоскве = ТекущаяДата("Europe/Moscow");

Сравнение вариантов

ТекущаяДатаСеанса()

Основной вариант для прикладного кода. Учитывает часовой пояс сеанса, результат одинаков на клиенте и сервере.

ТекущаяДата() без параметров

Дата компьютера, где исполняется код. Риск расхождения в клиент-серверном режиме; считается устаревшим приёмом.

ТекущаяДата(ЧасовойПояс)

Когда нужна дата в конкретном поясе, отличном от пояса сеанса, например для интеграции с внешней системой.

РабочаяДата

Когда бухгалтер вручную установил рабочую дату и документы должны вводиться «задним числом» — но это не текущая календарная дата.

Как получить только дату без времени

Тип «Дата» в 1С всегда содержит и дату, и время с точностью до секунды. «Чистой» даты без времени как отдельного типа не существует — вместо этого время обнуляют, приводя значение к началу дня. Для этого служит функция НачалоДня():

Сегодня = НачалоДня(ТекущаяДатаСеанса());

// Результат: сегодняшняя дата, время 00:00:00

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

Если НачалоДня(ДатаДокумента) = НачалоДня(ТекущаяДатаСеанса()) Тогда

// Документ датирован сегодня

КонецЕсли;

Для выборки документов за сегодня в запросе используют пару границ: от НачалоДня() до КонецДня() (23:59:59). Это надёжнее, чем сравнение с точным моментом времени.

Рабочая дата и её отличие от текущей

В 1С существует понятие рабочей даты — значение, которое пользователь может установить вручную (в толстом клиенте через настройки, в управляемом приложении — через функциональность конкретной конфигурации, если она предусмотрена). Рабочая дата подставляется по умолчанию в новые документы и позволяет вводить операции «задним числом», не меняя системное время.

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

Если задача — узнать именно «сегодня» по календарю, используйте ТекущаяДатаСеанса(). Если задача — подставить дату в новый документ так, как ожидает пользователь, ориентируйтесь на рабочую дату или стандартные обработчики заполнения документа, где эта логика уже реализована.

Часовые пояса и типичные проблемы с датой

В распределённых системах — сервер в одном регионе, пользователи в другом — дата сеанса формируется с учётом часового пояса, заданного для информационной базы или сеанса. Если пояс не настроен, применяется пояс сервера, и пользователь из другого региона может получить «завтрашнюю» или «вчерашнюю» дату в вечерние и ночные часы.

Признак проблемы: документы, созданные вечером, уходят на следующий день, или отчёт «за сегодня» у части пользователей пустой. Решение — проверить настройку часового пояса информационной базы (в конфигураторе или через функцию ПолучитьЧасовойПоясИнформационнойБазы()) и при необходимости задать его явно командой УстановитьЧасовойПоясИнформационнойБазы().

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

Проверка результата и отладка

Убедиться, что функция возвращает ожидаемое значение, проще всего через отладчик: поставьте точку останова после присваивания и посмотрите значение переменной. Альтернатива — вывод в сообщения:

Сообщить("Сеанс: " + ТекущаяДатаСеанса()

+ ", пояс базы: " + ПолучитьЧасовойПоясИнформационнойБазы());

Сравните выведенные дату и время с тем, что видит пользователь на своём компьютере. Совпадение в пределах минуты — норма. Расхождение на целые часы указывает на проблему с часовым поясом, расхождение на минуты — на рассинхронизацию времени между клиентом и сервером, которую обычно решает служба синхронизации времени (NTP) на уровне операционной системы.

Контрольные точки

Как проверить результат

Значение ТекущаяДатаСеанса() у пользователя
Норма

Совпадает с календарной датой и временем пользователя

Тревожный признак

Отличается на целые часы — проверяйте часовой пояс базы

Дата нового документа
Норма

Подставляется ожидаемая дата (рабочая или текущая)

Тревожный признак

Дата «завтра» или «вчера» в вечерние часы — расхождение поясов

Сравнение дат в коде
Норма

Сравниваются НачалоДня() от обеих дат

Тревожный признак

Сравнение точных значений даёт ложное «не равно»

Время на сервере и клиенте
Норма

Расхождение не более минуты

Тревожный признак

Минуты и более — проверьте синхронизацию времени ОС

Частые ошибки при работе с текущей датой

Самая распространённая ошибка — сравнение дат «в лоб» без приведения к началу дня. Условие Дата = ТекущаяДатаСеанса() фактически никогда не истинно, и логика «сегодняшних» документов молча не срабатывает. Вторая типичная ошибка — использование ТекущаяДата() на сервере в клиент-серверном режиме, из-за чего у пользователей из других регионов «плывут» даты.

Ещё одна ошибка — формирование даты строкой или числами (Дата("20260101")) там, где нужна текущая дата: такой код требует постоянной правки и ломается незаметно. Также не стоит хранить «сегодня» в константе или параметре сеанса с расчётом обновить её один раз — за ночь значение устаревает, а механизма автоматического обновления у констант нет.

Типичные ошибки
01
Сравнение дат без НачалоДня() — условие никогда не выполняется из-за различия в секундах.
02
ТекущаяДата() без параметров на сервере — расхождение дат у пользователей в разных часовых поясах.
03
Передача даты строкой в запрос вместо параметра — ошибки преобразования и потеря индексации.
04
Хранение «сегодня» в константе — значение устаревает после полуночи.
05
Изменение системного времени сервера ради корректировки дат — сбой последовательности документов и обменов.

FAQ

Чем ТекущаяДатаСеанса() отличается от ТекущейДаты()?

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

Как получить сегодняшнюю дату без времени?

Используйте НачалоДня(ТекущаяДатаСеанса()) — время будет обнулено до 00:00:00. Для конца сегодняшнего дня применяйте КонецДня() — получится 23:59:59, что удобно для границ запросов.

Как получить вчерашнюю или завтрашнюю дату?

Прибавьте или вычтите нужное число секунд: НачалоДня(ТекущаяДатаСеанса()) - 86400 для вчера и + 86400 для завтра, где 86400 — число секунд в сутках. Функций «вчера» и «завтра» во встроенном языке нет.

Почему документы, созданные вечером, датируются следующим днём?

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

Можно ли получить текущую дату прямо в запросе?

Специальной функции «текущая дата» в языке запросов нет. Стандартный приём — вычислить дату в коде через ТекущаяДатаСеанса() и передать её в запрос параметром. Это также улучшает кэширование плана запроса.

Что возвращает ТекущаяДатаСеанса() в регламентном задании?

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

Итог

Что важно запомнить

Для получения сегодняшней даты в 1С используйте ТекущаяДатаСеанса(), для даты без времени — НачалоДня(ТекущаяДатаСеанса()). Не применяйте ТекущаяДата() без параметров на сервере, сравнивайте даты через начало дня и передавайте дату в запросы параметром. Расхождение дат у пользователей почти всегда означает проблему с настройкой часового пояса базы.