Почему 1С получает время в 12-часовом формате через HTTP-запрос и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с загадочным поведением: один и тот же GET-запрос в браузере возвращает корректное время в 24-часовом формате, а внутри 1С данные внезапно превращаются в 12-часовой формат (с AM/PM). Это может привести к ошибкам в расчетах, путанице в логах и сбоям при записи дат в информационную базу. Давайте вместе разберем, почему так происходит, и найдем надежные способы решения этой задачи.

Выясняем причину: почему формат данных меняется?

Первым делом проанализируем ситуацию. Если сервер отдает JSON-пакет, то в нем дата и время передаются в виде обычной строки. Однако 1С при использовании встроенных средств разбора, таких как ПрочитатьJSON(), пытается быть «умной» и автоматически преобразует строковые значения в объект типа Дата. В этот момент и кроется главная проблема.

Рассмотрим основные факторы влияния:

  1. Системные библиотеки Windows: 1С:Предприятие для работы с HTTP-протоколом использует системные библиотеки (WinHTTP или WinInet). Эти библиотеки тесно интегрированы с региональными стандартами операционной системы.
  2. Региональные настройки сервера: Если сервер 1С работает под управлением Windows, формат даты и времени определяется настройками конкретного пользователя. Чаще всего служба 1С запущена от имени системной учетной записи (например, USR1CV8), у которой по умолчанию могут быть установлены американские стандарты (EN-US) с 12-часовым форматом.
  3. Автоматический парсинг: Метод ПрочитатьJSON() при обнаружении строки, похожей на дату, применяет к ней правила локализации текущего сеанса ОС, что и приводит к искажению.

Способ 1: Настройка региональных стандартов ОС

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

Проанализируем шаги в Windows Server:

  1. Зайдите в «Панель управления» — «Региональные стандарты».
  2. Установите формат времени H:mm:ss (где заглавная «H» означает 24-часовой формат).
  3. Перейдите на вкладку «Дополнительно» и нажмите кнопку «Копировать параметры».
  4. Установите галочку «Экран приветствия и системные учетные записи». Это критически важно, так как именно это действие применит настройки для пользователя, под которым работает агент сервера 1С.
  5. Перезапустите службу «Агент сервера 1С:Предприятия».

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

Способ 2: Использование функции восстановления при чтении JSON

Чтобы 1С не пыталась самостоятельно угадать формат даты и не портила данные, мы можем управлять процессом десериализации. В методе ПрочитатьJSON() существует параметр ФункцияВосстановления. Разберем, как это работает на примере.

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


// Функция-обработчик для правильного чтения даты
Функция ПреобразоватьДатуJSON(Ключ, Значение, ДополнительныеПараметры) Экспорт
    // Если поле похоже на дату, мы можем обработать его вручную
    // или оставить как строку, чтобы избежать искажения
    Если ТипЗнч(Значение) = Тип("Строка") И СтрДлина(Значение) > 10 Тогда
        // Здесь можно реализовать свою логику парсинга строки в дату
        // Для примера просто возвращаем строку как есть
        Возврат Значение; 
    КонецЕсли;
    
    Возврат Значение;
КонецФункции

// Основной код вызова
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстОтветаJSON);
Результат = ПрочитатьJSON(Чтение, Ложь, "ПреобразоватьДатуJSON", ЭтотОбъект);
Чтение.Закрыть();

Используя такой подход, мы получаем «сырые» данные. Даже если в системе стоит 12-часовой формат, внутри функции ПреобразоватьДатуJSON мы увидим оригинальную строку, присланную сервером.

Способ 3: Получение тела ответа как строки

Еще один надежный вариант — полностью отказаться от автоматических преобразований на этапе получения данных. Вместо того чтобы сразу скармливать ответ парсеру, сначала прочитаем его как обычный текст. Выясним причину искажения: если в текстовом ответе время уже 12-часовое, значит, проблема в заголовках запроса или самом сервере.

Рассмотрим по шагам работу с объектом HTTPОтвет:


Соединение = Новый HTTPСоединение("api.service.com",,,,, 30, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/data");
// Рекомендуется явно указывать User-Agent, чтобы сервер не принимал 1С за старый браузер
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    // Получаем именно строку, а не поток
    ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
    
    // Теперь мы можем безопасно искать в строке нужные фрагменты
    // или использовать ЧтениеJSON с отключенным распознаванием дат
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТекстОтвета);
    // Параметр ИменаСвойствДляЧтенияДаты позволяет явно указать, 
    // какие поля НЕ нужно конвертировать автоматически
    Данные = ПрочитатьJSON(Чтение, Ложь); 
    Чтение.Закрыть();
КонецЕсли;

Подмена заголовка User-Agent

Иногда веб-серверы ведут себя слишком «интеллектуально». Проанализируем ситуацию: если сервер видит в заголовках User-Agent: 1C+Enterprise/8.3, он может решить, что клиент — старое приложение, и попытаться локализовать данные под него. Чтобы исключить эту вероятность, всегда подставляйте заголовок современного браузера, как показано в примере выше. Это заставит сервер отдавать данные в стандартном виде (обычно это ISO 8601).

Резюме и рекомендации

Подведем итоги нашего исследования. Если вы столкнулись с проблемой 12-часового формата времени в 1С при GET-запросах:

  1. Проверьте настройки системной учетной записи на сервере 1С. Помните, что ваши личные настройки рабочего стола не влияют на работу службы.
  2. Избегайте автоматического преобразования дат в методе ПрочитатьJSON(). Лучше получить строку и разобрать её самостоятельно с помощью функций Дата() или Сред().
  3. Используйте современные заголовки HTTP. Установка User-Agent часто решает проблемы с неверной кодировкой или локализацией ответа сервера.
  4. Работайте с ISO 8601. Старайтесь договориться с разработчиками API, чтобы данные передавались в формате YYYY-MM-DDTHH:mm:ss. Этот формат понимается всеми системами однозначно, независимо от настроек Windows.

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

← На главную