Почему веб-сервис 1С отдает даты в 12-часовом формате только ночью?

Системный администратор
← На главную

Мы сталкиваемся с интересной и специфической проблемой: веб-сервис, опубликованный на платформе 1С:Предприятие 8.2 (версия 8.2.19.130), в определенное ночное время (приблизительно с 2:00 до 3:30 по МСК) начинает отдавать даты в 12-часовом формате с использованием AM/PM и слешей в качестве разделителей, тогда как в остальное время суток он функционирует абсолютно корректно, используя 24-часовой формат с точками. При этом исходный код веб-сервиса остается неизменным, а операционная система сервера и веб-сервер (Apache) настроены на работу с 24-часовым форматом. Давайте вместе проанализируем эту ситуацию и найдем возможное решение.

Разбираем проблему: Непостоянство формата даты

Представьте, что вы запрашиваете данные из 1С через веб-сервис. В течение дня вы получаете дату в привычном формате, например, 31.12.2023 14:30:00. Но как только наступает ночь, приблизительно с 2:00 до 3:30, тот же самый запрос возвращает дату в виде 12/31/2023 02:30:00 AM. Это указывает на смену региональных настроек или локали, которая влияет на форматирование даты и времени. Факт, что изменение происходит в конкретный временной интервал, является ключевой подсказкой.

Главная гипотеза: Кластер серверов и региональные настройки

Одним из самых вероятных источников такой проблемы является использование кластера серверов 1С:Предприятия. Рассмотрим, как кластер может влиять на формат данных, отдаваемых веб-сервисом.

  1. Распределение нагрузки в кластере: В кластере серверов 1С за распределение нагрузки и выполнение инструкций отвечает управляющий кластера. Он определяет, на каком из рабочих процессов rphost (на каком физическом сервере в составе кластера) будет выполнена конкретная операция. Это означает, что последовательные запросы к вашему веб-сервису могут быть обработаны совершенно разными серверами в кластере.

  2. Различия в региональных настройках: Если один или несколько серверов в вашем кластере имеют отличные от остальных региональные настройки операционной системы (локаль), это может привести к непоследовательному форматированию данных. Например, на основном сервере, который обрабатывает большую часть дневных запросов, может быть установлена русская локаль с 24-часовым форматом. А на другом сервере, который подключается к работе ночью, могут быть настроены американские региональные стандарты, использующие 12-часовой формат с AM/PM и слешами.

  3. Почему ночью? Изменение формата именно в ночное время суток не случайно. Существует несколько причин, по которым кластер может перенаправлять запросы на другой сервер в это время:

    • Регламентные задания: Ночью часто запускаются объемные регламентные задания (пересчеты, закрытие периодов, архивации). Эти задачи могут сильно загружать основной сервер, на котором обычно обрабатываются запросы веб-сервиса. Кластер, стремясь обеспечить стабильность работы, перенаправляет остальные запросы (в том числе от вашего веб-сервиса) на менее загруженный сервер.
    • Синхронизация или обслуживание: В ночное время могут проводиться процедуры синхронизации данных между узлами кластера, резервного копирования или другие виды обслуживания, которые временно изменяют приоритеты или доступность серверов.
    • Смена суток по Гринвичу (UTC): Упоминание 3:24 по МСК, когда формат становится корректным, может косвенно указывать на начало нового дня по Гринвичу (UTC), которое совпадает с этим временем в определенном часовом поясе. Это может быть связано с каким-либо сбросом или активацией настроек, привязанных к UTC.

Шаги по диагностике и устранению проблемы

Для решения этой проблемы мы должны провести тщательный аудит настроек на всех серверах, входящих в кластер 1С, а также на веб-сервере (Apache/IIS).

1. Проверка региональных настроек на серверах кластера 1С

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

  1. Открытие региональных стандартов: На каждом сервере кластера откройте Панель управления -> Региональные стандарты (или Параметры -> Время и язык -> Регион в современных версиях Windows Server).

  2. Формат даты и времени: На вкладке "Форматы" или в разделе "Региональный формат" убедитесь, что выбрана нужная локаль (например, "Русский (Россия)") и что формат даты и времени соответствует 24-часовому формату. Обратите внимание на разделители и отсутствие индикаторов AM/PM в примерах форматов.

  3. Дополнительные параметры: Перейдите в "Дополнительные параметры" или "Изменение форматов даты, времени и чисел". Здесь проверьте настройки для всех типов данных (дата, время, числа), убедитесь, что короткий и полный форматы времени используют "ЧЧ" для часов (24-часовой формат) и не содержат "tt" (индикатор AM/PM).

  4. Язык для программ, не поддерживающих Юникод: На вкладке "Дополнительно" или в разделе "Административные языковые параметры" проверьте параметр "Язык для программ, не поддерживающих Юникод". Он должен быть одинаковым на всех серверах и соответствовать требуемой локали (например, "Русский (Россия)"). Это критично для многих старых приложений и служб.

  5. Настройки часового пояса: Убедитесь, что часовые пояса на всех серверах кластера настроены идентично и корректно. Несоответствие часовых поясов может приводить к сбоям в работе регламентных заданий и некорректному отображению времени. Проверьте также флаг "Автоматический переход на летнее время и обратно" — его некорректная настройка может вызвать ошибки.

  6. Учетная запись службы 1С: Проверьте, под какой учетной записью запускается служба сервера 1С:Предприятия (1C:Enterprise 8.x Server Agent). Если это не стандартная Local System, а отдельный пользователь, необходимо убедиться, что для этого пользователя региональные настройки также корректны. Иногда системные настройки отличаются от настроек конкретного пользователя.

