Почему при обмене через Web-сервис в 1С меняется формат даты и как это исправить?

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

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

Понимание природы типа данных «Дата» в 1С

Важно понимать фундаментальное отличие между данными и их представлением. Внутри платформы 1С тип Дата — это строго определенная структура, которая хранит календарную дату и время с точностью до секунды. Она не «знает» о форматах «ДД.ММ.ГГГГ» или «ЧЧ:ММ:СС». Все, что мы видим в консоли, в отладчике или в теле ответа JSON — это строковое представление объекта Дата. Преобразование типа Дата в Строка происходит автоматически, исходя из региональных настроек текущего сеанса (сеанса пользователя, под которым работает сервер приложений).

Выясняем причины проблемы

Если вы отправляете запрос в Postman и получаете ответ с датой в 12-часовом формате, это почти всегда указывает на региональные установки компьютера (сервера), на котором выполняется код 1С. Если на сервере в региональных настройках системы выбран формат времени с использованием AM/PM, то любые автоматические методы сериализации будут приводить даты именно к такому виду.

Рассмотрим, как обычно происходит ошибка в коде при разборе параметров:


НачалоПериодаСтрока = СоответствиеJSON.Получить("from");
КонецПериодаСтрока  = СоответствиеJSON.Получить("to");
// Автоматическое приведение строки к дате может зависеть от локали сервера
НачалоПериода = НачалоДня(Дата(СтрЗаменить(НачалоПериодаСтрока,"-","")));
КонецПериода  = КонецДня(Дата(СтрЗаменить(КонецПериодаСтрока,"-","")));

Проблема заключается в том, что доверяя автоматике, мы становимся заложниками настроек операционной системы сервера. Когда мы формируем ответный JSON, сериализатор снова обращается к системным установкам для отображения даты.

Решение проблемы: принудительное форматирование

Чтобы исключить зависимость от настроек сервера и обеспечить предсказуемый формат данных, нам необходимо использовать функцию Формат(). Она позволяет задать жесткую маску, которая будет игнорировать настройки локали.

Шаг 1: Используйте стандарт ISO 8601

Для Web-сервисов и API стандартом де-факто является формат ISO 8601 (ГГГГ-ММ-ДДTЧЧ:ММ:СС). При формировании ответа всегда приводите даты к этому виду. Для этого в 1С предусмотрена строка формата "ДФ=yyyy-MM-ddTHH:mm:ss".

Шаг 2: Реализация на стороне сервера

Вместо того чтобы просто передавать объект Дата в структуру, которую затем сериализует ЗаписьJSON или СериализаторXDTO, сформируйте строку даты вручную:


// Пример принудительного форматирования даты для ответа
ДатаДляОтвета = ТекущаяДата();
СтрокаДляJSON = Формат(ДатаДляОтвета, "ДФ=yyyy-MM-ddTHH:mm:ss");

Шаг 3: Контроль при получении данных

При разборе входящих данных также рекомендуется не полагаться на простой вызов Дата(), если формат входной строки может варьироваться. Разбирайте строку на части (год, месяц, день, часы, минуты) и конструируйте объект Дата с помощью конструктора Дата(Год, Месяц, День, Час, Минута, Секунда). Это гарантирует, что вы получите объект Дата, соответствующий вашим ожиданиям, а не зависящий от того, как сервер «понял» входную строку.

Итоги и рекомендации

  1. Проверьте региональные настройки сервера: Убедитесь, что пользователь USR1CV8 (или тот, под которым запущен процесс) имеет настройки формата даты с 24-часовым временем. Это быстрое «косметическое» решение.
  2. Используйте функцию Формат(): Это самый надежный способ. Он делает ваш код переносимым: неважно, на какой сервер будет перенесена база, формат даты в JSON-ответах останется неизменным.
  3. Избегайте неявной типизации: Старайтесь работать с датами как с объектами до самого последнего момента, а при выводе в API всегда явно конвертируйте их в строку с заданной маской.

Таким образом, мы исключаем неопределенность, связанную с «окружением» сервера, и берем процесс сериализации данных под полный программный контроль. Это сделает ваш Web-сервис стабильным и независимым от настроек операционной системы.

← На главную