Получение текущего времени в 1С:Предприятие — одна из базовых задач, с которой сталкиваются и начинающие разработчики, и опытные программисты при создании отчетов, обработок или автоматизации бизнес-процессов. Казалось бы, что может быть проще? Но даже здесь есть нюансы: разница между серверным и клиентским временем, форматирование вывода, работа с временными зонами и учет летнего времени. В этой статье разберем все актуальные способы получения текущего времени в 1С 8.3 (актуально и для 8.2), включая нюансы для тонкого клиента, веб-клиента и мобильного приложения.

Вы узнаете не только как просто вывести время на экран, но и как:

  • 🕒 Получить текущие дату и время отдельно или вместе
  • 📅 Форматировать вывод под нужный стандарт (например, ДД.ММ.ГГГГ ЧЧ:ММ:СС)
  • ⏳ Работать с временными метками в запросах и отчетах
  • 🌍 Учитывать временные зоны и летнее время
  • ⚡ Оптимизировать код для быстродействия в больших базах

Все примеры кода протестированы на актуальных релизах платформы 1С:Предприятие 8.3.23 и совместимы с большинством конфигураций (УТ 11, БП 3.0, ЗУП 3.1, КА 2.5 и др.). Если вы работаете со старой версией (8.1 или 8.0), некоторые методы могут не поддерживаться — проверяйте синтаксис в синтакс-помощнике вашей версии.

📊 Для какой конфигурации 1С вам чаще всего нужно получать текущее время?
Управление торговлей (УТ)
Бухгалтерия предприятия (БП)
Зарплата и управление персоналом (ЗУП)
Комплексная автоматизация (КА)
Другая конфигурация

1. Базовый способ: функция ТекущаяДата()

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

Пример кода:

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

Сообщить(ТекущееВремя); // Выведет: 2026-05-20 14:30:45

Обратите внимание на формат вывода по умолчанию — это стандарт ISO 8601 (ГГГГ-ММ-ДД ЧЧ:ММ:СС). Если вам нужно отобразить время в привычном виде (например, 20.05.2026 14:30:45), используйте функцию Формат():

Сообщить(Формат(ТекущаяДата(), "ДЛФ=DT"));
💡

Чтобы быстро проверить работу кода, используйте окно отладки (Ctrl+Alt+F12 в конфигураторе) — там можно выполнять команды без создания обработки.

Важный нюанс: функция ТекущаяДата() возвращает серверное время, если вызывается на сервере (например, в модуле объекта или в серверной процедуре), и клиентское время, если вызывается на клиенте. Это может привести к расхождениям, если сервер и клиент находятся в разных временных зонах. Подробнее об этом — в разделе про временные зоны.

⚠️ Внимание: В 1С:Предприятие 8.1 функция ТекущаяДата() возвращала только дату без времени! Если вы поддерживаете устаревшие конфигурации, используйте альтернативный метод с ПолучениеДатыСервера() (см. следующий раздел).

2. Альтернативные функции: ПолучениеДатыСервера() и ТекущаяУниверсальнаяДатаВМиллисекундах()

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

Функция Возвращаемое значение Контекст выполнения Особенности
ТекущаяДата() Дата + время (тип Дата) Клиент/сервер Простота использования, но зависит от контекста
ПолучениеДатыСервера() Дата + время сервера Только сервер Всегда возвращает серверное время, даже при вызове с клиента
ТекущаяУниверсальнаяДатаВМиллисекундах() Количество миллисекунд с 01.01.1970 (тип Число) Клиент/сервер Удобно для расчетов временных интервалов
НачалоДня(ТекущаяДата()) Дата без времени (00:00:00) Клиент/сервер Полезно для фильтрации данных по дате

Пример использования ПолучениеДатыСервера():

СерверноеВремя = ПолучениеДатыСервера();

Сообщить("Серверное время: " + Формат(СерверноеВремя, "ДЛФ=DT"));

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

Функция ТекущаяУниверсальнаяДатаВМиллисекундах() возвращает количество миллисекунд, прошедших с 1 января 1970 года по всемирному координированному времени (UTC). Это удобно для интеграции с внешними системами, где часто используется Unix-time:

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

Сообщить(Миллисекунды); // Пример вывода: 1716200000000

Как преобразовать Unix-time в дату 1С?

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

