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

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

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

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

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

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

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

Функция ТекущаяДата(): синтаксис и поведение

Функция вызывается без параметров и возвращает текущую дату и время компьютера, на котором исполняется код:

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

Сообщить(ДатаСейчас); // например: 15.03.2026 14:32:07

Ключевой момент — контекст выполнения. Если код выполняется на клиенте (директива &НаКлиенте), функция вернёт время пользовательского компьютера. Если на сервере (&НаСервере) — время сервера 1С или сервера СУБД в зависимости от режима. В файловой базе на локальном компьютере разницы нет, в клиент-серверном варианте часы пользователя и сервера могут расходиться.

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

bsl
ДатаДокумента = ТекущаяДатаСеанса();
Сообщить(Формат(ДатаДокумента, "ДЛФ=DT"));

ТекущаяДатаСеанса(): почему её используют в типовых

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

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

Синтаксис идентичен — вызов без параметров:

&НаСервере

Процедура ЗаписатьДатуОперации()

ДатаОперации = ТекущаяДатаСеанса();

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

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

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

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

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

Стандарт для серверной бизнес-логики: даты документов, регистров, регламентных заданий. Единый часовой пояс для всех пользователей базы.

УниверсальноеВремя()

Возвращает время UTC. Используется для обмена данными между системами в разных поясах и для хранения меток времени в интеграциях.

Как вывести дату в нужном формате

Значение типа «Дата» при выводе в строку преобразуется по региональным настройкам, что не всегда удобно. Для контроля формата применяется функция Формат() с параметром форматной строки:

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

Строка1 = Формат(Д, "ДЛФ=D"); // только дата: 15.03.2026

Строка2 = Формат(Д, "ДЛФ=T"); // только время: 14:32:07

Строка3 = Формат(Д, "ДЛФ=DT"); // дата и время

Строка4 = Формат(Д, "ДФ=yyyy-MM-dd"); // 2026-03-15 для обмена

Для обмена данными с внешними системами (веб-сервисы, JSON, CSV) используйте явные шаблоны через параметр ДФ: yyyy-MM-dd, dd.MM.yyyy HH:mm:ss. Не полагайтесь на формат по умолчанию — на другом компьютере с иными региональными настройками строка может оказаться другой, и разбор даты на принимающей стороне сломается.

Если нужна только дата без времени (например, для сравнения «сегодня ли документ»), обрежьте время функцией НачалоДня():

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

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

КонецЕсли;

Получение даты в разных контекстах: клиент, сервер, запрос

На клиенте

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

На сервере

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

В запросе

В языке запросов функции «текущая дата» нет. Дату передают параметром:

Запрос = Новый Запрос("ВЫБРАТЬ ... ГДЕ Продажи.Период >= &НачалоДня");

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

Значение вычисляется один раз до выполнения запроса и передаётся как параметр — это и правильно, и быстрее, чем вычисления внутри запроса.

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

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

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

Для интеграций храните метки времени в UTC и конвертируйте при отображении. Функции МестноеВремя() и УниверсальноеВремя() позволяют переводить значения между поясами. Смешивание в одном регистре локальных и универсальных меток без явного признака — частый источник ошибок при обмене с внешними системами.

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

Типичные ошибки и как их проверить

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

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

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

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

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

Совпадает с серверным временем базы у всех пользователей

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

У части пользователей дата смещена на несколько часов

Отбор «за сегодня» в отчёте
Норма

Попадают все документы текущего календарного дня

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

Документы утренних часов не попадают в выборку

Дата в обмене данными
Норма

Строка в явном формате, например 2026-03-15T14:32:07

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

Формат зависит от региональных настроек компьютера

Итог

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

В серверном коде используйте ТекущаяДатаСеанса(), на клиенте доступна только ТекущаяДата(). Для сравнений приводите даты через НачалоДня(), для вывода и обмена — форматируйте явно через Формат(). В запросы дату передавайте параметром типа «Дата», а не строкой.

Частые вопросы

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

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

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

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

Почему ТекущаяДатаСеанса() недоступна в клиентской процедуре?

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

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

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

Как узнать дату в формате для обмена с внешней системой?

Сформируйте строку явным шаблоном: Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-ddTHH:mm:ss"). Для интеграций между часовыми поясами надёжнее передавать время в UTC, полученное через УниверсальноеВремя(), и конвертировать его на стороне приёмника.

Можно ли изменить дату, которую платформа подставляет в новый документ?

Да. Платформа при создании документа автоматически заполняет реквизит «Дата» текущей датой сеанса. Переопределить значение можно в обработчике «ПриСозданииНаСервере» формы или в обработке заполнения объекта, но делать это стоит только под конкретное требование учёта — произвольная подмена дат нарушает хронологию документов.