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