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

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

Как получить время в 1С: функции, различия и практические приёмы

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

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

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

Какие функции даты и времени есть в 1С

Встроенный язык 1С предоставляет несколько функций для получения текущего момента времени. Ключевые из них:

  • ТекущаяДата() — возвращает текущие дату и время. На тонком и веб-клиенте — время компьютера пользователя, на сервере — время сервера 1С.
  • ТекущаяДатаСеанса() — дата и время с учётом часового пояса сеанса. Работает только на сервере.
  • ТекущаяУниверсальнаяДата() — универсальное время (UTC) без привязки к часовому поясу. Только на сервере.
  • ТекущаяУниверсальнаяДатаВМиллисекундах() — то же, но с точностью до миллисекунд; полезна для замеров производительности.

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

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

Простейший вариант — вызов функции и вывод результата:

// На сервере — рекомендуемый способ

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

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

// На клиенте

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

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

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

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

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

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

// Только время без даты (дата будет 01.01.0001)

ТолькоВремя = ТекВремя - НачалоДня(ТекВремя);

Обратите внимание на последний приём: вычитание начала дня из даты даёт количество секунд с полуночи — это стандартный способ получить «чистое» время в 1С.

bsl
Процедура ПоказатьВремя()
	ТекВремя = ТекущаяДатаСеанса();
	Сообщить(Формат(ТекВремя, "ДЛФ=T")); // только время: 14:35:20
КонецПроцедуры

Разница между ТекущаяДата и ТекущаяДатаСеанса

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

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

Сравнение функций получения времени

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

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

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

Стандарт для серверного кода: документы, регистры, отметки времени. Только на сервере, в клиентском коде недоступна.

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

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

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

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

В управляемых формах код делится на клиентский и серверный. Если в клиентской процедуре нужно серверное время, вызовите серверную функцию:

&НаКлиенте

Процедура ПоказатьСерверноеВремя(Команда)

ВремяСервера = ПолучитьВремяНаСервере();

Сообщить(ВремяСервера);

КонецПроцедуры

&НаСервереБезКонтекста

Функция ПолучитьВремяНаСервере()

Возврат ТекущаяДатаСеанса();

КонецФункции

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

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

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

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

МосковскоеВремя = МестноеВремя(UTC, "Europe/Moscow");

ВремяСеанса = МестноеВремя(UTC); // пояс текущего сеанса

Обратное преобразование — функцией УниверсальноеВремя(). Идентификаторы поясов задаются строками вида «Europe/Moscow» по базе IANA; получить пояс текущего сеанса можно через ПолучитьЧасовойПоясСеанса().

Форматирование и вывод времени пользователю

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

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

Формат(ТекВремя, "ДЛФ=T"); // только время: 14:35:20

Формат(ТекВремя, "ДЛФ=DT"); // дата и время: 12.05.2026 14:35:20

Формат(ТекВремя, "ДФ='HH:mm:ss'"); // 14:35:20

Формат(ТекВремя, "ДФ=HH:mm"); // 14:35

В запросах время получают иначе — через оператор &ТекущаяДата с параметром или функцию ТекущаяДатаСеанса() прямо в тексте запроса:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РАЗНОСТЬДАТ(Заказы.Дата, &ТекДата, ЧАС) КАК ЧасовПрошло

|ИЗ Документ.Заказ КАК Заказы";

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

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

Для замера длительности операции запомните время до и после, затем вычислите разницу:

Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();

// ... выполняемый код ...

Длительность = (ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало) / 1000;

Сообщить("Выполнено за " + Длительность + " сек.");

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

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

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

Сравните ТекущаяДатаСеанса() с реальным временем
Норма

Значение совпадает с фактическим временем в поясе пользователя

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

Смещение на целое число часов — неверный часовой пояс сеанса или ИБ

Сравните UTC и локальное время
Норма

Разница равна смещению вашего пояса от UTC

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

UTC совпадает с локальным — пояс сеанса задан как UTC

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

Отметка времени соответствует моменту записи

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

Время «скачет» между документами разных пользователей — где-то используется клиентское время

Типичные ошибки при получении времени

Типичные ошибки
01
Использование ТекущаяДата() в серверном коде записи документов — при смене часового пояса сервера или переносе базы данные о времени теряют смысл; исправляется переходом на ТекущаяДатаСеанса().
02
Вызов серверной функции получения времени в цикле на клиенте — каждый вызов это сетевой запрос, форма начинает тормозить; получите время один раз и вычисляйте смещение локально.
03
Сравнение дат из разных источников без приведения к одному поясу — документы с клиентским и серверным временем сравниваются некорректно; приводите всё к UTC или к поясу сеанса.
04
Хранение времени строкой — теряется возможность сортировки, сравнения и вычисления разниц; используйте тип Дата, а строку применяйте только для вывода.

Ещё одна частая ситуация — попытка получить «только время» обрезанием строки. Это ломается при смене региональных настроек. Правильный способ — вычитание НачалоДня() или форматирование с шаблоном ДЛФ=T.

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

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

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

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

Вычтите из текущей даты начало дня: ТолькоВремя = ТекущаяДатаСеанса() - НачалоДня(ТекущаяДатаСеанса()). Результат — число секунд с полуночи, которое можно форматировать или складывать с другими датами. Для отображения достаточно Формат(Дата, "ДЛФ=T").

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

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

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

Передайте текущую дату параметром: Запрос.УстановитьПараметр("ТекДата", ТекущаяДатаСеанса()) и используйте &ТекДата в тексте запроса. Для вычисления разниц применяйте функцию РАЗНОСТЬДАТ с единицами СЕКУНДА, МИНУТА, ЧАС.

Как узнать часовой пояс текущего сеанса?

Вызовите на сервере функцию ПолучитьЧасовойПоясСеанса() — она вернёт строку вида «Europe/Moscow». Изменить пояс можно командой УстановитьЧасовойПоясСеанса("Europe/Moscow"), но делать это стоит осознанно: настройка влияет на все даты, возвращаемые ТекущаяДатаСеанса в рамках сеанса.

Можно ли получить миллисекунды в 1С?

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

Итог

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

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