При разработке интеграционных решений на базе платформы 1С часто возникают ситуации, когда данные, передаваемые в формате JSON или XML, меняют свое представление на стороне сервера. Одной из самых частых проблем является «самопроизвольное» изменение формата даты: например, переход с 24-часового на 12-часовой формат (AM/PM). Давайте разберемся, почему это происходит и как жестко зафиксировать формат даты в ваших Web-сервисах.
Важно понимать фундаментальное отличие между данными и их представлением. Внутри платформы 1С тип Дата — это строго определенная структура, которая хранит календарную дату и время с точностью до секунды. Она не «знает» о форматах «ДД.ММ.ГГГГ» или «ЧЧ:ММ:СС». Все, что мы видим в консоли, в отладчике или в теле ответа JSON — это строковое представление объекта Дата. Преобразование типа Дата в Строка происходит автоматически, исходя из региональных настроек текущего сеанса (сеанса пользователя, под которым работает сервер приложений).
Если вы отправляете запрос в Postman и получаете ответ с датой в 12-часовом формате, это почти всегда указывает на региональные установки компьютера (сервера), на котором выполняется код 1С. Если на сервере в региональных настройках системы выбран формат времени с использованием AM/PM, то любые автоматические методы сериализации будут приводить даты именно к такому виду.
Рассмотрим, как обычно происходит ошибка в коде при разборе параметров:
НачалоПериодаСтрока = СоответствиеJSON.Получить("from");
КонецПериодаСтрока = СоответствиеJSON.Получить("to");
// Автоматическое приведение строки к дате может зависеть от локали сервера
НачалоПериода = НачалоДня(Дата(СтрЗаменить(НачалоПериодаСтрока,"-","")));
КонецПериода = КонецДня(Дата(СтрЗаменить(КонецПериодаСтрока,"-","")));
Проблема заключается в том, что доверяя автоматике, мы становимся заложниками настроек операционной системы сервера. Когда мы формируем ответный JSON, сериализатор снова обращается к системным установкам для отображения даты.
Чтобы исключить зависимость от настроек сервера и обеспечить предсказуемый формат данных, нам необходимо использовать функцию Формат(). Она позволяет задать жесткую маску, которая будет игнорировать настройки локали.
Для Web-сервисов и API стандартом де-факто является формат ISO 8601 (ГГГГ-ММ-ДДTЧЧ:ММ:СС). При формировании ответа всегда приводите даты к этому виду. Для этого в 1С предусмотрена строка формата "ДФ=yyyy-MM-ddTHH:mm:ss".
Вместо того чтобы просто передавать объект Дата в структуру, которую затем сериализует ЗаписьJSON или СериализаторXDTO, сформируйте строку даты вручную:
// Пример принудительного форматирования даты для ответа
ДатаДляОтвета = ТекущаяДата();
СтрокаДляJSON = Формат(ДатаДляОтвета, "ДФ=yyyy-MM-ddTHH:mm:ss");
При разборе входящих данных также рекомендуется не полагаться на простой вызов Дата(), если формат входной строки может варьироваться. Разбирайте строку на части (год, месяц, день, часы, минуты) и конструируйте объект Дата с помощью конструктора Дата(Год, Месяц, День, Час, Минута, Секунда). Это гарантирует, что вы получите объект Дата, соответствующий вашим ожиданиям, а не зависящий от того, как сервер «понял» входную строку.
USR1CV8 (или тот, под которым запущен процесс) имеет настройки формата даты с 24-часовым временем. Это быстрое «косметическое» решение.Формат(): Это самый надежный способ. Он делает ваш код переносимым: неважно, на какой сервер будет перенесена база, формат даты в JSON-ответах останется неизменным.Таким образом, мы исключаем неопределенность, связанную с «окружением» сервера, и берем процесс сериализации данных под полный программный контроль. Это сделает ваш Web-сервис стабильным и независимым от настроек операционной системы.