Получение текущего времени в 1С 8.3: от кнопки до кода

· 9 мин

Содержание

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

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

Текущее время на клиенте: ТекущаяДата и ТекущаяДатаСеанса

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

Сообщить(ТекущаяДата());              // 07.10.2026 14:35:12
Сообщить(Час(ТекущаяДата()));         // 14
Сообщить(Минута(ТекущаяДата()));      // 35
Сообщить(Секунда(ТекущаяДата()));     // 12

Функции Час(), Минута(), Секунда() возвращают число и работают с любым значением типа Дата.

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

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

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

В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) при программном заполнении дат опирайтесь на ТекущаяДатаСеанса(). Это заложено и в самих типовых решениях.

А что видит обычный пользователь

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

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

Когда код выполняется на сервере, ТекущаяДата() и ТекущаяДатаСеанса() дают серверное время. Но за кадром остаётся часовой пояс: одно и то же универсальное время в Москве и Владивостоке выглядит по-разному.

Узнать часовой пояс сеанса и базы:

Сообщить(ЧасовойПоясСеанса());               // Europe/Moscow
Сообщить(ЧасовойПоясИнформационнойБазы());   // Europe/Moscow

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

Для перевода между местным и универсальным (UTC) временем есть пара функций:

ФункцияЧто делает
ТекущаяУниверсальнаяДата()текущее время по UTC
УниверсальноеВремя(Дата, ЧасовойПояс)местное → UTC
МестноеВремя(Дата, ЧасовойПояс)UTC → местное
UTC = ТекущаяУниверсальнаяДата();
МсковскоеВремя = МестноеВремя(UTC, "Europe/Moscow");

Храните и передавайте между системами именно универсальное время. Тогда при обмене между филиалами в разных поясах не возникнет путаницы «чьи это 14:00».

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

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

Через локализованный формат (подстроится под язык и региональные настройки):

Сообщить(Формат(ТекущаяДатаСеанса(), "ДЛФ=T"));   // 14:35:12
Сообщить(Формат(ТекущаяДатаСеанса(), "ДЛФ=DT"));  // 07.10.2026 14:35:12
  • ДЛФ=T — только время;
  • ДЛФ=D — только дата;
  • ДЛФ=DT — дата и время.

Через явную маску, когда формат нужен фиксированный:

