При выгрузке данных, интеграции со сторонними веб-сервисами или формировании отчетов часто требуется вывести дату с указанием смещения часового пояса, например 2018-01-19 16:45:59 +03 или +05. Разберем, как решить эту задачу в платформе 1С:Предприятие.
Встроенная функция Формат с параметром ДФ (форматная строка даты) позволяет настраивать вывод года, месяца, дня, часов, минут и секунд, однако в платформе 1С отсутствуют встроенные маски для автоматического вывода смещения часового пояса. По этой причине офсет времени приходится вычислять и добавлять к итоговой строке динамически.
Рассмотрим, как получить смещение часового пояса в часах и отформатировать его с гарантированным выводом двух цифр (с ведущим нулем).
Для получения величины смещения используется функция СмещениеСтандартногоВремени(), принимающая часовой пояс. Функция возвращает значение в секундах, поэтому делим его на 3600 (количество секунд в часе). Чтобы полученное число форматировалось с ведущим нулем (например, 03 вместо 3), используем параметры ЧЦ=2 (длина целой части) и ЧВН= (вывод ведущих нулей):
РезультатСтрока = Формат(ТекущаяДата(), "ДФ=""гггг-ММ-дд ЧЧ:мм:сс""")
+ " +"
+ Формат(СмещениеСтандартногоВремени(ЧасовойПояс()) / 3600, "ЧЦ=2; ЧВН=; ЧГ=");
Проанализируем параметры форматной строки для числа:
Выясним детали, которые необходимо учитывать при работе со смещениями временных зон:
ЧасовойПояс() возвращает пояс операционной системы сервера или ПК. Если программа работает в клиент-серверном режиме или с пользователями из разных регионов, правильнее применять ЧасовойПоясСеанса().+ приведет к ошибке формата. В универсальном коде стоит динамически определять знак (плюс или минус) в зависимости от того, положительно или отрицательно смещение.Если перед вами стоит задача сформировать дату со смещением в общепринятом стандарте ISO 8601 (например, 2018-01-19T16:45:59+03:00), можно применить механизм сериализации JSON, встроенный в 1С:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
НастройкиЗаписи = Новый НастройкиЗаписиJSON;
НастройкиЗаписи.ФорматДаты = ФорматДатыJSON.ISO;
НастройкиЗаписи.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением;
ЗаписатьJSON(ЗаписьJSON, ТекущаяДата(), НастройкиЗаписи);
СтрокаISO = ЗаписьJSON.Закрыть();
Посмотрим на результат: этот метод автоматически учитывает текущие настройки часового пояса сеанса и формирует стандартизированную строку даты без необходимости вручную собирать подстроки.