Разработка и Конфигурация · 9 мин
Как определить текущую дату в 1С
Как получить текущую дату в 1С: функции ТекущаяДата(), ТекущаяДатаСеанса(), разница между клиентом и сервером, примеры кода, типичные ошибки и проверка результата.
Во встроенном языке 1С:Предприятие текущая дата получается вызовом встроенной функции — без обращения к операционной системе напрямую и без дополнительных библиотек. Однако функций несколько, и они ведут себя по-разному в зависимости от того, где выполняется код: на клиенте или на сервере. Неправильный выбор приводит к расхождению дат в документах, сдвигу границ отчётов и ошибкам в регламентных заданиях.
Основная пара функций — ТекущаяДата() и ТекущаяДатаСеанса(). Первая возвращает дату компьютера, на котором выполняется код, вторая — дату сеанса с учётом часового пояса информационной базы. Дополнительно существуют способы узнать дату через запрос, через рабочую дату пользователя и через параметры сеанса.
Ниже разобраны все рабочие способы, их отличия, ограничения и типичные ошибки, а также даны примеры кода, которые можно переносить в конфигурацию без доработки.
Функция ТекущаяДата() — базовый способ
Функция ТекущаяДата() возвращает значение типа «Дата» с точностью до секунды. Она берёт системное время того компьютера, на котором исполняется код: если код выполняется на клиенте — это часы рабочей станции пользователя, если на сервере — часы сервера 1С.
ДатаСейчас = ТекущаяДата();
Сообщить("Сейчас: " + ДатаСейчас);
Результат содержит и дату, и время. Если нужна только календарная дата без времени, применяют функцию НачалоДня():
ТолькоДата = НачалоДня(ТекущаяДата()); // 00:00:00 текущего дня
Важно помнить: в тонком и веб-клиенте функция возвращает время клиентского компьютера, которое пользователь может изменить вручную. Поэтому для записи критичных данных (дата документа, отметка проведения) полагаться на клиентскую дату нельзя.
Функция ТекущаяДатаСеанса() — рекомендуемый вариант для сервера
ТекущаяДатаСеанса() возвращает дату и время сеанса, приведённые к часовому поясу информационной базы. Если база работает в клиент-серверном режиме и пользователи находятся в разных часовых поясах, именно эта функция даёт единообразное значение для всех.
ДатаСеанса = ТекущаяДатаСеанса();
// При записи документа на сервере:
Объект.Дата = ТекущаяДатаСеанса();
Функция доступна только на сервере и в толстом клиенте. Вызов её из кода тонкого или веб-клиента вызовет ошибку компиляции — это частая причина вопросов у начинающих разработчиков. В клиентском модуле следует либо использовать ТекущаяДата(), либо получать серверную дату через вызов серверной процедуры.
Сравнение способов получения даты
Выбор функции зависит от контекста исполнения и требований к точности. Таблица собирает ключевые различия.
| Способ | Где выполняется | Что возвращает | Когда применять |
|---|---|---|---|
ТекущаяДата() | Клиент и сервер | Системное время компьютера | Интерфейсные подсказки, неответственные отметки |
ТекущаяДатаСеанса() | Сервер, толстый клиент | Время сеанса с учётом часового пояса ИБ | Запись документов, регистры, регламентные задания |
РабочаяДата (глобальный контекст) | Клиент | Рабочая дата, заданная пользователем | Подстановка даты в новые документы |
Запрос с &ТекущаяДата | Сервер | Переданное значение | Отборы и срезы в запросах |
Рабочая дата — отдельный механизм: пользователь может установить её в настройках, и тогда новые документы создаются этой датой, а не календарной. Проверить её можно через одноимённое свойство глобального контекста.
Получение текущей даты на сервере из клиентского кода
Типовая задача: в форме на тонком клиенте нужна серверная дата, чтобы исключить влияние настроек компьютера пользователя. Решение — серверная функция в общем модуле с признаками «Сервер» и «Вызов сервера».
- 1Создайте общий модуль с флагами «Сервер» и «Вызов сервера», снимите флаг «Клиент»
- 2Добавьте экспортную функцию, возвращающую ТекущаяДатаСеанса()
- 3В клиентском коде вызовите эту функцию и при необходимости закешируйте значение
- 4Проверьте результат выводом через Сообщить или в поле формы
// Общий модуль РаботаСДатамиВызовСервера (Сервер, Вызов сервера)
Функция ПолучитьТекущуюДатуСервера() Экспорт
Возврат ТекущаяДатаСеанса();
КонецФункции
// Клиентский модуль формы
ДатаСервера = РаботаСДатамиВызовСервера.ПолучитьТекущуюДатуСервера();
Учитывайте, что каждый такой вызов — это обращение к серверу. Если дата нужна многократно в рамках одного действия пользователя, получите её один раз и сохраните в переменную или реквизит формы.
Текущая дата в запросах
В тексте запроса функция встроенного языка недоступна напрямую — значение передаётся через параметр. Это правильный и управляемый подход:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура,
| СУММА(Продажи.Количество) КАК Количество
|ИЗ
| РегистрНакопления.Продажи.Обороты(&НачалоДня, &КонецДня, , ) КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Номенклатура";
Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецДня", КонецДня(ТекущаяДатаСеанса()));
В конструкторе запросов также доступна встроенная функция языка запросов ТекущаяДата() в выражениях, однако передача через параметр предпочтительнее: значение фиксируется на момент выполнения, его видно при отладке и легко подменить в тестах.
Рабочая дата и дата в интерфейсе пользователя
Для подстановки даты в новые документы платформа использует рабочую дату. Получить её в коде можно так:
РабочаяДатаПользователя = РабочаяДата;
// или с учётом настроек пользователя в типовых конфигурациях:
// ОбщегоНазначения.РабочаяДатаПользователя()
Если рабочая дата не задана, она совпадает с текущей датой компьютера. Пользователь меняет её через настройки интерфейса (в типовых конфигурациях — раздел персональных настроек). Разработчику важно не подменять рабочую дату принудительно без необходимости: пользователи закрытых периодов часто осознанно работают прошлым числом.
Нужна серверная дата — делайте вызов сервера
Всегда применяйте ТекущаяДатаСеанса()
Проверьте настройку часового пояса информационной базы
Типичные ошибки и их последствия
Первая ошибка — сравнение дат с точностью до секунды там, где нужна только календарная дата. Условие Если Документ.Дата = ТекущаяДатаСеанса() почти никогда не выполнится, потому что время различается. Корректно сравнивать через НачалоДня() обеих величин.
Вторая ошибка — вызов ТекущаяДатаСеанса() в клиентском модуле тонкого клиента. Код не проходит проверку компиляции, и модуль формы перестаёт работать. Третья — использование строкового представления даты для сравнений: строки сортируются и сравниваются не как даты, что даёт неочевидные логические ошибки.
Проверка результата
После внедрения кода убедитесь, что дата определяется корректно во всех режимах работы. Пройдите контрольные точки из таблицы ниже.
Как проверить результат
Дата соответствует поясу информационной базы
Дата смещена на разницу часовых поясов
Совпадает с рабочей датой или датой сеанса
Берётся с локальных часов клиента
Границы периода 00:00:00–23:59:59 текущей даты
Часть данных дня теряется из-за времени в границах
Для быстрой отладки выведите значение через Сообщить() вместе с указанием источника — так сразу видно, откуда взялась дата и совпадает ли она с ожиданием.
Что важно запомнить
На клиенте — ТекущаяДата(), на сервере и в регламентных заданиях — ТекущаяДатаСеанса(). Для сравнений отсекайте время через НачалоДня(), в запросы передавайте дату параметром, а для новых документов учитывайте рабочую дату пользователя.
Частые вопросы
Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает системное время компьютера, где исполняется код, а ТекущаяДатаСеанса() — время сеанса, приведённое к часовому поясу информационной базы. Вторая доступна только на сервере и в толстом клиенте.
Почему в тонком клиенте не работает ТекущаяДатаСеанса()?
Функция недоступна в контексте тонкого и веб-клиента по ограничениям платформы. Получите серверную дату через вызов экспортной функции общего серверного модуля с признаком «Вызов сервера».
Как получить текущую дату без времени?
Оберните значение в НачалоДня(): НачалоДня(ТекущаяДатаСеанса()) вернёт текущую дату со временем 00:00:00. Для конца дня используйте КонецДня() — 23:59:59.
Как получить текущую дату в запросе 1С?
Передайте её через параметр: Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()). Это надёжнее встроенной функции языка запросов, так как значение фиксируется и видно при отладке.
Что такое рабочая дата и когда её использовать?
Рабочая дата — настройка, которую пользователь задаёт вручную, чтобы новые документы создавались нужным числом, например при вводе документов закрытого периода. Если она не установлена, используется текущая дата компьютера.
Опасно ли брать дату с компьютера пользователя?
Да, для учётных данных это риск: пользователь может изменить системное время, и дата документа или движения окажется неверной. Все ответственные записи дат выполняйте на сервере через ТекущаяДатаСеанса().