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