Разработка и Конфигурация · 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 (минуты): регистр букв в форматной строке имеет значение, и ошибка приведёт к тому, что вместо месяца в строку попадут минуты.
ДатаСтрокой = Формат(ТекущаяДатаСеанса(), "ДФ='yyyy-MM-dd_HH-mm-ss'");Арифметика дат: прибавление и разность
Простейший способ сдвинуть дату — прибавить или вычесть число секунд. В 1С единица арифметики дат — одна секунда, поэтому для сдвига на день прибавляют 86400.
Завтра = ТекущаяДатаСеанса() + 86400;
ЧасНазад = ТекущаяДатаСеанса() - 3600;
Для месяцев и лет простое прибавление секунд не подходит — месяцы имеют разную длину. Используйте функцию ДобавитьМесяц(), которая корректно обрабатывает переходы через конец месяца и года.
ЧерезТриМесяца = ДобавитьМесяц(ТекущаяДатаСеанса(), 3);
МесяцНазад = ДобавитьМесяц(ТекущаяДатаСеанса(), -1);
Разность двух дат даёт число секунд между ними. Чтобы получить разницу в днях, результат делят на 86400. Для точного подсчёта полных лет или месяцев между датами в типовых конфигурациях есть функции общего модуля ОбщегоНазначения или аналогичные — проверьте наличие в вашей конфигурации перед написанием собственного кода.
- 1Определите, где выполняется код: на клиенте или на сервере.
- 2Для серверного кода используйте ТекущаяДатаСеанса(), для локальных клиентских вычислений — ТекущаяДата().
- 3Если нужен только календарный день — примените НачалоДня() к полученному значению.
- 4Для вывода пользователю отформатируйте значение через Формат().
- 5Проверьте результат в сообщении или в отладчике, сравнив с ожидаемым временем.
Проверка результата и типичные ошибки
Самый надёжный способ убедиться, что дата получена правильно, — вывести её через Сообщить() или посмотреть в отладчике вместе с типом значения. Тип должен быть «Дата», а не «Строка»: сравнение строк с датами даёт непредсказуемые результаты в запросах и условиях.
Ещё один способ проверки — сравнить полученное значение с реальным временем на сервере СУБД. Если расхождение больше нескольких секунд, вероятно, нарушена синхронизация времени на сервере 1С или клиенте.
Отдельная группа проблем — пустая дата. Незаполненное значение типа «Дата» равно 01.01.0001 00:00:00. Перед форматированием или сравнением проверяйте значение функцией ЗначениеЗаполнено(), иначе в печатной форме может появиться «1 января 1 года».
Как проверить результат
Тип «Дата», время совпадает с ожидаемым с точностью до секунд
Тип «Строка» или дата 01.01.0001
Совпадает с временем сеанса пользователя
Смещено на разницу часовых поясов или на время клиента
Месяц, день и время на своих местах
Вместо месяца минуты, нулевой год
FAQ
Как получить текущую дату без времени?
Примените НачалоДня(ТекущаяДатаСеанса()) — время будет обнулено до 00:00:00. Значение останется типа «Дата», но календарная часть будет использоваться как «сегодня» в сравнениях и запросах.
Чем ТекущаяДата отличается от ТекущаяДатаСеанса?
ТекущаяДата() возвращает время компьютера, где выполняется код. ТекущаяДатаСеанса() — время сервера, приведённое к часовому поясу сеанса. В файловой базе без настройки поясов результат обычно одинаков, в клиент-серверной — может отличаться.
Как узнать разницу между двумя датами в днях?
Вычтите одну дату из другой — получите секунды, затем разделите на 86400. Для точного подсчёта полных месяцев и лет используйте ДобавитьМесяц() в цикле или готовые функции общих модулей типовой конфигурации.
Можно ли получить миллисекунды в 1С?
Штатный тип «Дата» хранит время с точностью до секунды. Для замеров производительности с большей точностью используют ТекущаяУниверсальнаяДатаВМиллисекундах(), но это значение предназначено для измерения интервалов, а не для хранения в реквизитах.
Почему в запросе дата не сравнивается с параметром?
Чаще всего параметр передан строкой или содержит время, а сравнивается с началом дня. Передавайте параметр типа «Дата» и приводите обе стороны к одинаковой точности, например через НачалоДня().
Как вывести дату в формате «гггг-мм-дд» для файла обмена?
Используйте Формат(Дата, "ДФ='yyyy-MM-dd'"). Обратите внимание на регистр: MM — месяц, mm — минуты. Для обмена между системами надёжнее передавать время в UTC через УниверсальноеВремя().
Что важно запомнить
Для серверного кода и записи данных используйте ТекущаяДатаСеанса(), для форматирования — Формат(), для сдвига на месяцы — ДобавитьМесяц(). Проверяйте тип значения и учитывайте часовые пояса при обмене между базами.