Какой формат даты использовать при отправке XML-запроса в Java-систему?

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

При интеграции 1С с внешними веб-сервисами, написанными на Java (например, портал государственных закупок РК или ИС ЭСФ), разработчики часто сталкиваются с ошибкой Unmarshalling Error: java.text.ParseException. Эта ошибка означает, что принимающая сторона не может распознать строку даты, которую вы передаете в XML-пакете. Даже если в документации указан стандартный тип string или dateTime, внутренняя реализация на стороне сервера может требовать строго определенную маску.

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

Выясняем причину ошибки: Особенности Java SimpleDateFormat

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

  1. Разделитель часового пояса: Символ Z в маске формата Java ожидает часовой пояс без двоеточия (например, +0500), в то время как символ X или стандарты ISO часто требуют двоеточие (+05:00). Если сервер настроен на Z, а 1С отправляет +05:00, произойдет ошибка парсинга.
  2. Миллисекунды: Многие системы ожидают обязательное наличие миллисекунд после точки (.000).
  3. Разделитель 'T': Стандарт XML требует букву T между датой и временем. Однако некоторые обработчики требуют её экранирования или, наоборот, не воспринимают её, если она не предусмотрена конкретной маской yyyy-MM-dd'T'HH:mm:ss.

Шаг 1: Эмпирический подбор формата

Если документация сервиса (например, для метода queryAwp) не дает точного ответа, рассмотрим наиболее вероятные варианты, которые стоит попробовать по очереди:

Шаг 2: Использование эталонного ответа сервиса

Проанализируем самый надежный способ узнать нужный формат. Как правило, API содержит методы не только для отправки (query...), но и для получения данных (например, queryViewAwp). Выясним формат даты следующим образом:

  1. Вызовем метод получения данных, который возвращает существующие объекты из системы.
  2. Перехватим "сырой" (raw) XML-ответ сервера с помощью отладчика или инструментов логирования (например, Fiddler).
  3. Найдем в ответе поля с датами.

Важный вывод: В 99% случаев формат, в котором сервис отдает данные, является единственно верным форматом, который он готов принять на вход.

Шаг 3: Реализация формирования даты в 1С

Стандартный механизм 1С при использовании ЗаписьXML.ЗаписатьДату() может автоматически подставлять формат, который не подходит серверу. Если нам нужно передать специфическую строку, проанализируем, как это сделать правильно. Мы должны передавать дату как строку, чтобы полностью контролировать её вид.

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


Функция СформироватьДатуДляСервиса(Знач ИсходнаяДата) Экспорт
    // Предположим, нам нужен формат yyyy-MM-dd'T'HH:mm:ss.SSS+0500
    СтрокаДаты = Формат(ИсходнаяДата, "ДФ=yyyy-MM-dd") + "T" + Формат(ИсходнаяДата, "ДФ=HH:mm:ss") + ".000+0500";
    Возврат СтрокаДаты;
КонецФункции

При записи в XML используем следующий подход:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("dateFrom");
// Записываем дату как текст, а не как тип Дата
ЗаписьXML.ЗаписатьТекст(СформироватьДатуДляСервиса(ТекущаяДата())); 
ЗаписьXML.ЗаписатьКонецЭлемента();

Шаг 4: Учет изменения часовых поясов

Проанализируем ситуацию с часовыми поясами, особенно для систем Республики Казахстан. С 1 марта 2024 года в РК введен единый часовой пояс UTC+5. Если вы используете в запросе старое смещение +06:00, сервер, уже переведенный на новую логику, может отклонить запрос с ошибкой ParseException, так как время и пояс не будут соответствовать внутренним правилам валидации календаря.

Совет: Всегда проверяйте актуальное смещение времени на сервере и используйте его в строке формирования даты.

Резюме решения

Если вы получаете ошибку парсинга даты в Java-системе, выполните следующие действия:

  1. Попробуйте добавить или убрать миллисекунды (.000).
  2. Уберите двоеточие из часового пояса (замените +05:00 на +0500).
  3. Проверьте ответ сервиса через методы просмотра (View) и скопируйте формат оттуда "один в один".
  4. Формируйте строку даты вручную через Формат() и записывайте её в XML через ЗаписатьТекст(), чтобы избежать автоматических преобразований платформы 1С.
← На главную