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

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

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

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

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

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

Функция ТекущаяДатаСеанса() — основной способ

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

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

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

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

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

Важно помнить: значение вычисляется в момент вызова. Если сохранить результат в переменную в начале длительной обработки, а потом использовать его для простановки времени в документы, все они получат одинаковое «застывшее» время. Когда нужно фиксировать реальный момент события — вызывайте функцию непосредственно перед записью.

Функция ТекущаяДата() и когда она уместна

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

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

Уместные сценарии для ТекущаяДата(): толстый клиент в файловом режиме, измерение длительности выполнения кода на конкретной машине (замер «до/после»), вывод локального времени в интерфейс, где пользователь ожидает видеть часы своего компьютера.

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

Поскольку отдельного типа «время» в 1С нет, время извлекают из значения типа «Дата» встроенными функциями работы с датами:

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

Час = Час(ДатаВремя); // число от 0 до 23

Минута = Минута(ДатаВремя); // число от 0 до 59

Секунда = Секунда(ДатаВремя); // число от 0 до 59

Если нужно представить время в виде значения даты с пустой датой (01.01.0001), используют вычитание начала дня:

ТолькоВремя = ДатаВремя - НачалоДня(ДатаВремя); // число секунд с начала дня

Результат такого вычитания — число секунд, прошедших с полуночи. Это удобно для сравнений: например, проверить, попадает ли текущий момент в рабочий интервал с 9:00 до 18:00, можно сравнением чисел без всяких строковых преобразований.

Для отображения времени пользователю применяют функцию Формат с шаблоном, о которой рассказано в следующем разделе, — не собирайте строку времени вручную через конкатенацию часов и минут, это ломается на однозначных значениях вроде «9:5».

Форматирование даты и времени для вывода

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

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

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

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

Полностью = Формат(ДатаВремя, "ДЛФ=DT"); // дата и время

Шаблон ДЛФ (локальный формат даты) учитывает региональные настройки, поэтому предпочтителен в интерфейсе. Если нужен строго фиксированный вид, например для имени файла или лога, используют явный шаблон: Формат(ДатаВремя, "ДФ='yyyy-MM-dd HH:mm:ss'").

При выгрузке данных во внешние системы (обмен, веб-сервисы) не полагайтесь на локальные форматы: используйте стандарт ISO 8601 или явный шаблон, согласованный с принимающей стороной, иначе время может быть интерпретировано неверно.

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

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

Часовой пояс базы задаётся в конфигураторе или в консоли кластера и может быть переопределён для конкретного пользователя. Если пояс не задан, сеанс наследует пояс сервера — и тогда пользователи из других регионов увидят «чужое» время даже при правильном коде.

Маршрут решения

Как выбрать действие

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

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

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Вызов ТекущаяДата() на сервере в клиент-серверной базе — документы получают время сервера, а не пользователя
02
Сохранение результата в переменную в начале длительной обработки — все записи получают одно устаревшее время
03
Сборка строки времени конкатенацией Час() и Минута() — получаются значения вида 9:5 вместо 09:05
04
Сравнение дат из разных источников без приведения к одному поясу — ложные срабатывания условий
05
Использование строки даты в запросах вместо параметра типа Дата — потеря индексов и ошибки сравнения

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

Если время в сеансе отличается от ожидаемого, последовательно проверьте: часовой пояс информационной базы, пояс в настройках пользователя, системное время сервера и клиентского компьютера. Рассинхронизация системных часов сервера СУБД и сервера 1С тоже даёт странные сдвиги, которые нельзя исправить кодом.

Краткие итоги

Итог

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

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

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

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

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

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

Можно ли получить время с точностью до миллисекунд?

Да, функция ТекущаяУниверсальнаяДатаВМиллисекундах() возвращает число миллисекунд, прошедших с полуночи 1 января 0001 года по UTC. Она предназначена для точных замеров длительности, а не для отображения пользователю.

Как проверить, наступило ли рабочее время, например после 9:00?

Вычислите число секунд с начала дня: СекундПрошло = ТекущаяДатаСеанса() - НачалоДня(ТекущаяДатаСеанса()) и сравните с 9 * 3600. Такое сравнение чисел надёжнее разбора строк.

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

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

Как вывести время в формате «14:32» без секунд?

Используйте явный шаблон: Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm") для русского кода. Шаблон ДЛФ=T выводит время с секундами, поэтому для короткого вида нужен именно ДФ.

Что делать, если в документах время сдвинуто на несколько часов?

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