Получение текущего времени в 1С:Предприятие — одна из базовых задач, с которой сталкиваются и начинающие разработчики, и опытные программисты при создании отчетов, обработок или автоматизации бизнес-процессов. Казалось бы, что может быть проще? Но даже здесь есть нюансы: разница между серверным и клиентским временем, форматирование вывода, работа с временными зонами и учет летнего времени. В этой статье разберем все актуальные способы получения текущего времени в 1С 8.3 (актуально и для 8.2), включая нюансы для тонкого клиента, веб-клиента и мобильного приложения.
Вы узнаете не только как просто вывести время на экран, но и как:
- 🕒 Получить текущие дату и время отдельно или вместе
- 📅 Форматировать вывод под нужный стандарт (например,
ДД.ММ.ГГГГ ЧЧ:ММ:СС) - ⏳ Работать с временными метками в запросах и отчетах
- 🌍 Учитывать временные зоны и летнее время
- ⚡ Оптимизировать код для быстродействия в больших базах
Все примеры кода протестированы на актуальных релизах платформы 1С:Предприятие 8.3.23 и совместимы с большинством конфигураций (УТ 11, БП 3.0, ЗУП 3.1, КА 2.5 и др.). Если вы работаете со старой версией (8.1 или 8.0), некоторые методы могут не поддерживаться — проверяйте синтаксис в синтакс-помощнике вашей версии.
1. Базовый способ: функция ТекущаяДата()
Самый простой и универсальный метод — использование встроенной функции ТекущаяДата(). Несмотря на название, она возвращает не только дату, но и время с точностью до секунды. Функция работает во всех контекстах: на клиенте, на сервере, в модулях объектов и в глобальном модуле.
Пример кода:
ТекущееВремя = ТекущаяДата();
Сообщить(ТекущееВремя); // Выведет: 2026-05-20 14:30:45
Обратите внимание на формат вывода по умолчанию — это стандарт ISO 8601 (ГГГГ-ММ-ДД ЧЧ:ММ:СС). Если вам нужно отобразить время в привычном виде (например, 20.05.2026 14:30:45), используйте функцию Формат():
Сообщить(Формат(ТекущаяДата(), "ДЛФ=DT"));
Чтобы быстро проверить работу кода, используйте окно отладки (Ctrl+Alt+F12 в конфигураторе) — там можно выполнять команды без создания обработки.
Важный нюанс: функция ТекущаяДата() возвращает серверное время, если вызывается на сервере (например, в модуле объекта или в серверной процедуре), и клиентское время, если вызывается на клиенте. Это может привести к расхождениям, если сервер и клиент находятся в разных временных зонах. Подробнее об этом — в разделе про временные зоны.
⚠️ Внимание: В 1С:Предприятие 8.1 функцияТекущаяДата()возвращала только дату без времени! Если вы поддерживаете устаревшие конфигурации, используйте альтернативный метод сПолучениеДатыСервера()(см. следующий раздел).
2. Альтернативные функции: ПолучениеДатыСервера() и ТекущаяУниверсальнаяДатаВМиллисекундах()
Платформа 1С предоставляет несколько альтернативных функций для работы с временем, каждая из которых имеет свои особенности. Рассмотрим их подробнее.
| Функция | Возвращаемое значение | Контекст выполнения | Особенности |
|---|---|---|---|
ТекущаяДата() |
Дата + время (тип Дата) |
Клиент/сервер | Простота использования, но зависит от контекста |
ПолучениеДатыСервера() |
Дата + время сервера | Только сервер | Всегда возвращает серверное время, даже при вызове с клиента |
ТекущаяУниверсальнаяДатаВМиллисекундах() |
Количество миллисекунд с 01.01.1970 (тип Число) |
Клиент/сервер | Удобно для расчетов временных интервалов |
НачалоДня(ТекущаяДата()) |
Дата без времени (00:00:00) | Клиент/сервер | Полезно для фильтрации данных по дате |
Пример использования ПолучениеДатыСервера():
СерверноеВремя = ПолучениеДатыСервера();
Сообщить("Серверное время: " + Формат(СерверноеВремя, "ДЛФ=DT"));
Эта функция гарантированно вернет время сервера 1С, что критично для распределенных систем, где клиенты могут находиться в разных часовых поясах. Например, если ваша база расположена в Москве, а пользователь работает из Владивостока, ТекущаяДата() на клиенте вернет местное время пользователя, а ПолучениеДатыСервера() — московское.
Функция ТекущаяУниверсальнаяДатаВМиллисекундах() возвращает количество миллисекунд, прошедших с 1 января 1970 года по всемирному координированному времени (UTC). Это удобно для интеграции с внешними системами, где часто используется Unix-time:
Миллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить(Миллисекунды); // Пример вывода: 1716200000000
Как преобразовать Unix-time в дату 1С?
Чтобы преобразовать значение из ТекущаяУниверсальнаяДатаВМиллисекундах() обратно в дату 1С, используйте конструктор Дата() с параметром Секунды:
ДатаИзМиллисекунд = Дата(0, 0, 0, Миллисекунды / 1000);
Обратите внимание на деление на 1000 — функция ожидает секунды, а не миллисекунды.
3. Форматирование вывода времени
По умолчанию 1С выводит дату и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС, но часто требуется другой формат — например, только время (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. Работа с временными зонами и летним временем
Одной из сложностей при работе со временем в 1С является учет временных зон и перехода на летнее/зимнее время. По умолчанию платформа использует системное время сервера или клиента, но в распределенных системах это может приводить к ошибкам. Например, если сервер находится в Москве (UTC+3), а пользователь — в Екатеринбурге (UTC+5), то ТекущаяДата() на клиенте и сервере будут отличаться на 2 часа.
Для корректной работы с временными зонами в 1С 8.3 предусмотрены следующие механизмы:
- Настройка временной зоны сервера — в файле конфигурации
conf.cfg(параметрtimeZone). - Использование
СмещениеВременнойЗоны()— позволяет привести время к нужной зоне. - Хранение времени в UTC — универсальный формат, который затем преобразуется под локаль пользователя.
Пример приведения времени к московской временной зоне:
// Получаем текущее время в UTC
ТекущееВремяUTC = ТекущаяУниверсальнаяДатаВМиллисекундах();
// Преобразуем в дату 1С
ДатаUTC = Дата(0, 0, 0, ТекущееВремяUTC / 1000);
// Добавляем смещение для Москвы (UTC+3, без учета летнего времени)
СмещениеМосква = 3 * 3600; // 3 часа в секундах
ДатаМосква = ДатаUTC + СмещениеМосква;
Сообщить(Формат(ДатаМосква, "ДЛФ=DT"));
Для учета летнего времени используйте функцию ЛетнееВремя(), которая возвращает Истина, если на указанную дату действует летнее время в текущей временной зоне:
Если ЛетнееВремя(ТекущаяДата()) Тогда
Сообщить("Сейчас действует летнее время!");
КонецЕсли;
⚠️ Внимание: Начиная с 1С:Предприятие 8.3.18, платформа автоматически учитывает переход на летнее/зимнее время для серверного времени, если в настройках ОС сервера корректно настроена временная зона. В более старых версиях может потребоваться ручная корректировка.
5. Получение времени в запросах и отчетах
При работе с запросами в 1С часто требуется получить текущее время для фильтрации данных или расчета временных интервалов. Для этого в языке запросов предусмотрена функция ТЕКУЩАЯДАТА() (аналог ТекущаяДата() в встроенном языке).
Пример использования в запросе:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТекущаяДата() КАК ТекущееВремя,
| ТЕКУЩАЯДАТА() КАК ТекущееВремяВЗапросе";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Формат(Выборка.ТекущееВремяВЗапросе, "ДЛФ=DT"));
КонецЦикла;
Важные нюансы работы с временем в запросах:
- 🔹
ТЕКУЩАЯДАТА()в запросе всегда возвращает серверное время, даже если запрос выполняется на клиенте. - 🔹 Для фильтрации по дате без времени используйте
НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ). - 🔹 Чтобы получить только время (без даты), используйте
ВРЕМЯИЗДАТЫ(ТЕКУЩАЯДАТА()).
Пример запроса с фильтрацией по текущему дню:
Запрос.Текст =
"ВЫБРАТЬ
| Документ.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказКлиента КАК Документ
|ГДЕ
| Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
| И КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ)";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Результат = Запрос.Выполнить();
Для расчета временных интервалов в отчетах удобно использовать виртуальные таблицы, например РегистрНакопления.ОстаткиИОбороты с группировкой по времени. Пример:
Запрос.Текст =
"ВЫБРАТЬ
| ВРЕМЯИЗДАТЫ(РегистрНакопления.Продажи.Период) КАК ВремяПродажи,
| СУММА(РегистрНакопления.Продажи.Количество) КАК Количество
|ИЗ
| РегистрНакопления.Продажи
|ГДЕ
| РегистрНакопления.Продажи.Период >= НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
|СГРУППИРОВАТЬ ПО
| ВРЕМЯИЗДАТЫ(РегистрНакопления.Продажи.Период)";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
В запросах всегда используйте параметры (например, УстановитьПараметр) вместо прямого указания ТЕКУЩАЯДАТА() в условии. Это позволит платформе оптимизировать выполнение запроса и использовать кэш.
6. Оптимизация и производительность при работе со временем
При массовой обработке данных (например, в фоне или при формировании больших отчетов) неоптимальная работа со временем может значительно замедлить выполнение кода. Вот ключевые рекомендации по оптимизации:
- Кэшируйте текущее время — если вам нужно многократно получать время в цикле, сохраните его в переменную до цикла:
ТекущееВремя = ТекущаяДата(); // Получили один раз
Для Каждого Элемент Из Список Цикл
Если Элемент.ДатаСоздания > ТекущееВремя Тогда
// Обработка
КонецЕсли;
КонецЦикла;
- Избегайте лишних преобразований — если вам нужно только сравнить даты, не форматируйте их без необходимости:
// Плохо (преобразование в строку и обратно)
Если Формат(Документ.Дата, "Д") = Формат(ТекущаяДата(), "Д") Тогда
// Хорошо (сравнение дат без преобразования)
Если НачалоДня(Документ.Дата) = НачалоДня(ТекущаяДата()) Тогда
- Используйте серверные функции — если вам нужно серверное время, вызывайте
ПолучениеДатыСервера()напрямую на сервере, а не передавайте время с клиента.
Для критичных по производительности операций (например, в высоконагруженных системах) можно использовать низкоуровневые функции работы со временем:
// Получение времени в миллисекундах (быстрее, чем ТекущаяДата())
НачалоИзмерения = ТекущаяУниверсальнаяДатаВМиллисекундах();
// ... код ...
КонецИзмерения = ТекущаяУниверсальнаяДатаВМиллисекундах();
Длительность = КонецИзмерения - НачалоИзмерения;
Сообщить("Код выполнился за " + Длительность + " мс");
Если вам нужно измерить время выполнения кода с высокой точностью (например, для бенчмаркинга), используйте ПолучитьИдентификаторСобытия() и ПолучитьДанныеПрофилирования() — эти методы дают более точные результаты, чем ручное измерение через ТекущаяУниверсальнаяДатаВМиллисекундах().
⚠️ Внимание: В облачных решениях (например, 1С:Fresh) серверное время может отличаться от локального из-за особенностей инфраструктуры. Перед развертыванием критичных по времени процессов тестируйте их в целевой среде.
7. Практические примеры использования
Рассмотрим несколько реальных сценариев, где требуется работа с текущим временем в 1С.
Пример 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С
Почему ТекущаяДата() на клиенте и сервере возвращает разное время?
Это происходит из-за того, что функция ТекущаяДата() берет время из системы, где выполняется код. На клиенте это локальное время пользователя, на сервере — время сервера 1С. Чтобы получить одинаковое время, используйте:
- На клиенте:
ПолучениеДатыСервера()(требует вызова серверной функции). - На сервере:
ТекущаяДата()илиПолучениеДатыСервера()(результат будет одинаковым).
Если разница в времени критична (например, для финансовых операций), настройте синхронизацию времени на всех серверах и клиентских машинах через NTP.
Как получить время без даты (только ЧЧ:ММ:СС)?
Используйте функцию Время() или форматирование:
// Способ 1: через функцию Время()
ТолькоВремя = Время(Час(ТекущаяДата()), Минута(ТекущаяДата()), Секунда(ТекущаяДата()));
// Способ 2: через форматирование
ТолькоВремяСтрока = Формат(ТекущаяДата(), "ВФ=HH:mm:ss");
Обратите внимание, что Время() возвращает значение типа Дата с нулевой датой (01.01.0001), а форматирование — строку.
Можно ли в 1С работать с миллисекундами?
Да, но с ограничениями. Платформа 1С:Предприятие хранит время с точностью до секунды, однако для измерения интервалов можно использовать:
ТекущаяУниверсальнаяДатаВМиллисекундах()— возвращает миллисекунды с 1970 года.ПолучитьИдентификаторСобытия()— для высокоточного измерения времени выполнения кода.
Пример измерения времени выполнения с миллисекундами:
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
// ... код ...
Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("Время выполнения: " + (Конец - Начало) + " мс");
Как учесть временную зону пользователя при выводе времени?
Для этого нужно:
- Сохранять время в базе в
UTC(например, с помощьюТекущаяУниверсальнаяДатаВМиллисекундах()). - При выводе пользователю преобразовывать время в его временную зону. Для этого:
// Получаем смещение временной зоны пользователя (например, из справочника)
СмещениеПользователя = Пользователь.ВременнаяЗона * 3600; // в секундах
// Преобразуем UTC-время в локальное
ЛокальноеВремя = ДатаUTC + СмещениеПользователя;
В 1С:Предприятие 8.3.18+ для этого можно использовать объект ВременнаяЗона.
Почему после обновления платформы время в отчетах сбилось на час?
Это связано с изменениями в обработке летнего времени в новых версиях платформы. Начиная с 1С:Предприятие 8.3.18, платформа автоматически учитывает переход на летнее/зимнее время на уровне ОС. Возможные причины сбоя:
- На сервере или клиентских машинах не обновлены временные зоны Windows/Linux.
- В настройках 1С явно указано смещение временной зоны, которое конфликтует с системными настройками.
- В базе данных хранятся даты без учета временной зоны (например, в формате
Датабез привязки к UTC).
Решение:
- Обновите временные зоны на сервере и клиентах.
- Проверьте настройки временной зоны в файле
conf.cfg(параметрtimeZone). - Используйте
UTCдля хранения времени в базе и преобразуйте его при выводе.