Как вывести и преобразовать дату в формате ISO 8601 в 1С:Предприятие

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

При интеграции 1С с внешними системами, веб-сервисами или при работе с API сторонних ресурсов, разработчики часто сталкиваются с необходимостью передачи даты в международном стандарте ISO 8601. Этот формат имеет строгую структуру (например, 2023-10-27T10:00:00), и малейшее отклонение в символах может привести к ошибке на стороне принимающей системы. В рамках данной статьи мы разберем различные подходы к формированию и чтению такой даты, проанализируем нюансы использования форматных строк и встроенных механизмов платформы.

Метод 1. Использование форматной строки (Функция Формат)

Самый гибкий, но требующий внимательности способ — использование функции Формат(). Рассмотрим ситуацию: нам нужно получить строку вида ГГГГ-ММ-ДДTЧЧ:ММ:СС. Часто начинающие разработчики совершают ошибку, забывая, что символ "T" является разделителем даты и времени в стандарте ISO, и 1С может воспринять его как управляющий символ, если не экранировать его должным образом.

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


// Пример формирования даты в формате ISO 8601
ТекущийМомент = ТекущаяДата();
// Экранируем символ T одинарными кавычками внутри форматной строки
ДатаISO = Формат(ТекущийМомент, "ДФ=""гггг-ММ-дд'T'ЧЧ:мм:сс""");
Сообщить(ДатаISO); // Результат: 2023-10-27T15:30:45

Важно помнить, что использование ДЛФ=T (локальный формат времени) в функции Формат() может не дать желаемого результата, так как этот параметр зависит от региональных настроек операционной системы. Для строгого соответствия стандарту ISO 8601 всегда рекомендуется использовать явное описание шаблона гггг-ММ-дд.

Метод 2. Использование механизмов XML (Самый быстрый способ)

В платформе 1С существуют встроенные функции для сериализации данных в формат XML — это упрощает настройку обмена данными через веб-сервисы. Поскольку стандарты XML базируются на ISO 8601, функция XMLСтрока() идеально подходит для быстрого преобразования даты. Проанализируем этот метод:


// Преобразование даты через встроенный механизм XML
ДатаДляВыгрузки = ТекущаяДата();
СтрокаISO = XMLСтрока(ДатаДляВыгрузки);
// На выходе получаем: 2023-10-27T15:30:45

Этот способ является предпочтительным, если вам нужен стандартный расширенный формат ISO 8601 без миллисекунд и без указания часового пояса (или если время уже приведено к нужному вам поясу). Однако стоит учитывать, что XMLСтрока() работает по жестко заданному алгоритму и не позволяет менять разделители.

Метод 3. Работа с JSON и учет часовых поясов

Современные стандарты разработки требуют учета часовых поясов (смещение относительно UTC). В стандарте ISO 8601 это реализуется добавлением суффикса Z (для UTC) или указанием смещения (например, +03:00). Для этих целей лучше всего подходит метод ЗаписатьДатуJSON() (удобнее через автоматическую выгрузку данных из 1С через REST API). Рассмотрим пример:


// Использование специализированного метода для JSON
Запись = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,,, ЭлементыСоставаОбъектовJSON.Безусловный);
Запись.УстановитьСтроку(ПараметрыЗаписи);

// Записываем дату с учетом локального смещения
ЗаписатьДатуJSON(Запись, ТекущаяДата(), ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением);

Результат = Запись.Закрыть();
Сообщить(Результат); // Результат: "2023-10-27T15:30:45+03:00"

Если же внешняя система требует время исключительно в формате UTC (Universal Time Coordinated), мы можем использовать параметр ВариантЗаписиДатыJSON.УниверсальнаяДата. В этом случае 1С автоматически приведет локальное время сеанса к универсальному и добавит символ Z в конце строки.

Метод 4. Обратное преобразование (из строки ISO в Дату 1С)

Часто возникает обратная задача: получить объект типа Дата из пришедшей строки. Рассмотрим два варианта: "ручной" разбор и использование системных функций.

Вариант А: Использование XMLЗначение. Это самый надежный способ, так как он устойчив к наличию или отсутствию миллисекунд в строке. Выясним, как это работает:


СтрокаОтСервера = "2023-10-27T15:30:45.123Z";
// Система сама обрежет миллисекунды и корректно создаст дату
ДатаРезультат = XMLЗначение(Тип("Дата"), СтрокаОтСервера);

Вариант Б: Ручной разбор строки. Если по каким-то причинам стандартные функции недоступны или формат строки слегка отклоняется от стандарта, можно воспользоваться функциями работы со строками. Посмотрим на алгоритм очистки строки для конструктора Дата(), который требует формат ГГГГММДДЧЧММСС:


// Очистка строки ISO от лишних разделителей
ДатаСтрокой = "2023-10-27T15:30:45";
ЧистаяСтрока = СтрЗаменить(ДатаСтрокой, "-", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, "T", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ":", "");
ЧистаяСтрока = Лев(ЧистаяСтрока, 14); // Берем первые 14 знаков

Попытка
    ОбработаннаяДата = Дата(ЧистаяСтрока);
Исключение
    Сообщить("Неверный формат строки даты!");
КонецПопытки;

Подведем итоги

Для работы с форматом ISO 8601 в 1С мы рекомендуем придерживаться следующей логики:

  1. Если нужна простая сериализация для внутреннего использования или простых XML-обменов — используйте XMLСтрока().
  2. Если требуется передача в Web-API с учетом часовых поясов или миллисекунд — используйте ЗаписатьДатуJSON().
  3. Если нужно нестандартное форматирование (например, Basic Format без дефисов) — применяйте Формат() с явным указанием маски yyyyMMddTHHmmss.
  4. При чтении данных всегда отдавайте предпочтение функции XMLЗначение() или ПрочитатьДатуJSON(), так как они автоматически обрабатывают различные вариации стандарта ISO.

Выбор правильного метода обеспечит стабильную работу ваших интеграций и избавит от ошибок при парсинге дат на стороне внешних информационных систем.

← На главную