Разработка и Конфигурация · 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, а показывать пользователю в его поясе — общепринятая безопасная практика.
Проверка результата и типичные ошибки
После внедрения кода проверьте результат не по коду, а по фактическим данным: создайте тестовый документ, сравните его дату с реальным временем пользователя, откройте журнал регистрации и сверьте метки событий. Расхождение на целое число часов — верный признак проблемы с поясами.
Ещё одна частая проблема — использование текущей даты в запросах через строковую подстановку. Передавайте момент времени в запрос параметром Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса()): это и быстрее, и исключает ошибки преобразования форматов.
Если время в сеансе отличается от ожидаемого, последовательно проверьте: часовой пояс информационной базы, пояс в настройках пользователя, системное время сервера и клиентского компьютера. Рассинхронизация системных часов сервера СУБД и сервера 1С тоже даёт странные сдвиги, которые нельзя исправить кодом.
Краткие итоги
Что важно запомнить
Основная функция — ТекущаяДатаСеанса(): она даёт время в поясе сеанса и безопасна в клиент-серверном режиме. ТекущаяДата() возвращает время машины, где выполняется код, и годится только для локальных сценариев. Время выделяют функциями Час(), Минута(), Секунда(), а для вывода используют Формат(). Для интеграций между регионами храните моменты в универсальном времени UTC.
Для подавляющего большинства задач достаточно запомнить одно правило: в серверном коде — всегда ТекущаяДатаСеанса(), локальные замеры и толстый клиент — ТекущаяДата(), обмен между поясами — ТекущаяУниверсальнаяДата(). Это покрывает типовые сценарии и защищает от самых неприятных ошибок, связанных со временем.
Частые вопросы
Чем ТекущаяДатаСеанса() отличается от ТекущаяДата()?
ТекущаяДатаСеанса() приводит время к часовому поясу сеанса пользователя, а ТекущаяДата() возвращает системное время компьютера, где выполняется код — клиента или сервера. В файловой базе результаты совпадают, в клиент-серверной могут различаться на величину сдвига поясов.
Можно ли получить время с точностью до миллисекунд?
Да, функция ТекущаяУниверсальнаяДатаВМиллисекундах() возвращает число миллисекунд, прошедших с полуночи 1 января 0001 года по UTC. Она предназначена для точных замеров длительности, а не для отображения пользователю.
Как проверить, наступило ли рабочее время, например после 9:00?
Вычислите число секунд с начала дня: СекундПрошло = ТекущаяДатаСеанса() - НачалоДня(ТекущаяДатаСеанса()) и сравните с 9 * 3600. Такое сравнение чисел надёжнее разбора строк.
Почему в тонком клиенте ТекущаяДата() недоступна на сервере в некоторых контекстах?
В управляемых формах клиентские и серверные контексты разделены. Если процедура имеет директиву &НаСервере, ТекущаяДата() вернёт время сервера, что обычно не то, что нужно. Используйте ТекущаяДатаСеанса() — она доступна и корректна в обоих контекстах.
Как вывести время в формате «14:32» без секунд?
Используйте явный шаблон: Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm") для русского кода. Шаблон ДЛФ=T выводит время с секундами, поэтому для короткого вида нужен именно ДФ.
Что делать, если в документах время сдвинуто на несколько часов?
Проверьте, не используется ли в коде проведения ТекущаяДата() на сервере, и сверьте часовой пояс информационной базы с фактическим поясом пользователей. После исправления кода уже записанные документы потребуется перепровести или скорректировать обработкой.