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

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

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

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

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

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

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

Функция ТекущаяДата: базовый способ

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

ДатаСейчас = ТекущаяДата();

Сообщить(ДатаСейчас); // например: 15.03.2026 14:32:07

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

Тип возвращаемого значения — «Дата», он включает и календарную часть, и время с точностью до секунды. Миллисекунды штатными средствами встроенного языка не получить.

ТекущаяДатаСеанса: правильный вариант для сервера

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

&НаСервере

Процедура ЗаписатьДатуНаСервере()

ДатаЗаписи = ТекущаяДатаСеанса();

// используем ДатаЗаписи в документе или регистре

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

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

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

Сравнение вариантов

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

Подходит для локальных вычислений на клиенте и простых баз в одном часовом поясе; ограничение — зависит от часов конкретного компьютера.

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

Стандарт для серверного кода и распределённых баз; учитывает часовой пояс сеанса, но требует корректной настройки поясов в ИБ.

УниверсальноеВремя()

Даёт время по Гринвичу (UTC); нужен для обмена данными и синхронизации, неудобен для показа пользователю.

Универсальное время и часовые пояса

Для задач интеграции — обмена с внешними системами, веб-сервисами, мобильными приложениями — используют функцию УниверсальноеВремя(). Она принимает локальную дату и часовой пояс и возвращает время UTC, которое не зависит от настроек конкретного сеанса.

ДатаUTC = УниверсальноеВремя(ТекущаяДатаСеанса(), ЧасовойПоясСеанса());

Обратная задача — преобразовать универсальное время в локальное — решается функцией МестноеВремя(). Это полезно при разборе данных, полученных из внешних систем, где время обычно передаётся в UTC.

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

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

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

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

КонецСегодня = КонецДня(ТекущаяДатаСеанса()); // 23:59:59 текущего дня

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

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

НомерДняНедели = ДеньНедели(ТекущаяДатаСеанса()); // 1 — понедельник, 7 — воскресенье

Получить «только время» как самостоятельный тип нельзя — в 1С нет отдельного типа «Время». Время всегда хранится внутри значения типа «Дата», обычно с нулевой календарной частью (01.01.0001).

Форматирование даты для вывода

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

СтрокаДаты = Формат(ТекущаяДатаСеанса(), "ДЛФ=DD");   // 15 марта 2026 г.

СтрокаВремени = Формат(ТекущаяДатаСеанса(), "ДЛФ=T"); // 14:32:07

Полностью = Формат(ТекущаяДатаСеанса(), "ДЛФ=DT"); // дата и время

Для произвольного шаблона применяется конструкция ДФ, например "ДФ='yyyy-MM-dd HH:mm:ss'" — формат, удобный для имён файлов и обмена данными. Символы шаблона: yyyy — год, MM — месяц, dd — день, HH — часы, mm — минуты, ss — секунды.

Не путайте MM (месяц) и mm (минуты): регистр букв в форматной строке имеет значение, и ошибка приведёт к тому, что вместо месяца в строку попадут минуты.

bsl
ДатаСтрокой = Формат(ТекущаяДатаСеанса(), "ДФ='yyyy-MM-dd_HH-mm-ss'");

Арифметика дат: прибавление и разность

Простейший способ сдвинуть дату — прибавить или вычесть число секунд. В 1С единица арифметики дат — одна секунда, поэтому для сдвига на день прибавляют 86400.

Завтра = ТекущаяДатаСеанса() + 86400;

ЧасНазад = ТекущаяДатаСеанса() - 3600;

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

ЧерезТриМесяца = ДобавитьМесяц(ТекущаяДатаСеанса(), 3);

МесяцНазад = ДобавитьМесяц(ТекущаяДатаСеанса(), -1);

Разность двух дат даёт число секунд между ними. Чтобы получить разницу в днях, результат делят на 86400. Для точного подсчёта полных лет или месяцев между датами в типовых конфигурациях есть функции общего модуля ОбщегоНазначения или аналогичные — проверьте наличие в вашей конфигурации перед написанием собственного кода.

Порядок действий для типовой задачи
  1. 1
    Определите, где выполняется код: на клиенте или на сервере.
  2. 2
    Для серверного кода используйте ТекущаяДатаСеанса(), для локальных клиентских вычислений — ТекущаяДата().
  3. 3
    Если нужен только календарный день — примените НачалоДня() к полученному значению.
  4. 4
    Для вывода пользователю отформатируйте значение через Формат().
  5. 5
    Проверьте результат в сообщении или в отладчике, сравнив с ожидаемым временем.

Проверка результата и типичные ошибки

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

Ещё один способ проверки — сравнить полученное значение с реальным временем на сервере СУБД. Если расхождение больше нескольких секунд, вероятно, нарушена синхронизация времени на сервере 1С или клиенте.

Типичные ошибки
01
Использование ТекущаяДата() в серверном коде типовой конфигурации — даты записываются без учёта часового пояса сеанса.
02
Сравнение дат со строками вместо приведения типов — условия в запросах перестают срабатывать.
03
Прибавление 30 дней вместо ДобавитьМесяц() — результат съезжает на длинных и коротких месяцах.
04
Путаница MM и mm в форматной строке — вместо месяца выводятся минуты.
05
Получение даты на клиенте и запись её на сервере — при расхождении часов в базе появляются неверные даты документов.

Отдельная группа проблем — пустая дата. Незаполненное значение типа «Дата» равно 01.01.0001 00:00:00. Перед форматированием или сравнением проверяйте значение функцией ЗначениеЗаполнено(), иначе в печатной форме может появиться «1 января 1 года».

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

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

Значение в отладчике
Норма

Тип «Дата», время совпадает с ожидаемым с точностью до секунд

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

Тип «Строка» или дата 01.01.0001

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

Совпадает с временем сеанса пользователя

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

Смещено на разницу часовых поясов или на время клиента

Форматированная строка
Норма

Месяц, день и время на своих местах

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

Вместо месяца минуты, нулевой год

FAQ

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

Примените НачалоДня(ТекущаяДатаСеанса()) — время будет обнулено до 00:00:00. Значение останется типа «Дата», но календарная часть будет использоваться как «сегодня» в сравнениях и запросах.

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

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

Как узнать разницу между двумя датами в днях?

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

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

Штатный тип «Дата» хранит время с точностью до секунды. Для замеров производительности с большей точностью используют ТекущаяУниверсальнаяДатаВМиллисекундах(), но это значение предназначено для измерения интервалов, а не для хранения в реквизитах.

Почему в запросе дата не сравнивается с параметром?

Чаще всего параметр передан строкой или содержит время, а сравнивается с началом дня. Передавайте параметр типа «Дата» и приводите обе стороны к одинаковой точности, например через НачалоДня().

Как вывести дату в формате «гггг-мм-дд» для файла обмена?

Используйте Формат(Дата, "ДФ='yyyy-MM-dd'"). Обратите внимание на регистр: MM — месяц, mm — минуты. Для обмена между системами надёжнее передавать время в UTC через УниверсальноеВремя().

Итог

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

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