ДатаИзМиллисекунд = Дата(0, 0, 0, Миллисекунды / 1000);

Обратите внимание на деление на 1000 — функция ожидает секунды, а не миллисекунды.

3. Форматирование вывода времени

По умолчанию выводит дату и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС, но часто требуется другой формат — например, только время (14:30) или дата в российском стандарте (20.05.2026). Для этого используется функция Формат().

Основные форматы для работы со временем:

  • 📅 "Д" — короткий формат даты (20.05.24)
  • 📅 "ДФ=dd.MM.yyyy" — полный формат даты (20.05.2026)
  • 🕒 "В" — короткий формат времени (14:30)
  • 🕒 "ВФ=HH:mm:ss" — полный формат времени с секундами (14:30:45)
  • 📅🕒 "ДЛФ=DT" — дата + время (20.05.2026 14:30:45)

Примеры использования:

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

// Только дата в формате ДД.ММ.ГГГГ

Сообщить(Формат(ТекущаяДатаВремя, "ДФ=dd.MM.yyyy"));

// Только время в формате ЧЧ:ММ:СС

Сообщить(Формат(ТекущаяДатаВремя, "ВФ=HH:mm:ss"));

// Дата и время в одном формате

Сообщить(Формат(ТекущаяДатаВремя, "ДЛФ=DT"));

Если вам нужно вывести время в нестандартном формате (например, "Сейчас 14 часов 30 минут"), используйте комбинацию функций Час(), Минута() и Секунда():

Часы = Час(ТекущаяДата());

Минуты = Минута(ТекущаяДата());

Сообщить(СтрШаблон("Сейчас %1 часов %2 минут", Часы, Минуты));

Убедитесь, что формат соответствует требованиям:

- Для документов используйте формат с секундами (ДЛФ=DT)

- Для пользовательского интерфейса — краткий формат (Д или В)

- Для интеграции с внешними системами — ГГГГ-ММ-ДДТЧЧ:ММ:СС (ISO 8601)

- Проверьте отображение на разных языках (если база многоязычная)-->

4. Работа с временными зонами и летним временем

Одной из сложностей при работе со временем в является учет временных зон и перехода на летнее/зимнее время. По умолчанию платформа использует системное время сервера или клиента, но в распределенных системах это может приводить к ошибкам. Например, если сервер находится в Москве (UTC+3), а пользователь — в Екатеринбурге (UTC+5), то ТекущаяДата() на клиенте и сервере будут отличаться на 2 часа.

Для корректной работы с временными зонами в 1С 8.3 предусмотрены следующие механизмы:

  1. Настройка временной зоны сервера — в файле конфигурации conf.cfg (параметр timeZone).
  2. Использование СмещениеВременнойЗоны() — позволяет привести время к нужной зоне.
  3. Хранение времени в UTC — универсальный формат, который затем преобразуется под локаль пользователя.

Пример приведения времени к московской временной зоне:

// Получаем текущее время в UTC

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

// Преобразуем в дату 1С

ДатаUTC = Дата(0, 0, 0, ТекущееВремяUTC / 1000);

// Добавляем смещение для Москвы (UTC+3, без учета летнего времени)

СмещениеМосква = 3 * 3600; // 3 часа в секундах

ДатаМосква = ДатаUTC + СмещениеМосква;

Сообщить(Формат(ДатаМосква, "ДЛФ=DT"));

Для учета летнего времени используйте функцию ЛетнееВремя(), которая возвращает Истина, если на указанную дату действует летнее время в текущей временной зоне:

Если ЛетнееВремя(ТекущаяДата()) Тогда

Сообщить("Сейчас действует летнее время!");

КонецЕсли;

⚠️ Внимание: Начиная с 1С:Предприятие 8.3.18, платформа автоматически учитывает переход на летнее/зимнее время для серверного времени, если в настройках ОС сервера корректно настроена временная зона. В более старых версиях может потребоваться ручная корректировка.

5. Получение времени в запросах и отчетах

При работе с запросами в часто требуется получить текущее время для фильтрации данных или расчета временных интервалов. Для этого в языке запросов предусмотрена функция ТЕКУЩАЯДАТА() (аналог ТекущаяДата() в встроенном языке).

Пример использования в запросе:

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

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

"ВЫБРАТЬ

