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

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

Как сообщить текущую дату в 1С: функции, форматирование и примеры кода

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

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

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

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

Какие функции возвращают текущую дату в 1С

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

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

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

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

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

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

Универсальный вариант для прикладного кода: учитывает часовой пояс сеанса, одинаково работает на клиенте и сервере

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

Подходит для отображения времени на клиенте; риск ошибки при неверно настроенных часах компьютера

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

Только для обменов и технических задач в UTC; не используйте в сообщениях пользователю

Как вывести текущую дату в сообщении пользователю

Современный способ вывода служебных сообщений — объект СообщениеПользователю. Он корректно работает в управляемых формах, привязывается к данным и не «теряется» при клиент-серверном взаимодействии. Пример кода:

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

ТекстСообщения = "Текущая дата: " + Формат(ДатаСейчас, "ДЛФ=D");

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = ТекстСообщения;

Сообщение.Сообщить();

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

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

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

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

Функция Формат() управляет представлением даты в строке. Для дат используются предопределённые форматы с параметром ДЛФ (дата локальная форматированная) и ДВ (дата и время):

  • Формат(Дата, "ДЛФ=D") — длинный формат даты: «15 марта 2026 г.»;
  • Формат(Дата, "ДЛФ=DD") — краткий формат: «15.03.2026»;
  • Формат(Дата, "ДЛФ=DT") — дата со временем: «15 марта 2026 г. 14:32:07»;
  • Формат(Дата, "ДФ=dd.MM.yyyy") — произвольный шаблон с явным порядком элементов.

Параметр ДФ позволяет собрать любой вид строки: Формат(Дата, "ДФ='yyyy-MM-dd HH:mm:ss'") даст «2026-03-15 14:32:07» — такой формат удобен для логов и файлов обмена. Обратите внимание: литеральный текст внутри шаблона берётся в одинарные кавычки.

Если нужно вывести только дату без времени, а значение содержит время (что почти всегда так), форматирование обязательно: иначе пользователь увидит лишние «00:00:00» или текущее время там, где ожидалась только дата.

Вывод даты в разных контекстах: форма, печать, заголовок

Не всегда дату нужно «сообщить» — часто её требуется показать в интерфейсе. В управляемой форме проще всего создать реквизит формы типа «Дата» или «Строка» и присвоить ему значение в обработчике ПриСозданииНаСервере:

&НаСервере

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

ТекущаяДатаСтрокой = Формат(ТекущаяДатаСеанса(), "ДЛФ=DD");

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

Для печатных форм дата подставляется в параметры макета: Область.Параметры.ДатаФормирования = Формат(ТекущаяДатаСеанса(), "ДЛФ=D"). Так в табличном документе появится строка вида «Дата формирования: 15 марта 2026 г.».

Для изменения заголовка формы достаточно присвоить свойство Заголовок или АвтоЗаголовок = Ложь и сформировать строку с датой. Учтите: заголовок не обновляется сам — если форма открыта долго, дата в нём «застынет» на момент открытия. Для периодического обновления используйте ПодключитьОбработчикОжидания().

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

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

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

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

Типичные ошибки при работе с текущей датой

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

Вторая ошибка — ожидание, что дата в сообщении или на форме обновляется автоматически. Значение вычисляется один раз в момент выполнения кода. Если обработка работает час, а дата была получена в начале, в конце она уже может устареть — для длительных операций получайте дату непосредственно перед использованием.

Третья ошибка — сравнение дат с учётом времени, когда нужно сравнить календарные дни. Условие ТекущаяДатаСеанса() = ДатаДокумента почти никогда не выполнится из-за различий в секундах. Используйте НачалоДня() для обеих сторон сравнения.

Типичные ошибки
01
Сложение строки с датой без Формат() — непредсказуемое представление в разных базах
02
Использование ТекущаяДата() в серверной записи данных — расхождение времени клиента и сервера
03
Сравнение дат без НачалоДня() — условие не срабатывает из-за различий во времени
04
Получение даты один раз в начале длительной операции — устаревшее значение в конце обработки
05
Вывод универсальной даты UTC пользователю — непонятное время без привязки к поясу

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

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

Для проверки форматирования выведите одно и то же значение в нескольких форматах и сверьте с ожидаемым видом. Если в печатной форме дата отображается как «01.01.0001 0:00:00», значит в параметр макета попало пустое значение даты — проверьте присвоение параметра до вывода области.

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

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

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

Текст сообщения с датой
Норма

Дата в ожидаемом формате, время совпадает с часами сеанса

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

Пустая дата 01.01.0001 или неожиданный формат строки

Совпадение времени клиента и сервера
Норма

ТекущаяДатаСеанса() и ТекущаяДата() различаются незначительно

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

Расхождение в часы или сутки — проблема с часовыми поясами

Дата в печатной форме
Норма

Строка вида «15 марта 2026 г.» в нужной области

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

Пустое место или значение по умолчанию — параметр не заполнен

Частые вопросы о текущей дате в 1С

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

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

Как вывести только дату без времени?

Значение типа Дата всегда содержит время, поэтому время убирается форматированием: Формат(Дата, "ДЛФ=DD") даст строку «15.03.2026». Если нужно именно значение без времени для сравнений, примените НачалоДня(Дата) — время обнулится до 00:00:00.

Почему в сообщении выводится «01.01.0001 0:00:00»?

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

Можно ли получить текущую дату в запросе?

Да, через параметр запроса: передайте ТекущаяДатаСеанса() как параметр и используйте его в условии ГДЕ или в выражении ПЕРИОД. Получать дату «внутри» текста запроса нельзя — у языка запросов нет функции текущего времени, поэтому значение всегда передаётся из кода.

Как обновлять дату на форме автоматически?

Используйте ПодключитьОбработчикОжидания("ИмяПроцедуры", ИнтервалВСекундах) на клиенте. В указанной процедуре заново получайте дату и присваивайте её реквизиту формы. Не задавайте слишком маленький интервал без необходимости — для отображения даты достаточно обновления раз в минуту.

Работает ли ТекущаяДатаСеанса() в фоновом задании?

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

Итог

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

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