Часовые пояса в платформе 1С

Речь пойдёт о крупных организациях, сводящих в единую информационную систему данные из источников, находящихся в разных часовых поясах. В процессе обработки, скорее всего, будут использоваться вызовы СмещениеСтандартногоВремени(), УниверсальноеВремя() и т.п., которые работают неправильно во многих релизах без явного указания часовых поясов.

Историческая справка.

https://ru.wikipedia.org/wiki/%C2%F0%E5%EC%FF_%E2_%D0%EE%F1%F1%E8%E8#.D0.98.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D1.8F_2014_.D0.B3.D0.BE.D0.B4.D0.B0

И хотя Microsoft выпустил обновление 2998527 для учёта этих изменений в Windows ещё в сентябре 2014-го, это мало помогло 1С-ным учётным системам. 1C использует для работы с часовыми поясами стороннюю библиотеку ICU, слегка допиленную 1Совцами под свои нужды, а база часовых поясов вшита внутрь библиотеки ICU. 1С привела базу поясов в соответствие законодательству с выпуском релизов 8.2.19.116 и 8.3.5.1231 от 21 октября 2014 года.


Реализация.

Не секрет, что крупные организации обладают большой инерцией в вопросах обновления ПО, связанной с техническими или политическими особенностями работы внутренних служб сопровождения. Поэтому, обычно, решение данного вопроса сводится к костылям вроде ведения собственной базы часовых поясов филиалов, или выбора в ОС таких часовых поясов, которым в базе платформы соответствуют правильные смещения времени.

Здесь я хочу показать правильное решение данного вопроса для тех, кто не готов обновить платформу.

Как раз для таких ситуаций, ICU позволяет читать обновлённую базу часовых поясов из внешних файлов. Для обозначения расположения файлов нужно определить системную переменную окружения ICU_DATA, которой нужно присвоить путь к папке. Внутри следует разместить папку с именем вида icudtXXl, где XX – версия ICU, используемая платформой. Свою версию вы можете определить по имени файла icudtXX.dll в папке bin установленной платформы 1С. Внутри папки для соответствующей версии следует расположить файлы обновлённой базы часовых поясов – четыре файла, которые можно скачать по ссылке http://source.icu-project.org/repos/icu/data/trunk/tzdata/icunew/2024b/44/le/

Пример для 8.3.4.496:

  1. Создаём папку C:ICU_DATAicudt46l

  2. Скачиваем в неё все файлы по указанной ссылке.

  3. Устанавливаем переменную окружения ICU_DATA= C:ICU_DATA

  4. Перезапускаем 1С.

  5. profit Smile

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


Для linux не проверял, но, если сервер приложений умеет читать глобальные переменные окружения, должно работать аналогично:

  1. Создаём /opt/icu/icudt46l/

  2. Размещаем файлы

  3. В /etc/environment указываем ICU_DATA=/opt/icu/

4 Comments

  1. pumbaE

    Хабр подал идею, вы надеюсь проверили у себя.

    Но на вопрос как проводить оперативно на одном сервере с клиентов с различными часовыми поясами вы ответ и не дали.

    При открытии списка документов, как понять что этот документ с временем 13:00 проведен из другого часового пояса, не понятно.

    Reply
  2. berezdetsky

    (1) Проверил. 🙂

    Вопрос немного в другом. Наверно, я не очень понятно описал сценарий использования. Оператору в центре мало интересно, был данный документ проведён из другого часового пояса. Суть в том, чтобы правильно разместить во времени события, возникающие в других системах и в других часовых поясах. И в том, чтобы, передавая данные в такие системы, можно было бы указать правильное локальное время.

    И даже если высокая точность здесь не нужна, обычно вызывают много вопросов документы из будущего, возникающие просто потому, что СмещениеСтандартногоВремени() для московского часового пояса возвращает четыре часа вместо трёх.

    Reply
  3. palagutin.as

    Всем привет! Подскажите кто сможет или знает про оперативное проведение в разных часовых поясах…

    Сервер 1с (8.3.7.2008, УПП 1.3.79.2) запущен во Владивостоке, пользователи работают через РДП (Srv2008r2, толстый клиент 1с) в Москве, оперативное проведение документов работает отлично!

    Но переустановив Терминальный Сервер на 2012r2 (политику проброса часового пояса настроил), оперативное проведение стало выдавать ошибку — «Дата документа не соответствует текущей дате или дате последнего оперативно проведенного документа! Документ не может быть проведен оперативно.» в тот момент, когда в Москве пробило 17:00 а во Владивостоке настал новый день!

    Какая зависимость может быть в сервере, если на старом терминальном сервере оперативное проведение работает до сих пор а заходим на новый сервер терминалов, 1с выдает ошибку, именно после 17:00?

    Reply
  4. berezdetsky

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *