Разработка и Конфигурация · 11 мин
Как получить сегодняшнюю дату в 1С
Как получить сегодняшнюю дату в 1С: функции ТекущаяДата() и ТекущаяДатаСеанса(), различия, работа с датой без времени, типичные ошибки и примеры кода.
Во встроенном языке 1С:Предприятие сегодняшнюю дату возвращают две функции: ТекущаяДатаСеанса() и ТекущаяДата(). Обе возвращают значение типа «Дата» с точностью до секунды, но берут его из разных источников, и при разных часовых поясах клиента и сервера результат может отличаться. Выбор правильной функции влияет на корректность проведения документов, расчёта сроков и формирования отчётов.
Для большинства прикладных задач — подстановка даты в документ, сравнение сроков, вычисление периодов — рекомендуется использовать ТекущаяДатаСеанса(). Функция ТекущаяДата() без параметров возвращает дату компьютера, на котором выполняется код, и её поведение зависит от того, где исполняется фрагмент: на клиенте или на сервере.
Ниже разобраны синтаксис обеих функций, их различия, способы получить дату без времени, работа с часовыми поясами и типичные ошибки, которые приводят к «вчерашним» или «завтрашним» документам в базе.
Функция ТекущаяДатаСеанса() — основной способ
Функция ТекущаяДатаСеанса() не имеет параметров и возвращает дату и время, соответствующие началу текущего сеанса пользователя с учётом его часового пояса. Именно её рекомендует использовать вендор во всех прикладных разработках, потому что результат предсказуем: все пользователи в одном часовом поясе получат одинаковую дату независимо от того, где физически расположен сервер.
Пример использования:
ДатаСегодня = ТекущаяДатаСеанса();
Сообщить("Сегодня: " + Формат(ДатаСегодня, "ДЛФ=D"));
Функция доступна и на толстом, и на тонком, и на веб-клиенте, и на сервере. В запросах дату сеанса обычно передают параметром, чтобы запрос оставался детерминированным и корректно кэшировался:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.Реализация
|ГДЕ Дата >= &НачалоСегодня";
Запрос.УстановитьПараметр("НачалоСегодня", НачалоДня(ТекущаяДатаСеанса()));
Функция ТекущаяДата() и почему с ней осторожно
Функция ТекущаяДата(), вызванная без параметра, возвращает дату компьютера, на котором исполняется код. Если код выполняется на сервере — это серверное время, если на клиенте — время рабочей станции пользователя. В файловом варианте базы оба понятия совпадают, и разницы не видно, но в клиент-серверном режиме при расхождении часовых поясов или неверно настроенном времени на одной из машин результаты будут отличаться.
Начиная с версии платформы 8.3 вызов ТекущаяДата() без параметров на сервере выдаёт предупреждение при проверке конфигурации, а в новых разработках считается устаревшим приёмом. Вместо него предлагается либо ТекущаяДатаСеанса(), либо вариант с явным указанием часового пояса.
Функция поддерживает необязательный параметр — часовой пояс в виде строки (например, "Europe/Moscow"). Тогда дата приводится к указанному поясу независимо от настроек сервера:
ДатаВМоскве = ТекущаяДата("Europe/Moscow");
Сравнение вариантов
Основной вариант для прикладного кода. Учитывает часовой пояс сеанса, результат одинаков на клиенте и сервере.
Дата компьютера, где исполняется код. Риск расхождения в клиент-серверном режиме; считается устаревшим приёмом.
Когда нужна дата в конкретном поясе, отличном от пояса сеанса, например для интеграции с внешней системой.
Когда бухгалтер вручную установил рабочую дату и документы должны вводиться «задним числом» — но это не текущая календарная дата.
Как получить только дату без времени
Тип «Дата» в 1С всегда содержит и дату, и время с точностью до секунды. «Чистой» даты без времени как отдельного типа не существует — вместо этого время обнуляют, приводя значение к началу дня. Для этого служит функция НачалоДня():
Сегодня = НачалоДня(ТекущаяДатаСеанса());
// Результат: сегодняшняя дата, время 00:00:00
Такое обнуление критично при сравнениях. Проверка ДатаДокумента = ТекущаяДатаСеанса() почти никогда не сработает, потому что время у значений различается на секунды. Правильно сравнивать начала дней или использовать диапазоны:
Если НачалоДня(ДатаДокумента) = НачалоДня(ТекущаяДатаСеанса()) Тогда
// Документ датирован сегодня
КонецЕсли;
Для выборки документов за сегодня в запросе используют пару границ: от НачалоДня() до КонецДня() (23:59:59). Это надёжнее, чем сравнение с точным моментом времени.
Рабочая дата и её отличие от текущей
В 1С существует понятие рабочей даты — значение, которое пользователь может установить вручную (в толстом клиенте через настройки, в управляемом приложении — через функциональность конкретной конфигурации, если она предусмотрена). Рабочая дата подставляется по умолчанию в новые документы и позволяет вводить операции «задним числом», не меняя системное время.
Получить рабочую дату программно можно через РабочаяДата (в клиентском контексте) или через механизмы общих модулей конкретной конфигурации — во многих типовых решениях есть функции вида ТекущаяДатаПользователя() или аналогичные. Важно понимать: рабочая дата не обязана совпадать с календарной, и смешивать эти понятия в коде нельзя.
Если задача — узнать именно «сегодня» по календарю, используйте ТекущаяДатаСеанса(). Если задача — подставить дату в новый документ так, как ожидает пользователь, ориентируйтесь на рабочую дату или стандартные обработчики заполнения документа, где эта логика уже реализована.
Часовые пояса и типичные проблемы с датой
В распределённых системах — сервер в одном регионе, пользователи в другом — дата сеанса формируется с учётом часового пояса, заданного для информационной базы или сеанса. Если пояс не настроен, применяется пояс сервера, и пользователь из другого региона может получить «завтрашнюю» или «вчерашнюю» дату в вечерние и ночные часы.
Признак проблемы: документы, созданные вечером, уходят на следующий день, или отчёт «за сегодня» у части пользователей пустой. Решение — проверить настройку часового пояса информационной базы (в конфигураторе или через функцию ПолучитьЧасовойПоясИнформационнойБазы()) и при необходимости задать его явно командой УстановитьЧасовойПоясИнформационнойБазы().
Отдельный случай — регламентные задания. Они выполняются на сервере без пользовательского сеанса в привычном смысле, поэтому дата внутри регламентного задания соответствует серверному времени с учётом пояса базы. Если задание должно оперировать датой конкретного региона, пояс нужно задавать явно.
Проверка результата и отладка
Убедиться, что функция возвращает ожидаемое значение, проще всего через отладчик: поставьте точку останова после присваивания и посмотрите значение переменной. Альтернатива — вывод в сообщения:
Сообщить("Сеанс: " + ТекущаяДатаСеанса()
+ ", пояс базы: " + ПолучитьЧасовойПоясИнформационнойБазы());
Сравните выведенные дату и время с тем, что видит пользователь на своём компьютере. Совпадение в пределах минуты — норма. Расхождение на целые часы указывает на проблему с часовым поясом, расхождение на минуты — на рассинхронизацию времени между клиентом и сервером, которую обычно решает служба синхронизации времени (NTP) на уровне операционной системы.
Как проверить результат
Совпадает с календарной датой и временем пользователя
Отличается на целые часы — проверяйте часовой пояс базы
Подставляется ожидаемая дата (рабочая или текущая)
Дата «завтра» или «вчера» в вечерние часы — расхождение поясов
Сравниваются НачалоДня() от обеих дат
Сравнение точных значений даёт ложное «не равно»
Расхождение не более минуты
Минуты и более — проверьте синхронизацию времени ОС
Частые ошибки при работе с текущей датой
Самая распространённая ошибка — сравнение дат «в лоб» без приведения к началу дня. Условие Дата = ТекущаяДатаСеанса() фактически никогда не истинно, и логика «сегодняшних» документов молча не срабатывает. Вторая типичная ошибка — использование ТекущаяДата() на сервере в клиент-серверном режиме, из-за чего у пользователей из других регионов «плывут» даты.
Ещё одна ошибка — формирование даты строкой или числами (Дата("20260101")) там, где нужна текущая дата: такой код требует постоянной правки и ломается незаметно. Также не стоит хранить «сегодня» в константе или параметре сеанса с расчётом обновить её один раз — за ночь значение устаревает, а механизма автоматического обновления у констант нет.
FAQ
Чем ТекущаяДатаСеанса() отличается от ТекущейДаты()?
ТекущаяДатаСеанса() возвращает дату и время с учётом часового пояса сеанса и одинакова на клиенте и сервере. ТекущаяДата() без параметров возвращает время компьютера, где исполняется код, и в клиент-серверном режиме может отличаться от того, что видит пользователь.
Как получить сегодняшнюю дату без времени?
Используйте НачалоДня(ТекущаяДатаСеанса()) — время будет обнулено до 00:00:00. Для конца сегодняшнего дня применяйте КонецДня() — получится 23:59:59, что удобно для границ запросов.
Как получить вчерашнюю или завтрашнюю дату?
Прибавьте или вычтите нужное число секунд: НачалоДня(ТекущаяДатаСеанса()) - 86400 для вчера и + 86400 для завтра, где 86400 — число секунд в сутках. Функций «вчера» и «завтра» во встроенном языке нет.
Почему документы, созданные вечером, датируются следующим днём?
Скорее всего, часовой пояс информационной базы не совпадает с поясом пользователя, а дата берётся по серверному времени. Проверьте настройку пояса базы и используйте ТекущаяДатаСеанса() вместо серверной ТекущаяДата().
Можно ли получить текущую дату прямо в запросе?
Специальной функции «текущая дата» в языке запросов нет. Стандартный приём — вычислить дату в коде через ТекущаяДатаСеанса() и передать её в запрос параметром. Это также улучшает кэширование плана запроса.
Что возвращает ТекущаяДатаСеанса() в регламентном задании?
Дату и время сервера с учётом часового пояса информационной базы, поскольку у фонового сеанса нет пользовательского пояса. Если задание должно работать с датой конкретного региона, задайте пояс явно через параметр ТекущаяДата() или настройку пояса базы.
Что важно запомнить
Для получения сегодняшней даты в 1С используйте ТекущаяДатаСеанса(), для даты без времени — НачалоДня(ТекущаяДатаСеанса()). Не применяйте ТекущаяДата() без параметров на сервере, сравнивайте даты через начало дня и передавайте дату в запросы параметром. Расхождение дат у пользователей почти всегда означает проблему с настройкой часового пояса базы.