Как в 1С получить дату в формате строки ISO 8601 с разделителем T?

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

В процессе интеграции систем «1С:Предприятие» со сторонними веб-сервисами, API или при формировании файлов обмена данными (JSON, XML), разработчики часто сталкиваются с необходимостью представления даты в специфическом международном формате ISO 8601. Этот формат выглядит следующим образом: YYYY-MM-DDTHH:MM:SS. Основная сложность здесь заключается в наличии латинского символа T между датой и временем. В этой статье мы подробно разберем, как реализовать такое преобразование, проанализируем различные встроенные механизмы платформы и выясним, какой из них наиболее эффективен в различных ситуациях.

Способ 1. Использование функции XMLСтрока

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

Рассмотрим пример кода:


ТекущаяДатаОбмена = ТекущаяДата();
СтрокаISO = XMLСтрока(ТекущаяДатаОбмена);
// Результат будет выглядеть так: "2022-05-20T08:58:00"

Проанализируем преимущества и недостатки этого метода:

  1. Высокая скорость работы: Функция работает быстрее, чем универсальная функция Формат(), так как она узкоспециализирована.
  2. Автоматизация: Вам не нужно помнить правильную последовательность символов форматной строки.
  3. Особенность «пустого» времени: Важно учитывать, что если в переменной типа Дата время не заполнено (равно 00:00:00), функция XMLСтрока() может вернуть только дату в формате YYYY-MM-DD. Если принимающая сторона строго ожидает наличие времени и разделителя T, этот способ может потребовать дополнительной проверки.

Способ 2. Использование функции Формат с форматной строкой

Если нам нужен жесткий контроль над результатом или если XMLСтрока() не подходит из-за особенностей обработки времени, мы можем воспользоваться функцией Формат(). Рассмотрим, как правильно составить конструкцию ДФ (формат даты).

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

Пример правильного кода:


НужнаяДата = ТекущаяДата();
// Обратите внимание на использование ЧЧ для 24-часового формата
СтрокаФормата = "ДФ=yyyy-MM-dd'T'ЧЧ:mm:ss";
Результат = Формат(НужнаяДата, СтрокаФормата);

Важные замечания по синтаксису:

Способ 3. Сериализация в JSON

Если вашей конечной целью является формирование JSON-пакета, то наиболее современным и правильным подходом будет использование объекта ЗаписьJSON. Начиная с версии платформы 8.3.6, разработчики получили возможность гибко управлять форматом дат при сериализации.

Посмотрим на пример использования настроек записи:


Запись = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб);
Запись.УстановитьСтроку(ПараметрыЗаписи);

// Указываем вариант записи даты в формате ISO8601
ЗаписатьJSON(Запись, ТекущаяДата(), ВариантЗаписиДатыJSON.ISO8601);

РезультатСтрокой = Запись.Закрыть();

Выясним, чем этот метод лучше других. При использовании ВариантЗаписиДатыJSON.ISO8601 система сама заботится о правильном представлении даты. Если же вы используете ВариантЗаписиДатыJSON.UniversalDate, система добавит в конец символ Z, что будет означать время по Гринвичу (UTC). Это критически важно для международных интеграций.

Работа с универсальным временем (UTC)

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

Проанализируем следующий алгоритм:

  1. Получаем местную дату.
  2. Преобразуем её в универсальное время функцией УниверсальноеВремя().
  3. Форматируем результат.

Пример кода:


МестнаяДата = ТекущаяДата();
ДатаUTC = УниверсальноеВремя(МестнаяДата);
// Теперь форматируем
Результат = Формат(ДатаUTC, "ДФ=yyyy-MM-dd'T'ЧЧ:mm:ss") + "Z";

Обработка пустых значений

Выясним причину возможных ошибок при передаче данных. Если переменная с датой не заполнена, 1С хранит её как 01.01.0001 00:00:00. Функция XMLСтрока() вернет для такой даты значение 0001-01-01T00:00:00 или пустую строку, что может вызвать сбой в стороннем веб-сервисе.

Рекомендуем всегда добавлять проверку перед конвертацией:


Если ЗначениеЗаполнено(ДатаДляКонвертации) Тогда
    Результат = XMLСтрока(ДатаДляКонвертации);
Иначе
    Результат = ""; // Или другое значение по умолчанию, ожидаемое API
КонецЕсли;

Итоги

Мы разобрали три основных способа получения даты с разделителем T. Для простых задач идеально подходит XMLСтрока(). Если требуется строгий контроль формата (например, всегда выводить секунды или использовать специфические разделители), выбирайте функцию Формат() с маской ДФ=yyyy-MM-dd'T'ЧЧ:mm:ss. При работе с современными веб-интерфейсами и форматом JSON лучше всего использовать встроенные возможности объекта ЗаписьJSON, которые обеспечивают максимальную совместимость со стандартами.

← На главную