пятница, 31 мая 2013 г.

Местное время в отчетах СКД

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

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


Решение простое: при запуске системы рассчитать смешение времени, запомнить в параметре сеанса и использовать его в вычисляемом поле отчета.

Представим, что есть база в которой существует:
  1. регистр сведений "ИсторияЗвонков";
  2. отчет "ОтчетПоЗвонкам";

Нам необходимо будет для каждого сеанса хранить смещение времени. Для этого необходимо создать параметр сеанса СмещениеЧасовогоПояса числового типа.
В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы() напишем следующий код:
Данный код получает текущее время клиента и универсальное время и определяет смещение времени в часах. После чего устанавливает это смещение в параметр сеанса.

Установка параметра сеанса происходит в общем модуле "Сервер":

Теперь откроем схему компоновки данных. Предположим, что там такой запрос:Набор данных СКД

Для того что бы учесть смещение необходимо передать его в качестве параметра, как показано на рисунке:
Параметр СКД для вывода отчета в местном времени


Добавим вычисляемое поле, в котором будем местному времени добавлять смещение - ДобавитьКДате(ВремяУниверсальное, "Час", &СмещениеВремени). Здесь переданный параметр надо указать с символом "&".
Вычисляемое поле СКД для вывода отчета по местному времени

Для передачи параметра в сам отчет в модуле объекта отчета добавим процедуру ПриКомпоновкеРезультата():

Данная процедура выполняется перед формированием отчета.

В принципе и всё. На последней вкладке СКД указываем группировки как требуется и можно запускать отчет.

Отчет СКД по местному времени

Пример базы вы можете скачать по ссылке: http://yadi.sk/d/TNCOS3fq5MwwH

Хочу добавить, что изначально пытался решить данную задачу через установку часового пояса сеанса и перевода в местное время. Хотел при начале работы определять смещение пояса, задавать новый часовой пояс сеанса (УстановитьЧасовойПоясСеанса()), а потом уже в вычисляемом поле вызывать процедуру перевода универсального времени в местное (МестноеВремя()), но хочу вас предупредить этот способ не сработает - т.к. формирование отчета СКД выполняется на сервере в новом сеансе, часовой пояс которого равен часовому поясу сервера.

Из недостатков данного метода хочу выделить то что часовой пояс определяется на основании времени на ПК клиента, то есть при неверно указанном времени часовой пояс определится так же не верно.

Комментариев нет:

Отправить комментарий