При работе в распределенной инфраструктуре, когда сервер «1С:Предприятия» расположен в одном часовом поясе, а пользователи подключаются из филиалов в других регионах, возникает типичная ситуация: при создании новых документов дата и время заполняются по серверному времени, а не по локальному времени пользователя. Разберем архитектурные особенности платформы 1С при работе с часовыми поясами, программные способы установки времени сеанса, а также методические риски для оперативного учета.
Проанализируем, как платформа 1С разделяет понятия времени и часовых поясов:
УстановитьЧасовойПоясИнформационнойБазы(). Если пояс явно не переопределен, по умолчанию используется системный пояс операционной системы сервера.ЧасовойПоясСеанса() и может переопределяться методом УстановитьЧасовойПоясСеанса().ТекущаяДата() на сервере возвращает локальное время операционной системы сервера, в то время как функция ТекущаяДатаСеанса() возвращает текущее время с учетом часового пояса сеанса конкретного пользователя.В типовых конфигурациях и при разработке по стандартам 1С для подстановки даты в прикладные объекты и проведения расчетов всегда должна применяться функция ТекущаяДатаСеанса().
Для того чтобы документы и формы отображали местное время пользователя, часовой пояс сеанса необходимо скорректировать при старте клиентского приложения. Рассмотрим, как программно задать часовой пояс.
Идентификатор пояса передается в строковом виде (например, "Europe/Moscow", "Asia/Vladivostok", "GMT+05:00"). Полный список доступных платформе идентификаторов можно получить с помощью функции ПолучитьДопустимыеЧасовыеПояса().
Рассмотрим пример алгоритма, который вычисляет разницу между локальным временем клиента и временем сеанса на сервере, после чего применяет смещение:
&НаКлиенте
Процедура СкорректироватьЧасовойПоясСеанса()
// Получаем текущее время на клиенте
ВремяКлиента = ТекущаяДата();
// Получаем текущее время сеанса с сервера
ВремяСеансаСервер = ПолучитьВремяСеансаНаСервере();
// Рассчитываем разницу в часах
СмещениеВЧасах = Окр((ВремяКлиента - ВремяСеансаСервер) / 3600);
Если СмещениеВЧасах = 0 Тогда
Возврат;
КонецЕсли;
// Формируем строковый идентификатор часового пояса и применяем его
Если СмещениеВЧасах > 0 Тогда
СтрокаПояса = "GMT+" + Формат(СмещениеВЧасах, "ЧЦ=2; ЧВН=");
Иначе
СтрокаПояса = "GMT-" + Формат(ABS(СмещениеВЧасах), "ЧЦ=2; ЧВН=");
КонецЕсли;
УстановитьЧасовойПоясСеансаНаСервере(СтрокаПояса);
КонецПроцедуры
&НаСервере
Функция ПолучитьВремяСеансаНаСервере()
Возврат ТекущаяДатаСеанса();
КонецФункции
&НаСервере
Процедура УстановитьЧасовойПоясСеансаНаСервере(Знач СтрокаПояса)
УстановитьЧасовойПоясСеанса(СтрокаПояса);
КонецПроцедуры
Посмотрим на практическую реализацию в решениях на базе БСП (Библиотеки Стандартных Подсистем): чаще всего часовой пояс сеанса привязывают не к часам клиентской рабочей станции, а к настройкам пользователя, подразделения или конкретной организации/филиала в справочниках. Это исключает ошибки, вызванные сбитыми системными часами на компьютерах сотрудников.
Выясним, какие последствия влечет включение разных часовых поясов для пользователей, работающих в одной информационной базе 1С:ERP:
Дата не содержат данных о часовом поясе. Если филиал во Владивостоке проведет документ реализации в 15:00 по своему времени, а склад в Москве проведет приходную накладную на те же позиции в 10:00 по московскому времени (что физически соответствует 17:00 Владивостока), в базе дата реализации окажется позже даты прихода, если сравнивать числа буквально. Но при межфилиальных операциях или общих складах документ расхода может зафиксироваться раньше документа прихода, что вызовет отрицательные остатки, искажение себестоимости и ошибки при закрытии месяца.Обратим внимание на критически важное требование к инфраструктуре: все серверы кластера 1С, сервер СУБД и клиентские компьютеры должны синхронизировать системное время через службу NTP с единым источником точного времени. Даже секундная рассинхронизация часов между физическими узлами кластера или сервером баз данных приводит к блокировкам транзакций, сбоям проверки оперативных меток и ошибкам проведения документов.