Разработка и Конфигурация · 12 мин
Как определить текущее время в 1С
Как получить текущее время в 1С: функции ТекущаяДата, ТекущаяДатаСеанса, разница между клиентом и сервером, часовые пояса, примеры кода и типичные ошибки разработчиков.
Вопрос определения текущего времени в 1С возникает у разработчиков постоянно: при записи документов, формировании отчётов, проверке сроков и регистрации событий. На первый взгляд задача тривиальна — вызвал функцию и получил значение. Однако в платформе 1С:Предприятие 8 существует несколько функций для получения текущей даты и времени, и неправильный выбор между ними приводит к реальным ошибкам: расхождению времени в документах, сбоям при обмене данными и неверным срокам в регламентных заданиях.
Ключевая сложность в том, что 1С — клиент-серверная система. Код может выполняться на компьютере пользователя, на сервере 1С и в фоновых заданиях, а часы на этих машинах могут отличаться. Кроме того, пользователи одной информационной базы нередко работают в разных часовых поясах. Платформа предоставляет отдельные инструменты для каждого из этих случаев, и понимание их различий — обязательное условие корректной разработки.
В материале разобраны основные функции получения текущего времени, разница между клиентским и серверным временем, работа с часовыми поясами, типичные ошибки и способы проверки результата. Примеры кода приведены на встроенном языке 1С и применимы к актуальным версиям платформы 8.3.
Основные функции получения текущего времени
Во встроенном языке 1С есть четыре функции, связанных с текущим моментом времени. Каждая решает свою задачу, и путать их нельзя.
- ТекущаяДата() — возвращает дату и время того компьютера, где выполняется код: на клиенте — время машины пользователя, на сервере — время сервера. В тонком и веб-клиенте при вызове на клиенте платформа может корректировать значение по серверу, но полагаться на это в прикладной логике не стоит.
- ТекущаяДатаСеанса() — возвращает дату и время текущего сеанса, то есть фактически время сервера 1С (или время компьютера в файловом режиме). Это рекомендуемый способ в прикладном коде.
- ТекущаяУниверсальнаяДата() — возвращает универсальное время UTC без привязки к часовому поясу. Применяется для обмена данными, веб-сервисов и синхронизации между базами в разных поясах.
- ТекущаяУниверсальнаяДатаВМиллисекундах() — даёт время UTC с точностью до миллисекунд. Используется для измерения длительности операций и технологических задач, не предназначена для прикладных дат.
Тип значения всех этих функций — Дата, который в 1С всегда содержит и дату, и время с точностью до секунды. Отдельного типа «только время» в платформе нет: если нужна только часть суток, её извлекают функциями Час(), Минута(), Секунда() или форматируют функцией Формат().
ТекущаяДатаСеанса: рекомендуемый способ
Функция ТекущаяДатаСеанса() — стандарт де-факто для прикладного кода. Она одинаково работает на клиенте и на сервере, а главное — возвращает единое для всей базы время, не зависящее от настроек часов на компьютере конкретного пользователя. Если у сотрудника сбились часы на рабочей станции, документы, проведения и записи журналов всё равно получат корректное время.
Типовой пример использования в модуле объекта или общем модуле:
ДатаСеанса = ТекущаяДатаСеанса();
// Запись времени события в регистр сведений
Запись = РегистрыСведений.ЖурналСобытий.СоздатьМенеджерЗаписи();
Запись.Период = ТекущаяДатаСеанса();
Запись.Событие = "Изменение статуса заказа";
Запись.Записать();
Обратите внимание: при каждом вызове функция возвращает новое значение. Если в рамках одной операции время должно быть зафиксировано, сохраните результат в переменную один раз и дальше работайте с ней. Иначе две соседние записи, которые логически относятся к одному моменту, могут разойтись на секунду.
ТекущаяДата на клиенте и на сервере: в чём ловушка
Функция ТекущаяДата() ведёт себя по-разному в зависимости от контекста исполнения, и это главный источник ошибок. В серверном коде (процедуры с директивой &НаСервере, модули объектов, регламентные задания) она возвращает время сервера — по сути, совпадает с датой сеанса. В клиентском коде (&НаКлиенте) — время операционной системы пользователя.
Проблема проявляется так: разработчик пишет в форме документа клиентскую процедуру, которая подставляет ТекущаяДата() в реквизит. У большинства пользователей всё работает, но у одного сотрудника часы на компьютере отстают на сутки — и его документы уходят «в прошлое», ломая последовательности, отчёты и расчёт остатков. В файловой базе такое расхождение встречается особенно часто, потому что нет единого сервера времени.
Когда ТекущаяДата() на клиенте всё же уместна: для интерфейсных задач — показать пользователю его локальное время, подставить предполагаемое значение в поле ввода, которое он вправе изменить. Для всего, что записывается в базу и влияет на учёт, используйте серверное время.
Универсальное время и часовые пояса
Если пользователи базы находятся в разных часовых поясах или база обменивается данными с внешними системами, одного времени сеанса недостаточно. Для таких задач служат универсальная дата и механизм часовых поясов сеанса.
Функция ТекущаяУниверсальнаяДата() возвращает время UTC. Оно одинаково в любой точке мира, поэтому именно его используют как точку синхронизации: в обменах через веб-сервисы, при выгрузке в JSON и XML, в механизмах синхронизации между базами. Чтобы перевести универсальную дату в локальную и обратно, применяются функции МестноеВремя() и УниверсальноеВремя().
// Получить UTC
ДатаUTC = ТекущаяУниверсальнаяДата();
// Перевести UTC в локальное время конкретного пояса
ЛокальноеВремя = МестноеВремя(ДатаUTC, "Europe/Moscow");
// Перевести локальное время обратно в UTC
СноваUTC = УниверсальноеВремя(ЛокальноеВремя, "Europe/Moscow");
Часовой пояс сеанса можно узнать функцией ПолучитьЧасовойПоясИнформационнойБазы() и установить методом УстановитьЧасовойПоясСеанса(). Это полезно, когда филиал в другом регионе должен видеть даты в своём локальном времени, а хранить их требуется единообразно. Учтите, что смена пояса сеанса влияет только на текущий сеанс и не изменяет уже записанные данные.
Сравнение вариантов
Учётные даты: документы, регистры, журналы событий. Единое время для всей базы. Не подходит для синхронизации между базами в разных поясах.
Только интерфейсные задачи: подсказка пользователю его локального времени. Зависит от настроек его компьютера, для учёта непригодна.
Обмен данными, веб-сервисы, интеграции. Требует явного пересчёта в локальное время для показа пользователю.
Замер длительности операций, технологические метки. Избыточна для прикладных дат, не отображается напрямую в учётных данных.
Практические сценарии и примеры кода
Вывод текущего времени пользователю
Чтобы показать время в сообщении, заголовке или поле формы, дату форматируют функцией Формат() с нужной строкой формата:
ВремяСтрокой = Формат(ТекущаяДатаСеанса(), "ДЛФ=T");
// Результат: "14:35:07"
Сообщить("Операция выполнена в " + ВремяСтрокой);
Проверка наступления срока
Типовая задача — сравнить текущий момент с датой из реквизита, например проверить просрочку оплаты. Сравнивайте значения напрямую, а для сравнения «по дню» без учёта времени обрезайте время функцией НачалоДня():
Если НачалоДня(ТекущаяДатаСеанса()) > НачалоДня(СрокОплаты) Тогда
Сообщить("Срок оплаты истёк");
КонецЕсли;
Только время без даты
Для расписаний и настроек часто нужно хранить именно время суток. В 1С его принято хранить как дату с нулевой календарной частью: Дата(1,1,1, Час, Минута, Секунда). Извлечь такое «чистое» время из текущего момента можно так:
Сейчас = ТекущаяДатаСеанса();
ТолькоВремя = Дата(1, 1, 1, Час(Сейчас), Минута(Сейчас), Секунда(Сейчас));
Сейчас = ТекущаяДатаСеанса();
НачалоТекущегоДня = НачалоДня(Сейчас);
КонецТекущегоДня = КонецДня(Сейчас);
ВремяСтрокой = Формат(Сейчас, "ДЛФ=T");Как проверить корректность результата
После внедрения кода с датами убедитесь, что время определяется так, как задумано. Базовая проверка занимает несколько минут и избавляет от поиска ошибок в учётных данных позже.
Как проверить результат
Значение совпадает с временем сервера с точностью до секунд
Время отличается — проверьте часы и часовой пояс сервера 1С
Оба получают одинаковое время сеанса
Значения различаются — вероятно, где-то используется клиентская ТекущаяДата()
Дата документа соответствует времени сервера
Дата смещена — проверьте пояс сеанса и код подстановки даты
Даты в выгрузке совпадают после пересчёта из UTC
Постоянное смещение на целое число часов — ошибка в пересчёте пояса
Отдельно проверьте поведение кода в регламентных заданиях: фоновое задание всегда выполняется на сервере, поэтому ТекущаяДата() и ТекущаяДатаСеанса() там дадут одинаковый результат, но часовой пояс сеанса фонового задания может отличаться от пояса пользователя, который это задание настроил.
Типичные ошибки и частые вопросы
Ещё одна распространённая ситуация — попытка изменить дату уже проведённого документа, чтобы «поправить время». Такие правки в закрытых периодах приводят к пересчёту итогов и расхождениям в отчётах. Если время события зафиксировано неверно, правильнее оформить корректирующий документ, а не переписывать историю.
Что важно запомнить
Для учётных данных всегда берите ТекущаяДатаСеанса(), клиентскую ТекущаяДата() оставьте для интерфейса, а для обменов между базами и поясами используйте универсальное время UTC с явным пересчётом. Фиксируйте момент времени в переменной один раз на операцию и сравнивайте сроки через НачалоДня().
FAQ
Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время того компьютера, где исполняется код: на клиенте — часы пользователя, на сервере — часы сервера. ТекущаяДатаСеанса() всегда возвращает единое время сервера 1С, независимо от места вызова. В файловой базе обе функции фактически смотрят на часы одного компьютера, но в клиент-серверном режиме разница принципиальна.
Как получить только время без даты?
Извлеките часы, минуты и секунды из текущей даты и соберите значение Дата(1,1,1,Час,Минута,Секунда). Для отображения достаточно Формат(ТекущаяДатаСеанса(), "ДЛФ=T") — это даст строку вида «14:35:07» без даты.
Почему у разных пользователей документы создаются с разным временем?
Скорее всего, дата подставляется клиентским вызовом ТекущаяДата(), а часы на части рабочих станций расходятся. Замените логику на серверное получение даты сеанса. Если время различается ровно на целые часы, проверьте настройки часовых поясов сеансов.
Какое время используют регламентные задания?
Фоновые задания выполняются на сервере, поэтому обе функции возвращают серверное время. Но расписание задания проверяется по поясу, заданному для информационной базы или сеанса, — при переносе базы на сервер в другом поясе время запуска может сместиться.
Как правильно передавать дату и время во внешнюю систему?
Передавайте ТекущаяУниверсальнаяДату() (UTC) и на стороне приёмника пересчитывайте в локальный пояс. Если внешняя система ждёт строку, используйте формат ISO 8601 через ЗаписьJSON/ЗаписьXML или функцию XMLСтрока() — она сериализует дату в стандартном виде.
Можно ли получить время с точностью выше секунды?
Да, функция ТекущаяУниверсальнаяДатаВМиллисекундах() возвращает число миллисекунд. Она предназначена для замеров производительности и технологических меток; в реквизитах документов и регистров время всё равно хранится с точностью до секунды.