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

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

Как правильно получить текущую дату в 1С

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

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

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

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

Как работает функция ТекущаяДата()

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

Это создаёт скрытую ловушку. Один и тот же вызов ТекущаяДата() в разных частях модуля может вернуть разные значения, если часы пользователя расходятся с серверными. Например, у пользователя на компьютере стоит вчерашняя дата — и созданный им документ уйдёт «в прошлое», нарушив последовательность проведения.

Пример простого вызова:

&НаКлиенте

Процедура ПоказатьДату(Команда)

ДатаСейчас = ТекущаяДата(); // время компьютера пользователя

Сообщить(ДатаСейчас);

КонецПроцедуры

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

ТекущаяДатаСеанса() — правильный способ для учётных данных

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

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

&НаСервере

Процедура ЗаполнитьДатуДокумента()

Объект.Дата = ТекущаяДатаСеанса();

КонецПроцедуры

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

Сравнение функций и выбор под задачу

Выбор функции определяется тем, где выполняется код и куда попадёт результат. Таблица ниже помогает быстро сориентироваться.

ФункцияЧто возвращаетГде вызыватьТипичное применение
ТекущаяДата()Время того компьютера, где выполняется кодПреимущественно на клиентеИнтерфейсные подсказки, замер длительности операций на экране
ТекущаяДатаСеанса()Время сервера 1СКлиент и серверДаты документов, периоды регистров, любые данные, сохраняемые в базу

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

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

ТекущаяДата()

Подходит для отображения времени на форме и служебных замеров на клиенте. Ограничение: зависит от часов компьютера пользователя, нельзя использовать для записи в базу.

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

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

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

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

ДатаБезВремени = НачалоДня(ТекущаяДатаСеанса()); // 00:00:00 текущего дня

Распространённая ошибка — сравнивать даты напрямую без приведения к началу дня. Если документ создан в 10:30, а вы сравниваете его дату с ТекущаяДатаСеанса() в 15:00, условие Документ.Дата = ТекущаяДатаСеанса() никогда не выполнится, хотя обе даты относятся к одному дню. Правильно сравнивать НачалоДня(Документ.Дата) = НачалоДня(ТекущаяДатаСеанса()).

Полезные сопутствующие функции для работы с текущей датой:

  • КонецДня(Дата) — 23:59:59 указанного дня, удобно для отборов «по сегодня включительно»;
  • ДобавитьМесяц(Дата, КоличествоМесяцев) — сдвиг даты на месяцы с корректной обработкой конца месяца;
  • Формат(Дата, "ДЛФ=D") — представление даты строкой для вывода пользователю;
  • арифметика с секундами: ТекущаяДатаСеанса() + 86400 — то же время завтрашнего дня.
bsl
ТекДата = ТекущаяДатаСеанса();
НачалоТекущегоДня = НачалоДня(ТекДата);
КонецТекущегоДня = КонецДня(ТекДата);
Завтра = ТекДата + 86400; // сутки в секундах
МесяцНазад = ДобавитьМесяц(ТекДата, -1);

Текущая дата в запросах

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

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

Запрос.Текст = "ВЫБРАТЬ

| Продажи.Номенклатура,

| СУММА(Продажи.Количество) КАК Количество

|ИЗ

| РегистрНакопления.Продажи КАК Продажи

|ГДЕ

| Продажи.Период МЕЖДУ &НачалоДня И &КонецДня

|СГРУППИРОВАТЬ ПО

| Продажи.Номенклатура";

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

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

Запрос.УстановитьПараметр("КонецДня", КонецДня(ТекДата));

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

Порядок действий
  1. 1
    Определите, где выполняется код: на клиенте или на сервере
  2. 2
    Если значение пойдёт в базу — используйте ТекущаяДатаСеанса() независимо от контекста
  3. 3
    Для сравнений по дню приведите обе даты через НачалоДня()
  4. 4
    В запрос передайте дату параметром, задав границы НачалоДня() и КонецДня()
  5. 5
    Проверьте результат на тестовой базе: дата документа должна совпадать с серверным временем

Часовые пояса и универсальное время

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

  • УниверсальноеВремя(ЛокальнаяДата, ЧасовойПояс) — преобразует локальную дату в UTC;
  • МестноеВремя(УниверсальнаяДата, ЧасовойПояс) — обратное преобразование;
  • ЧасовойПоясСеанса() — возвращает часовой пояс текущего сеанса.

Типовой сценарий: при отправке данных во внешнюю систему передавайте время в UTC, а при получении — преобразуйте в часовой пояс сеанса. Это исключает сдвиги дат при обмене между регионами.

ДатаUTC = УниверсальноеВремя(ТекущаяДатаСеанса(), ЧасовойПоясСеанса());

Типичные ошибки и как их избежать

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

Третья ошибка — получение даты внутри цикла обработки данных. Если цикл выполняется дольше секунды, значения в разных итерациях будут различаться, а при переходе через полночь часть записей попадёт в один день, часть — в другой. Получайте дату один раз до цикла.

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

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

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

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

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

Совпадает с временем сервера 1С

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

Совпадает с временем конкретной клиентской машины и различается у разных пользователей

Сравнение 'дата документа = сегодня'
Норма

Условие срабатывает для всех документов текущего дня

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

Условие не срабатывает или срабатывает случайно

Отчёт за текущий день
Норма

Включает записи с 00:00:00 до 23:59:59

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

Теряются утренние или вечерние записи

FAQ

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

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

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

Используйте НачалоДня(ТекущаяДатаСеанса()) — результатом будет 00:00:00 текущего дня. Если нужна строка вида «01.06.2026», примените Формат() с параметром ДЛФ=D.

Можно ли вызвать ТекущаяДатаСеанса() на клиенте?

Да, функция доступна и в клиентском контексте. Платформа сама определяет смещение между клиентским и серверным временем, поэтому отдельный серверный вызов при каждом обращении не выполняется и заметной нагрузки нет.

Почему документы создаются с неправильной датой у одного пользователя?

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

Как получить текущую дату в запросе 1С?

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

Что использовать при обмене данными между базами в разных часовых поясах?

Передавайте время в формате UTC: преобразуйте дату через УниверсальноеВремя() при отправке и через МестноеВремя() при получении. Это исключает сдвиги дат при интеграции между регионами.

Итог

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

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