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

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

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

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

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

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

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

Откуда 1С берёт дату: клиент, сервер приложений и СУБД

В файловом режиме работы всё просто: код выполняется на компьютере пользователя, и любая функция даты вернёт системное время этого компьютера. Проблемы начинаются в клиент-серверном варианте, где есть минимум три источника времени: клиентский компьютер, сервер 1С:Предприятия и сервер СУБД.

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

Отдельный источник — время СУБД. Оно используется, например, при записи служебных меток времени или в запросах с функциями даты на стороне SQL. Обычно сервер приложений и СУБД находятся в одном контуре и их время синхронизировано, но при распределённой инфраструктуре это стоит проверить.

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

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

Пример использования в серверной процедуре:

&НаСервере

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

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

Сообщить("Дата сервера: " + Формат(ДатаСервера, "ДЛФ=DT"));

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

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

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

bsl
ДатаСервера = ТекущаяДатаСеанса();
Сообщить(Формат(ДатаСервера, "ДЛФ=DT"));

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

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

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

КритерийТекущаяДата()ТекущаяДатаСеанса()
Источник времениКомпьютер, где выполняется кодСервер 1С:Предприятия
Клиент-серверный режимРиск расхождения датКорректная работа
Файловый режимРаботаетРаботает
Рекомендация платформыУстаревшая, выдаётся предупреждениеРекомендуемая

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

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

Универсальный вариант для любого режима. Возвращает серверное время с учётом часового пояса сеанса. Подходит всегда.

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

Допустима только в файловом режиме или в гарантированно серверном коде. В клиентском контексте клиент-серверного режима даёт время компьютера пользователя.

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

Вычисляются на сервере СУБД. Подходят для отбора в запросах, но не заменяют получение даты в коде.

Как получить дату сервера на клиенте и в запросе

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

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

&НаКлиенте

Процедура ПоказатьДатуСервера(Команда)

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

ПоказатьПредупреждение(, "Дата сервера: " + ДатаСервера);

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

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

Дата сервера в запросе

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

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

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

"ВЫБРАТЬ

| Заказы.Ссылка

|ИЗ

| Документ.ЗаказПокупателя КАК Заказы

|ГДЕ

| Заказы.ДатаОтгрузки < &ТекущаяДата";

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

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

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

Часовые пояса и дата сеанса

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

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

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

Типичные ошибки и риски

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

Вторая ошибка — передача даты с клиента на сервер параметром и запись её в документ без проверки. Пользователь с неправильным системным временем или злонамеренно изменивший часы получает возможность «подделать» дату. Все ответственные даты (проведение, сроки, блокировки) должны формироваться только на сервере.

Третья группа проблем связана с самим сервером: если на сервере 1С не настроена синхронизация времени (NTP), серверная дата тоже может «плыть». Это уже задача администрирования, а не разработки, но симптомы в прикладных данных одинаковые.

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

Как проверить, что дата сервера корректна

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

Для проверки устойчивости прикладного кода полезен тест: временно измените системное время на клиентском компьютере и создайте документ. Если дата документа осталась серверной — код написан правильно. Если дата «уехала» вслед за клиентскими часами — где-то используется ТекущаяДата() или передача значения с клиента.

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

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

Значение ТекущаяДатаСеанса() против эталонного времени
Норма

Расхождение в пределах секунд

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

Разница в минуты и более — проверяйте сервер и пояс сеанса

Дата нового документа при сбитом времени на клиенте
Норма

Документ получает серверную дату

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

Дата документа следует за часами клиента

Часовой пояс сеанса через ЧасовойПоясСеанса()
Норма

Пояс соответствует ожиданиям пользователя

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

Пояс не задан или неверный — время смещено на целые часы

Маршрут решения

Как выбрать действие

Документы периодически создаются «не тем числом» у отдельных пользователейНайдите вызовы ТекущаяДата() в клиентском коде и замените на ТекущаяДатаСеанса()
Дата неверна у всех пользователей одновременноПроверьте системное время и NTP-синхронизацию на сервере 1С
Время смещено ровно на целое число часовПроверьте часовой пояс сеанса и настройки пояса информационной базы
Нужно единое время для филиалов в разных поясахЗадайте пояс сеанса централизованно или фиксируйте даты в UTC с пересчётом при отображении

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

Можно ли получить дату сервера на тонком или веб-клиенте?

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

Почему платформа выдаёт предупреждение на ТекущаяДата()?

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

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

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

Дата сервера отстаёт на несколько минут — что делать?

Это проблема уровня инфраструктуры: проверьте системное время на сервере 1С:Предприятия и настройте синхронизацию по NTP с надёжным источником времени. Прикладным кодом такое расхождение не исправить.

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

В языке запросов нет функции текущей даты, аналогичной коду. Правильный подход — вычислить ТекущаяДатаСеанса() в коде и передать значение в запрос параметром. Это и точнее, и позволяет СУБД эффективнее кэшировать план запроса.

Как задать единое время для пользователей из разных часовых поясов?

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

Итог

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

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