При территориально распределенной структуре компании часто возникает задача организации одновременной работы филиалов из разных часовых поясов в единой информационной базе. В конфигурации 1С:Управление производственным предприятием 1.3 (УПП), запущенной на сервере терминалов (RDP), возникает ряд архитектурных и учетных сложностей, связанных с регистрацией даты и времени документов. Проанализируем особенности поведения платформы и конфигурации, а также разберем проверенные способы решения этой задачи.
Конфигурация УПП 1.3 разрабатывалась до появления в платформе развитых механизмов работы с часовыми поясами сеансов. В отличие от современных конфигураций на базе Библиотеки Стандартных Подсистем (БСП), архитектура УПП имеет следующие особенности:
ТекущаяДата(), которая возвращает системное время того компьютера, на котором выполняется код (для сервера 1С — время хоста сервера, для клиентского сеанса — время терминальной сессии). Метод ТекущаяДатаСеанса() в типовом коде УПП 1.3 практически не применяется.Основная сложность попытки проведения документов «по местному времени» заключается в нарушении хронологии учетных событий на единой оси времени базы данных:
Наиболее надежным и стандартным подходом является ведение всей учетной хронологии по единому времени головного офиса (или по поясу сервера базы данных). Все документы проводятся в единой шкале времени, что гарантирует корректность работы партионного учета, регламентных процедур закрытия месяца и расчета себестоимости.
Если руководству необходимо контролировать реальное время совершения операций сотрудниками филиалов, разберем по шагам, как это реализовать без нарушения учетной логики:
МестноеВремя или ЧасовойПоясПодразделения.Если требуется, чтобы интерфейс платформы отображал время с учетом пояса пользователя, рассмотрим настройку часового пояса сеанса средствами встроенного языка.
Платформа предоставляет методы УстановитьЧасовойПоясИнформационнойБазы() и УстановитьЧасовойПоясСеанса(). Разберем пример инициализации пояса сеанса при авторизации пользователя:
// В модуле обычного приложения или модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
// Получаем часовой пояс текущего пользователя из справочника или настроек
СтрокаПояса = ПолучитьЧасовойПоясПользователя(ПараметрыСеанса.ТекущийПользователь);
Если Не ПустаяСтрока(СтрокаПояса) Тогда
УстановитьЧасовойПоясСеанса(СтрокаПояса);
КонецЕсли;
КонецПроцедуры
При реализации этого подхода проанализируем необходимость доработки кода конфигурации: потребуется выполнить аудит и заменить прямые вызовы ТекущаяДата() на ТекущаяДатаСеанса() в процедурах инициализации новых документов и отчетов.
В случаях, когда удаленные подразделения имеют значительную разницу во времени, нестабильный канал связи или требуют полной автономии при проведении документов своим локальным временем, оптимальным решением является построение распределенной информационной базы (РИБ):