Важный момент: Мы должны добиться полной идентичности всех этих настроек на всех серверах, входящих в кластер 1С.

2. Проверка настроек веб-сервера (Apache/IIS)

Веб-сервер, через который опубликована база 1С, также имеет свои настройки локали, которые могут влиять на форматирование вывода.

  1. Для Apache: Если используется Apache на Linux, мы должны проверить конфигурационные файлы (например, httpd.conf или файлы в conf.d/) на предмет директив, связанных с локализацией. Иногда требуется явно установить локаль для Apache, например, используя переменные окружения или настройки в файле envvars. В случае проблем с отображением месяцев на английский язык, бывает полезно добавить параметры L=ru и VL=ru_RU в URL веб-клиента, но для веб-сервиса это обычно не применимо. Важно проверить, что системная локаль, под которой запускается Apache, настроена правильно.

  2. Для IIS (Internet Information Services): Если вы используете IIS на Windows Server, локаль веб-сервера обычно наследуется от операционной системы. Однако мы можем проверить настройки пула приложений, под которым работает публикация 1С. Убедитесь, что региональные настройки ОС, под которой работает IIS, соответствуют нашим требованиям.

3. Явное форматирование даты в коде веб-сервиса 1С

Если после проверки всех системных настроек проблема сохраняется, мы можем явно управлять форматом даты и времени в коде самого веб-сервиса 1С, используя функции платформы. Это гарантирует, что дата всегда будет выводиться в нужном формате, независимо от системных настроек сервера.

Для этого используется функция Формат(). Рассмотрим ее подробнее:

Функция Формат() позволяет задать строку формата, которая контролирует вывод даты и времени. Для 24-часового формата мы используем символы "ЧЧ" для часов и "мм" для минут. Например:


ДатаДляВывода = ТекущаяДата();
СтрокаФормата = "ДД.ММ.ГГГГ ЧЧ:мм:сс"; // 24-часовой формат

// Если хотим добавить милисекунды
// СтрокаФормата = "ДД.ММ.ГГГГ ЧЧ:мм:сс.zzz";

// Применяем форматирование
РезультатФорматирования = Формат(ДатаДляВывода, СтрокаФормата);

Если бы нам нужен был 12-часовой формат с AM/PM, мы бы использовали "чч" и "вв":


ДатаДляВывода = ТекущаяДата();
СтрокаФормата = "ММ/ДД/ГГГГ чч:мм:сс вв"; // 12-часовой формат с AM/PM
РезультатФорматирования = Формат(ДатаДляВывода, СтрокаФормата);

Мы должны убедиться, что в коде вашего веб-сервиса, где формируется строка даты для отдачи клиенту, используется именно нужный формат. Если явное форматирование отсутствует, 1С будет использовать формат по умолчанию, который зависит от региональных настроек сервера.

4. Работа с часовыми поясами в 1С

Хотя основная проблема связана с форматированием, не с самими значениями времени, важно помнить о функциях 1С для работы с часовыми поясами, особенно в контексте кластера:

  1. ТекущаяДата(): Возвращает текущую дату и время на сервере 1С. Это время может быть в часовом поясе сервера.

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

  3. УниверсальноеВремя(): Возвращает текущее время в формате UTC (Coordinated Universal Time). Это универсальная метка времени, не зависящая от конкретного часового пояса, и часто используется для хранения дат в базе данных, чтобы избежать проблем с переводом времени.

Для нашей задачи с форматированием даты, если мы работаем в серверном контексте, скорее всего, важно правильно форматировать дату, полученную от ТекущаяДата() или из базы данных, но с учетом локали сервера, которая должна быть согласована.

Дополнительные аспекты и возможные причины

  1. Службы, меняющие локаль: Как было упомянуто, мы должны проверить, нет ли на сервере каких-либо фоновых служб или скриптов, которые запускаются ночью и временно меняют системные настройки локали. Это менее вероятно, чем проблема с кластером, но возможно.

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

Заключение

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

← На главную