При интеграции 1С с внешними системами, веб-сервисами или при работе с API сторонних ресурсов, разработчики часто сталкиваются с необходимостью передачи даты в международном стандарте ISO 8601. Этот формат имеет строгую структуру (например, 2023-10-27T10:00:00), и малейшее отклонение в символах может привести к ошибке на стороне принимающей системы. В рамках данной статьи мы разберем различные подходы к формированию и чтению такой даты, проанализируем нюансы использования форматных строк и встроенных механизмов платформы.
Самый гибкий, но требующий внимательности способ — использование функции Формат(). Рассмотрим ситуацию: нам нужно получить строку вида ГГГГ-ММ-ДДTЧЧ:ММ:СС. Часто начинающие разработчики совершают ошибку, забывая, что символ "T" является разделителем даты и времени в стандарте ISO, и 1С может воспринять его как управляющий символ, если не экранировать его должным образом.
Разберем правильный пример формирования форматной строки:
// Пример формирования даты в формате ISO 8601
ТекущийМомент = ТекущаяДата();
// Экранируем символ T одинарными кавычками внутри форматной строки
ДатаISO = Формат(ТекущийМомент, "ДФ=""гггг-ММ-дд'T'ЧЧ:мм:сс""");
Сообщить(ДатаISO); // Результат: 2023-10-27T15:30:45
Важно помнить, что использование ДЛФ=T (локальный формат времени) в функции Формат() может не дать желаемого результата, так как этот параметр зависит от региональных настроек операционной системы. Для строгого соответствия стандарту ISO 8601 всегда рекомендуется использовать явное описание шаблона гггг-ММ-дд.
В платформе 1С существуют встроенные функции для сериализации данных в формат XML — это упрощает настройку обмена данными через веб-сервисы. Поскольку стандарты XML базируются на ISO 8601, функция XMLСтрока() идеально подходит для быстрого преобразования даты. Проанализируем этот метод:
// Преобразование даты через встроенный механизм XML
ДатаДляВыгрузки = ТекущаяДата();
СтрокаISO = XMLСтрока(ДатаДляВыгрузки);
// На выходе получаем: 2023-10-27T15:30:45
Этот способ является предпочтительным, если вам нужен стандартный расширенный формат ISO 8601 без миллисекунд и без указания часового пояса (или если время уже приведено к нужному вам поясу). Однако стоит учитывать, что XMLСтрока() работает по жестко заданному алгоритму и не позволяет менять разделители.
Современные стандарты разработки требуют учета часовых поясов (смещение относительно 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 в конце строки.
Часто возникает обратная задача: получить объект типа Дата из пришедшей строки. Рассмотрим два варианта: "ручной" разбор и использование системных функций.
Вариант А: Использование XMLЗначение. Это самый надежный способ, так как он устойчив к наличию или отсутствию миллисекунд в строке. Выясним, как это работает:
СтрокаОтСервера = "2023-10-27T15:30:45.123Z";
// Система сама обрежет миллисекунды и корректно создаст дату
ДатаРезультат = XMLЗначение(Тип("Дата"), СтрокаОтСервера);
Вариант Б: Ручной разбор строки. Если по каким-то причинам стандартные функции недоступны или формат строки слегка отклоняется от стандарта, можно воспользоваться функциями работы со строками. Посмотрим на алгоритм очистки строки для конструктора Дата(), который требует формат ГГГГММДДЧЧММСС:
// Очистка строки ISO от лишних разделителей
ДатаСтрокой = "2023-10-27T15:30:45";
ЧистаяСтрока = СтрЗаменить(ДатаСтрокой, "-", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, "T", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ":", "");
ЧистаяСтрока = Лев(ЧистаяСтрока, 14); // Берем первые 14 знаков
Попытка
ОбработаннаяДата = Дата(ЧистаяСтрока);
Исключение
Сообщить("Неверный формат строки даты!");
КонецПопытки;
Для работы с форматом ISO 8601 в 1С мы рекомендуем придерживаться следующей логики:
XMLСтрока().ЗаписатьДатуJSON().Формат() с явным указанием маски yyyyMMddTHHmmss.XMLЗначение() или ПрочитатьДатуJSON(), так как они автоматически обрабатывают различные вариации стандарта ISO.Выбор правильного метода обеспечит стабильную работу ваших интеграций и избавит от ошибок при парсинге дат на стороне внешних информационных систем.