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

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

Как определить текущую дату в 1С

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

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

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

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

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

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

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

Сообщить("Сейчас: " + ДатаСейчас);

Результат содержит и дату, и время. Если нужна только календарная дата без времени, применяют функцию НачалоДня():

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

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

Функция ТекущаяДатаСеанса() — рекомендуемый вариант для сервера

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

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

// При записи документа на сервере:

Объект.Дата = ТекущаяДатаСеанса();

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

Сравнение способов получения даты

Выбор функции зависит от контекста исполнения и требований к точности. Таблица собирает ключевые различия.

СпособГде выполняетсяЧто возвращаетКогда применять
ТекущаяДата()Клиент и серверСистемное время компьютераИнтерфейсные подсказки, неответственные отметки
ТекущаяДатаСеанса()Сервер, толстый клиентВремя сеанса с учётом часового пояса ИБЗапись документов, регистры, регламентные задания
РабочаяДата (глобальный контекст)КлиентРабочая дата, заданная пользователемПодстановка даты в новые документы
Запрос с &ТекущаяДатаСерверПереданное значениеОтборы и срезы в запросах

Рабочая дата — отдельный механизм: пользователь может установить её в настройках, и тогда новые документы создаются этой датой, а не календарной. Проверить её можно через одноимённое свойство глобального контекста.

Получение текущей даты на сервере из клиентского кода

Типовая задача: в форме на тонком клиенте нужна серверная дата, чтобы исключить влияние настроек компьютера пользователя. Решение — серверная функция в общем модуле с признаками «Сервер» и «Вызов сервера».

Порядок действий
  1. 1
    Создайте общий модуль с флагами «Сервер» и «Вызов сервера», снимите флаг «Клиент»
  2. 2
    Добавьте экспортную функцию, возвращающую ТекущаяДатаСеанса()
  3. 3
    В клиентском коде вызовите эту функцию и при необходимости закешируйте значение
  4. 4
    Проверьте результат выводом через Сообщить или в поле формы
// Общий модуль РаботаСДатамиВызовСервера (Сервер, Вызов сервера)

Функция ПолучитьТекущуюДатуСервера() Экспорт

Возврат ТекущаяДатаСеанса();

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

// Клиентский модуль формы

ДатаСервера = РаботаСДатамиВызовСервера.ПолучитьТекущуюДатуСервера();

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

Текущая дата в запросах

В тексте запроса функция встроенного языка недоступна напрямую — значение передаётся через параметр. Это правильный и управляемый подход:

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

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

"ВЫБРАТЬ

| Продажи.Номенклатура,

| СУММА(Продажи.Количество) КАК Количество

|ИЗ

| РегистрНакопления.Продажи.Обороты(&НачалоДня, &КонецДня, , ) КАК Продажи

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

| Продажи.Номенклатура";

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

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

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

Рабочая дата и дата в интерфейсе пользователя

Для подстановки даты в новые документы платформа использует рабочую дату. Получить её в коде можно так:

РабочаяДатаПользователя = РабочаяДата;

// или с учётом настроек пользователя в типовых конфигурациях:

// ОбщегоНазначения.РабочаяДатаПользователя()

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

Код в тонком клиентеДоступна только ТекущаяДата()

Нужна серверная дата — делайте вызов сервера

Регламентное заданиеИсполняется на сервере

Всегда применяйте ТекущаяДатаСеанса()

Пользователи в разных поясахРиск разнобоя дат

Проверьте настройку часового пояса информационной базы

Типичные ошибки и их последствия

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

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

Типичные ошибки
01
Сравнение дат с временем вместо НачалоДня() — условие никогда не срабатывает
02
Вызов ТекущаяДатаСеанса() на тонком клиенте — ошибка компиляции модуля
03
Запись клиентской даты в документ — искажение учёта при сбитых часах пользователя
04
Многократный серверный вызов даты в цикле — лишняя нагрузка и просадка производительности

Проверка результата

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

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

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

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

Дата соответствует поясу информационной базы

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

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

Дата нового документа
Норма

Совпадает с рабочей датой или датой сеанса

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

Берётся с локальных часов клиента

Отчёт за текущий день
Норма

Границы периода 00:00:00–23:59:59 текущей даты

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

Часть данных дня теряется из-за времени в границах

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

Итог

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

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

Частые вопросы

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

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

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

Функция недоступна в контексте тонкого и веб-клиента по ограничениям платформы. Получите серверную дату через вызов экспортной функции общего серверного модуля с признаком «Вызов сервера».

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

Оберните значение в НачалоДня(): НачалоДня(ТекущаяДатаСеанса()) вернёт текущую дату со временем 00:00:00. Для конца дня используйте КонецДня() — 23:59:59.

Как получить текущую дату в запросе 1С?

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

Что такое рабочая дата и когда её использовать?

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

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

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