Сообщить(Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm:ss"));  // 14:35:12
Сообщить(Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm"));     // 14:35

В маске HH — часы в 24-часовом формате, mm — минуты, ss — секунды. Буквы латинские и регистрозависимые: mm это минуты, а MM — месяц. Для 12-часового вида берут hh и признак половины суток tt:

Сообщить(Формат(ТекущаяДатаСеанса(), "ДФ=hh:mm tt"));  // 02:35 PM

Основные буквы маски:

БукваЗначение
HHчасы, 00–23
hhчасы, 01–12
mmминуты
ssсекунды
ttAM / PM

Отдельная частая задача — «обнулить» время, то есть получить начало или конец дня:

НачалоСуток = НачалоДня(ТекущаяДатаСеанса());   // 07.10.2026 00:00:00
КонецСуток  = КонецДня(ТекущаяДатаСеанса());    // 07.10.2026 23:59:59

Эти функции удобны при построении отбора «за сегодня» или границ периода.

Арифметика времени: сколько прошло и когда наступит

Узнать время — полдела. Чаще нужно посчитать, сколько его прошло между двумя моментами или на сколько сдвинуть отметку. Во встроенном языке для этого есть две функции.

РазностьДат() возвращает разницу между датами в выбранных единицах — секундах, минутах, часах или днях:

Прошло = РазностьДат(ДатаНачала, ДатаОкончания, "Час");
Сообщить("Прошло часов: " + Прошло);

Если нужна разница просто в секундах, даты можно вычесть напрямую — результат будет числом секунд:

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

ДобавитьМесяц() сдвигает дату на целое число месяцев (в том числе назад, с отрицательным числом). А чтобы прибавить часы или секунды, достаточно арифметики: Дата + 3600 добавит ровно один час, потому что единица измерения даты — секунда.

ЧерезЧас = ТекущаяДатаСеанса() + 3600;    // +1 час
ЧерезСутки = ТекущаяДатаСеанса() + 86400; // +24 часа

86400 — число секунд в сутках. Сдвиг на сутки прибавлением секунд работает корректно; при сдвиге на месяцы и годы берите ДобавитьМесяц(), чтобы не промахнуться мимо разной длины месяцев.

В языке запросов для тех же задач есть РАЗНОСТЬДАТ() и ДОБАВИТЬКДАТЕ() — например, ДОБАВИТЬКДАТЕ(Документ.Дата, ДЕНЬ, 3) вернёт дату на три дня позже даты документа.

Время в запросах к базе данных

Внутри текста запроса время берут функцией языка запросов ТЕКУЩАЯДАТА(). Она возвращает дату и время сервера на момент начала выполнения запроса и вычисляется один раз — все строки получат одно и то же значение.

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |    Задачи.Ссылка,
    |    Задачи.Срок
    |ИЗ
    |    Задача.ЗадачаИсполнителя КАК Задачи
    |ГДЕ
    |    Задачи.Срок < ТЕКУЩАЯДАТА()";

Так отбирают просроченные задачи, документы «до текущего момента» и подобное.

Если нужно сравнение не с серверным временем, а с временем сеанса (с учётом возможного смещения), передавайте дату параметром из встроенного языка:

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
// ... в тексте запроса: ГДЕ Задачи.Срок < &ТекущаяДата

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

В самом запросе время тоже можно разложить — функциями ЧАС(), МИНУТА(), СЕКУНДА(), применёнными к полю типа дата.

Чтобы сравнить поле с конкретным моментом, а не с текущим, в запросе используют литерал даты ДАТАВРЕМЯ():

ГДЕ Документ.Дата >= &НачалоДня

где НачалоДня передан параметром, либо прямо в тексте — ДАТАВРЕМЯ(2026,1,1,0,0,0). Литерал задают числами: год, месяц, день и, при необходимости, часы-минуты-секунды.

Как вывести текущее время на управляемую форму

Чтобы показать пользователю время в форме, заводят реквизит формы типа Дата и заполняют его. Поскольку время для данных надёжнее брать серверное, заполнение делают в серверной процедуре.

&НаСервереБезКонтекста
Функция ПолучитьВремяСервера()
    Возврат ТекущаяДатаСеанса();
КонецФункции

&НаКлиенте
Процедура ОбновитьВремя(Команда)
    ТекущееВремя = ПолучитьВремяСервера();
КонецПроцедуры

Реквизит ТекущееВремя с типом Дата и составом «Время» покажет на форме только часы-минуты-секунды. Если состав оставить «Дата и время», отобразятся и число, и время.

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

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

Миллисекунды и точность в нагруженных системах

Тип Дата хранит время с точностью до секунды. Когда секунды мало — например, при замере длительности операции или генерации уникальных меток, — берут универсальное время в миллисекундах:

Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
// ... выполняется операция ...
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Сообщить("Заняло " + Длительность + " мс");

Функция ТекущаяУниверсальнаяДатаВМиллисекундах() возвращает число — количество миллисекунд. Разность двух вызовов и есть длительность в миллисекундах; делением на 1000 переводят в секунды.

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

Не используйте показания часов как гарантированно уникальный ключ. Два вызова подряд в быстром коде могут вернуть одно и то же значение. Для уникальности есть Новый УникальныйИдентификатор().

Почему время на клиенте и сервере расходится

Классическая жалоба: «в журнале одно время, в документе другое». Чаще всего дело не в 1С, а в окружении. Разберём по симптомам.

Диагностика: выберите симптом

Порядок диагностики сверху вниз:

  1. Сверьте часы и часовой пояс на сервере 1С и на сервере СУБД.
  2. Проверьте ЧасовойПоясИнформационнойБазы() — соответствует ли он региону учёта.
  3. На проблемном клиенте сверьте системные часы ОС.
  4. Убедитесь, что в коде для данных используется ТекущаяДатаСеанса(), а не ТекущаяДата().

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

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

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

Чем `ТекущаяДата()` отличается от `ТекущаяДатаСеанса()`?
ТекущаяДата() возвращает время компьютера, где исполняется код (клиента или сервера). ТекущаяДатаСеанса() всегда даёт серверное время сеанса и не зависит от часов клиента. Для данных используйте вторую.
Как получить только время, без даты?
Разложите значение функциями Час(), Минута(), Секунда() либо выведите через Формат(Дата, "ДЛФ=T") или Формат(Дата, "ДФ=HH:mm:ss").
Можно ли узнать текущее время прямо в запросе?
Да, функцией языка запросов ТЕКУЩАЯДАТА(). Она возвращает серверное время и вычисляется один раз на весь запрос. Для времени сеанса передавайте дату параметром.
Хранится ли в типе `Дата` только дата или ещё и время?
Всегда и дата, и время в одном значении, с точностью до секунды. Отдельного типа «время» в платформе нет.
Как измерить длительность операции точнее секунды?
Возьмите разность двух вызовов ТекущаяУниверсальнаяДатаВМиллисекундах() — получите длительность в миллисекундах.