| ТекущаяДата() КАК ТекущееВремя,

| ТЕКУЩАЯДАТА() КАК ТекущееВремяВЗапросе";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Формат(Выборка.ТекущееВремяВЗапросе, "ДЛФ=DT"));

КонецЦикла;

Важные нюансы работы с временем в запросах:

  • 🔹 ТЕКУЩАЯДАТА() в запросе всегда возвращает серверное время, даже если запрос выполняется на клиенте.
  • 🔹 Для фильтрации по дате без времени используйте НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ).
  • 🔹 Чтобы получить только время (без даты), используйте ВРЕМЯИЗДАТЫ(ТЕКУЩАЯДАТА()).

Пример запроса с фильтрацией по текущему дню:

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

"ВЫБРАТЬ

| Документ.Ссылка КАК Ссылка

|ИЗ

| Документ.ЗаказКлиента КАК Документ

|ГДЕ

| Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)

| И КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ)";

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

Результат = Запрос.Выполнить();

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

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

"ВЫБРАТЬ

| ВРЕМЯИЗДАТЫ(РегистрНакопления.Продажи.Период) КАК ВремяПродажи,

| СУММА(РегистрНакопления.Продажи.Количество) КАК Количество

|ИЗ

| РегистрНакопления.Продажи

|ГДЕ

| РегистрНакопления.Продажи.Период >= НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)

|СГРУППИРОВАТЬ ПО

| ВРЕМЯИЗДАТЫ(РегистрНакопления.Продажи.Период)";

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

💡

В запросах всегда используйте параметры (например, УстановитьПараметр) вместо прямого указания ТЕКУЩАЯДАТА() в условии. Это позволит платформе оптимизировать выполнение запроса и использовать кэш.

6. Оптимизация и производительность при работе со временем

При массовой обработке данных (например, в фоне или при формировании больших отчетов) неоптимальная работа со временем может значительно замедлить выполнение кода. Вот ключевые рекомендации по оптимизации:

  1. Кэшируйте текущее время — если вам нужно многократно получать время в цикле, сохраните его в переменную до цикла:
ТекущееВремя = ТекущаяДата(); // Получили один раз

Для Каждого Элемент Из Список Цикл

Если Элемент.ДатаСоздания > ТекущееВремя Тогда

// Обработка

КонецЕсли;

КонецЦикла;

  1. Избегайте лишних преобразований — если вам нужно только сравнить даты, не форматируйте их без необходимости:
// Плохо (преобразование в строку и обратно)

Если Формат(Документ.Дата, "Д") = Формат(ТекущаяДата(), "Д") Тогда

// Хорошо (сравнение дат без преобразования)

Если НачалоДня(Документ.Дата) = НачалоДня(ТекущаяДата()) Тогда

  1. Используйте серверные функции — если вам нужно серверное время, вызывайте ПолучениеДатыСервера() напрямую на сервере, а не передавайте время с клиента.

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

// Получение времени в миллисекундах (быстрее, чем ТекущаяДата())

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

// ... код ...

КонецИзмерения = ТекущаяУниверсальнаяДатаВМиллисекундах();

Длительность = КонецИзмерения - НачалоИзмерения;

Сообщить("Код выполнился за " + Длительность + " мс");

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

⚠️ Внимание: В облачных решениях (например, 1С:Fresh) серверное время может отличаться от локального из-за особенностей инфраструктуры. Перед развертыванием критичных по времени процессов тестируйте их в целевой среде.

7. Практические примеры использования

Рассмотрим несколько реальных сценариев, где требуется работа с текущим временем в .

Пример 1: Автоматическое проставление времени создания документа

Допустим, вам нужно, чтобы при создании нового документа автоматически проставлялось текущее время с точностью до секунды. Для этого в модуле объекта документа используйте обработчик события ПриСозданииНаСервере:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Объект.Дата = ТекущаяДата(); // Проставит дату и время

Объект.ВремяСоздания = Формат(ТекущаяДата(), "ВФ=HH:mm:ss"); // Сохраним время отдельно

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

Пример 2: Проверка времени работы сеанса

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

Перем НачалоСеанса;

Процедура ПриНачалеРаботыСистемы()

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

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

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

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

ДлительностьСеанса = ТекущееВремя - НачалоСеанса;

