При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с загадочным поведением: один и тот же GET-запрос в браузере возвращает корректное время в 24-часовом формате, а внутри 1С данные внезапно превращаются в 12-часовой формат (с AM/PM). Это может привести к ошибкам в расчетах, путанице в логах и сбоям при записи дат в информационную базу. Давайте вместе разберем, почему так происходит, и найдем надежные способы решения этой задачи.
Первым делом проанализируем ситуацию. Если сервер отдает JSON-пакет, то в нем дата и время передаются в виде обычной строки. Однако 1С при использовании встроенных средств разбора, таких как ПрочитатьJSON(), пытается быть «умной» и автоматически преобразует строковые значения в объект типа Дата. В этот момент и кроется главная проблема.
Рассмотрим основные факторы влияния:
USR1CV8), у которой по умолчанию могут быть установлены американские стандарты (EN-US) с 12-часовым форматом.ПрочитатьJSON() при обнаружении строки, похожей на дату, применяет к ней правила локализации текущего сеанса ОС, что и приводит к искажению.Если мы выяснили, что 1С берет настройки из системы, логично попробовать изменить их там. Однако просто поменять формат времени в панели управления под администратором недостаточно. Рассмотрим подробнее, как применить настройки для службы 1С.
Проанализируем шаги в Windows Server:
H:mm:ss (где заглавная «H» означает 24-часовой формат).Важное замечание: Этот метод может быть опасен, если на сервере работают другие приложения, завязанные на текущий формат даты. Поэтому рассмотрим более гибкие программные методы.
Чтобы 1С не пыталась самостоятельно угадать формат даты и не портила данные, мы можем управлять процессом десериализации. В методе ПрочитатьJSON() существует параметр ФункцияВосстановления. Разберем, как это работает на примере.
Посмотрим на пример кода, который позволяет перехватить значение до его преобразования:
// Функция-обработчик для правильного чтения даты
Функция ПреобразоватьДатуJSON(Ключ, Значение, ДополнительныеПараметры) Экспорт
// Если поле похоже на дату, мы можем обработать его вручную
// или оставить как строку, чтобы избежать искажения
Если ТипЗнч(Значение) = Тип("Строка") И СтрДлина(Значение) > 10 Тогда
// Здесь можно реализовать свою логику парсинга строки в дату
// Для примера просто возвращаем строку как есть
Возврат Значение;
КонецЕсли;
Возврат Значение;
КонецФункции
// Основной код вызова
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстОтветаJSON);
Результат = ПрочитатьJSON(Чтение, Ложь, "ПреобразоватьДатуJSON", ЭтотОбъект);
Чтение.Закрыть();
Используя такой подход, мы получаем «сырые» данные. Даже если в системе стоит 12-часовой формат, внутри функции ПреобразоватьДатуJSON мы увидим оригинальную строку, присланную сервером.
Еще один надежный вариант — полностью отказаться от автоматических преобразований на этапе получения данных. Вместо того чтобы сразу скармливать ответ парсеру, сначала прочитаем его как обычный текст. Выясним причину искажения: если в текстовом ответе время уже 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: 1C+Enterprise/8.3, он может решить, что клиент — старое приложение, и попытаться локализовать данные под него. Чтобы исключить эту вероятность, всегда подставляйте заголовок современного браузера, как показано в примере выше. Это заставит сервер отдавать данные в стандартном виде (обычно это ISO 8601).
Подведем итоги нашего исследования. Если вы столкнулись с проблемой 12-часового формата времени в 1С при GET-запросах:
ПрочитатьJSON(). Лучше получить строку и разобрать её самостоятельно с помощью функций Дата() или Сред().User-Agent часто решает проблемы с неверной кодировкой или локализацией ответа сервера.YYYY-MM-DDTHH:mm:ss. Этот формат понимается всеми системами однозначно, независимо от настроек Windows.Таким образом, мы выяснили, что проблема не в самом GET-запросе, а в том, как платформа 1С интерпретирует полученный результат, опираясь на настройки ОС. Используя ручной разбор JSON или корректировку системных профилей, вы сможете гарантировать точность данных в вашей системе.