Работа с временными метками в системе 1С:Предприятие часто становится камнем преткновения для разработчиков и администраторов. Казалось бы, что может быть проще, чем вызвать функцию времени? Однако архитектура клиент-серверного приложения вводит существенные коррективы в этот процесс.
Главная проблема заключается в физическом разделении процессов. Пользователь работает на своей рабочей станции (клиенте), а данные обрабатываются и хранятся на удаленном сервере. Если вы просто запросите текущее время на клиенте, вы получите локальное время компьютера пользователя, которое может отличаться от серверного на несколько часов или даже дней из-за неверных настроек BIOS или часового пояса.
Для корректного ведения учета, особенно в распределенных системах или при работе с юридически значимыми документами, критически важно использовать единый временной стандарт. Это время сервера. Игнорирование этого нюанса может привести к тому, что документы будут проводиться "задним числом" или, наоборот, в будущем, что вызовет ошибки при закрытии периодов или формировании регламентированной отчетности.
Различия между клиентским и серверным временем
Понимание архитектуры платформы является фундаментом для правильной работы со временем. Когда вы запускаете код в толстом или тонком клиенте, контекст выполнения определяет, чьи часы будут использоваться. Если контекст выполнения — клиент, то функция вернет значение системного времени локальной машины.
Серверное время — это время операционной системы, на которой запущен процесс сервера 1С:Предприятие (агент сервера). В кластере серверов это время берется с той машины, где выполняется конкретный рабочий процесс. Администраторы должны следить за тем, чтобы время на всех узлах кластера было синхронизировано, например, через протокол NTP.
⚠️ Внимание: Расхождение времени между сервером базы данных (СУБД) и сервером приложений 1С более чем на 1-2 секунды может привести к ошибкам блокировок и проблемам с репликацией данных.
Использование клиентского времени для записи в базу данных — это распространенная ошибка новичков. Представьте ситуацию: бухгалтер в Калининграде создает документ в 17:00 по местному времени, а сервер находится в Москве, где уже 18:00. Если провести документ по клиентскому времени, для сервера это будет "прошлое", что может нарушить хронологию операций в журнале документов.
Получение времени сервера в коде 1С
Самый надежный способ получить актуальное время — выполнить запрос на сервере. Платформа предоставляет специальный контекст выполнения, который гарантирует, что код будет выполнен именно в процессе сервера, а не на клиенте.
Для этого используется директива &НаСервере. При размещении функции с этой директивой вы получаете доступ к глобальному методу ТекущаяДата(), который в данном контексте вернет время сервера приложений. Это базовый механизм, который работает во всех конфигурациях.
&НаСервере
Функция ПолучитьСерверноеВремя()
Возврат ТекущаяДата();
КонецФункции
Если вам нужно получить время из клиентского модуля, например, из формы документа, вы должны вызвать серверную процедуру. Прямой вызов ТекущаяДата() в модуле формы вернет время клиента. Поэтому всегда оборачивайте получение времени в отдельную серверную функцию.
Важно отметить, что тип возвращаемого значения — Дата. Этот тип данных в 1С включает в себя не только дату, но и время с точностью до секунды. При присваивании переменной типа Дата времени сервера, вы фиксируете момент совершения операции на стороне сервера.
Если вы работаете в режиме предприятия и нужно быстро проверить время сервера без написания кода, используйте консоль запросов или отладчик, выполнив выражение "ТекущаяДата()" в контексте сервера.
Работа с часовыми поясами и смещениями UTC
В современных версиях платформы 1С:Предприятие 8.3 и выше внедрена полноценная поддержка часовых поясов. Это особенно актуально для компаний с филиалами в разных регионах или при интеграции с внешними сервисами, работающими по времени UTC.
Функция ТекущаяДата() возвращает время сервера с учетом его локального часового пояса. Однако для хранения в базе данных часто требуется использовать универсальное координированное время. Для конвертации используются методы объекта ЧасовойПояс.
Чтобы перевести серверное время в UTC, необходимо знать смещение серверного часового пояса. Платформа позволяет получить объект текущего часового пояса сервера и выполнить сдвиг. Это гарантирует, что независимо от того, где физически расположен сервер, время в базе будет приведено к единому стандарту.
| Метод | Возвращаемое значение | Контекст выполнения |
|---|---|---|
ТекущаяДата() |
Дата и время (локальное) | Клиент или Сервер |
ТекущаяДатаСеанса() |
Дата начала сеанса | Любой |
ЧасовойПояс.СместитьВремя() |
Дата со сдвигом | Любой |
ПолучитьИмяКомпьютера() |
Строка (имя хоста) | Клиент или Сервер |
При обработке данных из других систем, например, из веб-сервисов, время часто приходит в формате ISO 8601 с указанием смещения. В таком случае необходимо явно указывать часовой пояс при парсинге строки в дату, чтобы 1С корректно пересчитала время в локальное время сервера.
Особенность перехода на летнее время
В России переход на летнее время отменен, но если ваш сервер 1С находится в другой юрисдикции или используется старая версия ОС, автоматический перевод стрелок может привести к дублированию или пропуску часов в ночь перехода.
Получение времени через запрос к базе данных
Иногда требуется получить время не от сервера приложений 1С, а непосредственно от сервера управления базами данных (СУБД). Это может быть необходимо для аудита или для сверки времени при диагностике проблем производительности.
Для SQL Server, PostgreSQL или Oracle существуют специфические функции, возвращающие текущее время базы данных. В 1С их можно вызвать через пасsthrough-запросы или встроенные функции языка запросов, если они поддерживаются драйвером.
Например, для получения времени СУБД можно выполнить следующий запрос на языке SQL внутри 1С. Обратите внимание, что такой запрос выполняется в контексте СУБД и его результат может отличаться от времени процесса rphost на доли секунды.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ &ТекЗапрос КАК ВремяСУБД";
// Для MSSQL можно использовать GETDATE(), для PostgreSQL NOW()
// Но стандартными средствами 1С проще получить время сервера приложений
Использование времени СУБД оправдано в редких случаях, когда критична именно метка времени транзакции на уровне базы данных. В большинстве бизнес-задач достаточно времени сервера приложений 1С, так как именно оно используется для установки даты документов.
⚠️ Внимание: Прямые SQL-запросы для получения времени могут не работать в файловом варианте базы данных или при использовании некоторых проприетарных СУБД. Всегда проверяйте поддержку функций в вашей среде.
Диагностика расхождений времени
Если вы подозреваете, что время в базе данных отличается от реального, необходимо провести диагностику. Первым шагом является проверка настроек операционной системы на сервере. Убедитесь, что служба времени Windows или демон ntpd в Linux работают корректно.
Второй шаг — проверка настроек кластера серверов 1С. В консоли администрирования серверов 1С можно посмотреть свойства рабочих процессов. Хотя там не всегда отображается текущее время в реальном времени, можно увидеть статус службы.
- 🕒 Проверьте синхронизацию времени на контроллере домена, если сервер входит в домен Active Directory.
- 🖥️ Убедитесь, что на сервере 1С отключено автоматическое изменение времени гипервизором, если машина виртуальная.
- ⚙️ Сверьте часовой пояс в настройках региона ОС сервера с фактическим местоположением.
Частой причиной расхождений является виртуализация. Гостевая ОС может получать время от хоста, но при миграции виртуальной машины между физическими серверами в разных часовых поясах настройки могут сбиться. Рекомендуется жестко задавать часовой пояс внутри гостевой ОС.
☑️ Диагностика времени
Частые ошибки и способы их устранения
Одной из самых коварных ошибок является использование времени клиента в регламентных заданиях. Регламентное задание выполняется в фоновом режиме на сервере, но если в коде обработки есть обращение к клиентскому контексту (например, через форму), может возникнуть конфликт или получение некорректных данных.
Также разработчики часто забывают, что при сохранении объекта в базу данных время записывается в момент фиксации транзакции. Если между получением времени переменной и записью объекта прошла длительная операция, фактическое время в базе может отличаться от того, что вы получили в начале функции.
Для решения проблемы "дрейфа" времени внутри длительных транзакций рекомендуется получать время сервера непосредственно перед записью критических данных или использовать время начала сеанса для группировки операций, если точность до секунды не является критичной.
Всегда используйте директиву &НаСервере для получения времени, которое будет записано в базу данных, чтобы исключить влияние настроек часовых поясов пользователей.
Можно ли изменить время сервера 1С программно?
Нет, платформа 1С:Предприятие не предоставляет средств для изменения системного времени сервера. Это сделано в целях безопасности. Изменение времени возможно только средствами операционной системы сервера правами администратора.
Почему время в отчете отличается от времени на моем компьютере?
Скорее всего, отчет формируется на сервере, и используется серверное время. Если ваш компьютер находится в другом часовом поясе, разница будет равна разнице между поясами. Проверьте настройки часового пояса в личном профиле 1С.
Как получить время сервера в запросе 1С?
В языке запросов 1С нет прямой функции получения текущего времени сервера внутри текста запроса. Необходимо получить время в коде 1С (в переменной) и передать его в запрос как параметр.
Влияет ли время сервера на работу лицензий?
Да, сервер лицензирования 1С сверяет время. Если время на сервере сильно отклоняется от реального (например, сброшено в прошлое), это может привести к отказу в выдаче лицензий или некорректному подсчету сеансов.