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

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

Как вывести текущее время в 1С

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

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

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

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

Какие функции возвращают текущие дату и время

В 1С дата и время — единый тип «Дата», поэтому «текущее время» — это значение, полученное одной из двух функций, с последующим отсечением даты при форматировании. Разница между функциями принципиальна.

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

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

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

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

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

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

Рекомендуется для серверного кода и клиент-серверных баз. Ограничение: доступна только там, где есть контекст сеанса (не на мобильном клиенте без связи).

ТекущаяУниверсальнаяДата()

Возвращает время UTC. Подходит для обмена данными между базами в разных часовых поясах, для вывода пользователю требует пересчёта.

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

Простейший сценарий — показать пользователю текущее время в сообщении или в поле формы. В клиентской процедуре используйте ТекущаяДата() и функцию Формат() с параметром «ДЛФ=T» (локальный формат времени):

// Клиентская процедура

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

Сообщить("Сейчас: " + Формат(ТекВремя; "ДЛФ=T"));

Формат «ДЛФ=T» выводит только время без даты, в виде «ЧЧ:ММ:СС». Если нужно без секунд, используйте явную строку формата: Формат(ТекущаяДата(); "ДФ=ЧЧ:мм"). Обратите внимание на регистр букв: «мм» — минуты, «ММ» — месяц; ошибка в регистре даёт вместо минут номер месяца.

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

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

Как получить время на сервере

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

// Серверная процедура

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

ЗаписьЖурналаРегистрации("Обмен", , , , Формат(ТекВремя; "ДЛФ=DT"));

Формат «ДЛФ=DT» выводит дату и время целиком — это удобно для журналов и логов. Если из клиентской процедуры нужно серверное время, вызовите серверную функцию, которая вернёт ТекущаяДатаСеанса(), а не передавайте клиентское ТекущаяДата() на сервер.

Часовой пояс сеанса при необходимости задаётся программно: УстановитьЧасовойПоясСеанса("Europe/Moscow"). После этого ТекущаяДатаСеанса() будет возвращать время в указанном поясе — это актуально для распределённых баз и пользователей из других регионов.

Как вывести время в печатной форме и отчёте

В макете табличного документа время выводится через параметр или шаблон. В модуле менеджера печати параметр заполняется значением даты, а в свойствах ячейки макета устанавливается форматная строка, например ДФ=ЧЧ:мм. Тогда макет сам отформатирует значение при выводе.

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

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

Если в отчёте нужно показать момент формирования, добавьте в макет СКД вычисляемое поле или выведите параметр в заголовок отчёта с форматом «ДЛФ=DT». Это стандартная практика для отчётов, которые печатаются или отправляются по почте.

Вывести текущее время на форму
  1. 1
    Добавьте на форму реквизит типа «Дата» и элемент «Поле» для его отображения.
  2. 2
    В свойствах поля задайте Формат: ДЛФ=T или ДФ=ЧЧ:мм:сс.
  3. 3
    В обработчике «ПриСозданииНаСервере» присвойте реквизиту ТекущаяДатаСеанса().
  4. 4
    Для автообновления времени используйте ПодключитьОбработчикОжидания с периодичностью, например 1 секунда, и обновляйте реквизит.
  5. 5
    Откройте форму и проверьте, что время отображается и обновляется без ошибок.

Форматирование: как вывести время в нужном виде

Функция Формат() принимает значение даты и строку формата. Для времени доступны следующие основные варианты:

  • ДЛФ=T — локальный формат времени, «ЧЧ:ММ:СС»;
  • ДЛФ=DT — дата и время полностью;
  • ДФ=ЧЧ:мм:сс — явный формат с секундами;
  • ДФ=ЧЧ:мм — часы и минуты без секунд;
  • ДФ="ч ЧЧ мин мм" — произвольный текст с подстановкой.

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

Если нужно получить дату без времени (начало дня), используйте НачалоДня(ТекущаяДатаСеанса()), а для конца дня — КонецДня(). Для арифметики со временем — ДобавитьКДате() или простое сложение с числом секунд: ТекущаяДатаСеанса() + 3600 прибавит час.

Типичные ошибки
01
Написать ДФ=ЧЧ:ММ — вместо минут выводится номер месяца. Правильно: ДФ=ЧЧ:мм.
02
Использовать ТекущаяДата() на клиенте для записи данных в базу — время разных пользователей расходится, нарушается хронология документов.
03
Искать несуществующую функцию ТекущееВремя() — в 1С время всегда часть типа «Дата», берите ТекущаяДатаСеанса() и форматируйте.
04
Забыть, что на сервере недоступен Сообщить пользователю напрямую в некоторых контекстах — используйте СообщениеПользователю или возврат значения на клиент.
05
Сравнивать время строковым сравнением — сравнивайте значения типа «Дата», а не их строковые представления.

Проверка результата и разница часовых поясов

После внедрения кода проверьте, что выводимое время совпадает с ожидаемым. В файловой базе достаточно сверить с системными часами. В клиент-серверной — убедитесь, что время документов соответствует серверному, а не клиентскому, особенно если пользователи работают из разных часовых поясов через веб-клиент или RDP.

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

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

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

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

Вывод времени в сообщении
Норма

Формат ЧЧ:мм:сс, значение совпадает с системными часами

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

Вместо минут выводится месяц или время отличается на целые часы

Время в записанных документах
Норма

У всех пользователей единая хронология, время серверное

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

Документы разных пользователей разъезжаются по времени

Обновление часов на форме
Норма

Время меняется каждую секунду/минуту без мерцания формы

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

Время застыло или форма перерисовывается целиком

Итог

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

Отдельной функции «текущее время» в 1С нет: берите ТекущаяДатаСеанса() на сервере (или ТекущаяДата() на клиенте в файловой базе) и выводите через Формат(...; "ДЛФ=T") или "ДФ=ЧЧ:мм:сс". Для записи в базу — только серверное время сеанса.

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

Есть ли в 1С функция ТекущееВремя()?

Нет, такой функции не существует. Время всегда является частью значения типа «Дата». Получите дату через ТекущаяДатаСеанса() или ТекущаяДата() и выведите только время функцией Формат с параметром «ДЛФ=T» или строкой «ДФ=ЧЧ:мм:сс».

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

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

Как вывести время без секунд?

Используйте явную строку формата: Формат(ТекущаяДатаСеанса(); "ДФ=ЧЧ:мм"). Буквы «мм» обязательно строчные — заглавные «ММ» означают месяц.

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

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

Как сделать бегущие часы на форме?

Добавьте реквизит формы типа «Дата», выведите его полем с форматом «ДЛФ=T», затем в «ПриОткрытии» вызовите ПодключитьОбработчикОжидания("ОбновитьВремя", 1) и в обработчике присваивайте реквизиту актуальное время. Не забудьте отключить обработчик при закрытии формы.

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

Дата в 1С хранится с точностью до секунды, поэтому достаточно сложения: ТекущаяДатаСеанса() + 7200 прибавит два часа. Для более читаемого кода используйте ДобавитьКДату(ТекущаяДатаСеанса(); "Час"; 2).