Разработка и Конфигурация · 10 мин
Как получить текущую дату и время в 1С
Как получить текущую дату и время в 1С: функция ТекущаяДата(), ТекущаяДатаСеанса, форматирование, отличия тонкого и толстого клиента, примеры кода и типичные ошибки.
Во встроенном языке 1С:Предприятие за получение текущей даты и времени отвечают две функции: ТекущаяДата() и ТекущаяДатаСеанса(). Первая возвращает дату компьютера, на котором выполняется код, вторая — дату сеанса с учётом часового пояса, заданного для информационной базы. Выбор между ними влияет на корректность документов, регистров и отчётов, особенно когда пользователи работают в разных часовых поясах.
Обе функции возвращают значение типа «Дата», которое в 1С всегда содержит и дату, и время с точностью до секунды. Отдельного типа «время» в платформе нет — время хранится как составная часть даты. Это важно учитывать при сравнениях: две даты с одинаковым календарным днём, но разным временем считаются разными значениями.
Ниже разобраны синтаксис функций, различия между клиентским и серверным контекстом, форматирование даты для вывода, работа с часовыми поясами и типичные ошибки, которые приводят к «съехавшим» датам в документах.
Функция ТекущаяДата(): синтаксис и поведение
Функция вызывается без параметров и возвращает текущую дату и время компьютера, на котором исполняется код:
ДатаСейчас = ТекущаяДата();
Сообщить(ДатаСейчас); // например: 15.03.2026 14:32:07
Ключевой момент — контекст выполнения. Если код выполняется на клиенте (директива &НаКлиенте), функция вернёт время пользовательского компьютера. Если на сервере (&НаСервере) — время сервера 1С или сервера СУБД в зависимости от режима. В файловой базе на локальном компьютере разницы нет, в клиент-серверном варианте часы пользователя и сервера могут расходиться.
До версии платформы 8.3 функция называлась ТекущаяДата() и работала одинаково. В современных версиях она сохранена для совместимости, но в типовых конфигурациях в серверном коде повсеместно применяется ТекущаяДатаСеанса(). При разработке новых механизмов следуйте этому же подходу.
ДатаДокумента = ТекущаяДатаСеанса();
Сообщить(Формат(ДатаДокумента, "ДЛФ=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Создайте в общем модуле с флагом «Сервер» функцию, возвращающую ТекущаяДатаСеанса()
- 2В клиентской процедуре формы вызовите эту серверную функцию
- 3Присвойте результат реквизиту Объект.Дата
- 4Проверьте: откройте форму, создайте документ и сверьте дату с серверным временем
Часовые пояса и универсальное время
Для баз с пользователями в разных регионах платформа предлагает три уровня работы со временем. Первый — часовой пояс информационной базы, задаётся в консоли кластера или через УстановитьЧасовойПоясИнформационнойБазы(). Второй — пояс сеанса, который можно переопределить для конкретного пользователя через УстановитьЧасовойПоясСеанса(). Третий — универсальное время UTC через функцию УниверсальноеВремя().
Для интеграций храните метки времени в UTC и конвертируйте при отображении. Функции МестноеВремя() и УниверсальноеВремя() позволяют переводить значения между поясами. Смешивание в одном регистре локальных и универсальных меток без явного признака — частый источник ошибок при обмене с внешними системами.
Проверить, какой пояс реально использует сеанс, можно функцией ПолучитьЧасовойПоясСеанса(). Если она возвращает пустую строку, действует пояс сервера или базы — уточните настройку у администратора.
Типичные ошибки и как их проверить
Самая распространённая ошибка — использование ТекущаяДата() в серверной бизнес-логике там, где нужна ТекущаяДатаСеанса(). Внешне всё работает, пока не появляется пользователь в другом поясе или пока не «плывут» часы на чьём-то компьютере. Вторая частая ошибка — сравнение дат без приведения к началу дня, из-за чего условия «за сегодня» не срабатывают.
Третья группа ошибок связана с форматированием: передача даты строкой в запрос вместо параметра типа «Дата» и разбор строк, сформированных региональным форматом по умолчанию. Строковые даты в условиях запроса не сравниваются как даты — отбор молча возвращает пустой результат.
Как проверить результат
Совпадает с серверным временем базы у всех пользователей
У части пользователей дата смещена на несколько часов
Попадают все документы текущего календарного дня
Документы утренних часов не попадают в выборку
Строка в явном формате, например 2026-03-15T14:32:07
Формат зависит от региональных настроек компьютера
Что важно запомнить
В серверном коде используйте ТекущаяДатаСеанса(), на клиенте доступна только ТекущаяДата(). Для сравнений приводите даты через НачалоДня(), для вывода и обмена — форматируйте явно через Формат(). В запросы дату передавайте параметром типа «Дата», а не строкой.
Частые вопросы
Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время компьютера, где исполняется код, а ТекущаяДатаСеанса() — время, приведённое к часовому поясу сеанса информационной базы. В файловой базе на одном компьютере значения совпадают; в клиент-серверной работе с пользователями в разных поясах — могут существенно различаться. Для дат документов и регистров применяйте ТекущаяДатаСеанса().
Как получить только дату без времени?
Используйте НачалоДня(ТекущаяДатаСеанса()) — время обнулится до 00:00:00. Для вывода пользователю без времени примените Формат(Дата, "ДЛФ=D"). Полностью «убрать» время из типа «Дата» нельзя: тип всегда содержит и дату, и время.
Почему ТекущаяДатаСеанса() недоступна в клиентской процедуре?
Функция работает только в серверном контексте, потому что пояс сеанса определяется на стороне сервера. Если дата нужна в клиентском коде, создайте серверную функцию в общем модуле с флагом «Сервер» и вызовите её из клиентской процедуры.
Как получить текущую дату в запросе 1С?
В языке запросов нет функции текущей даты. Вычислите значение до выполнения запроса через ТекущаяДатаСеанса() и передайте его методом УстановитьПараметр(). Это и надёжнее, и быстрее, чем вычисления внутри текста запроса.
Как узнать дату в формате для обмена с внешней системой?
Сформируйте строку явным шаблоном: Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-ddTHH:mm:ss"). Для интеграций между часовыми поясами надёжнее передавать время в UTC, полученное через УниверсальноеВремя(), и конвертировать его на стороне приёмника.
Можно ли изменить дату, которую платформа подставляет в новый документ?
Да. Платформа при создании документа автоматически заполняет реквизит «Дата» текущей датой сеанса. Переопределить значение можно в обработчике «ПриСозданииНаСервере» формы или в обработке заполнения объекта, но делать это стоит только под конкретное требование учёта — произвольная подмена дат нарушает хронологию документов.