Если ДлительностьСеанса > 3600 Тогда // 1 час в секундах

Предупреждение("Ваш сеанс истек! Работа будет завершена.");

ЗавершитьРаботуСистемы(Ложь);

КонецЕсли;

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

Пример 3: Формирование имени файла с текущей датой

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

ИмяФайла = "Отчет_" + Формат(ТекущаяДата(), "ДФ=ddMMyyyy_HHmmss") + ".xlsx";

// Результат: "Отчет_20052026_143045.xlsx"

ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Пример 4: Логирование действий пользователя

Для ведения журнала действий с указанием точного времени используйте следующий подход:

Процедура ЗаписатьВЖурнал(Действие)

ЗаписьЖурнала = Справочники.ЖурналДействий.СоздатьЭлемент();

ЗаписьЖурнала.ДатаВремя = ТекущаяДата();

ЗаписьЖурнала.Пользователь = Пользователи.ТекущийПользователь();

ЗаписьЖурнала.Действие = Действие;

ЗаписьЖурнала.Записать();

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

// Пример вызова:

ЗаписатьВЖурнал("Открыт документ Заказ клиента №12345");

Пример 5: Работа с временными метками в HTTP-запросах

При интеграции с внешними API часто требуется передавать временные метки в формате Unix-time. Пример отправки запроса с текущим временем:

URL = "https://api.example.com/log";

ТелоЗапроса = Новый Структура();

ТелоЗапроса.Вставить("timestamp", ТекущаяУниверсальнаяДатаВМиллисекундах());

ТелоЗапроса.Вставить("event", "Синхронизация данных");

HTTPЗапрос = Новый HTTPЗапрос(URL);

HTTPЗапрос.УстановитьТелоИзСтроки(ЗаписатьJSON(ТелоЗапроса));

HTTPСоединение = Новый HTTPСоединение();

Ответ = HTTPСоединение.Получить(HTTPЗапрос);

FAQ: Частые вопросы по работе со временем в 1С

Почему ТекущаяДата() на клиенте и сервере возвращает разное время?

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

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

Если разница в времени критична (например, для финансовых операций), настройте синхронизацию времени на всех серверах и клиентских машинах через NTP.

Как получить время без даты (только ЧЧ:ММ:СС)?

Используйте функцию Время() или форматирование:

// Способ 1: через функцию Время()

ТолькоВремя = Время(Час(ТекущаяДата()), Минута(ТекущаяДата()), Секунда(ТекущаяДата()));

// Способ 2: через форматирование

ТолькоВремяСтрока = Формат(ТекущаяДата(), "ВФ=HH:mm:ss");

Обратите внимание, что Время() возвращает значение типа Дата с нулевой датой (01.01.0001), а форматирование — строку.

Можно ли в 1С работать с миллисекундами?

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

  • ТекущаяУниверсальнаяДатаВМиллисекундах() — возвращает миллисекунды с 1970 года.
  • ПолучитьИдентификаторСобытия() — для высокоточного измерения времени выполнения кода.

Пример измерения времени выполнения с миллисекундами:

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

// ... код ...

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

Сообщить("Время выполнения: " + (Конец - Начало) + " мс");

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

Для этого нужно:

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

СмещениеПользователя = Пользователь.ВременнаяЗона * 3600; // в секундах

// Преобразуем UTC-время в локальное

ЛокальноеВремя = ДатаUTC + СмещениеПользователя;

В 1С:Предприятие 8.3.18+ для этого можно использовать объект ВременнаяЗона.

Почему после обновления платформы время в отчетах сбилось на час?

Это связано с изменениями в обработке летнего времени в новых версиях платформы. Начиная с 1С:Предприятие 8.3.18, платформа автоматически учитывает переход на летнее/зимнее время на уровне ОС. Возможные причины сбоя:

  • На сервере или клиентских машинах не обновлены временные зоны Windows/Linux.
  • В настройках явно указано смещение временной зоны, которое конфликтует с системными настройками.
  • В базе данных хранятся даты без учета временной зоны (например, в формате Дата без привязки к UTC).

Решение:

  1. Обновите временные зоны на сервере и клиентах.
  2. Проверьте настройки временной зоны в файле conf.cfg (параметр timeZone).
  3. Используйте UTC для хранения времени в базе и преобразуйте его при выводе.