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