В процессе интеграции систем «1С:Предприятие» со сторонними веб-сервисами, API или при формировании файлов обмена данными (JSON, XML), разработчики часто сталкиваются с необходимостью представления даты в специфическом международном формате ISO 8601. Этот формат выглядит следующим образом: YYYY-MM-DDTHH:MM:SS. Основная сложность здесь заключается в наличии латинского символа T между датой и временем. В этой статье мы подробно разберем, как реализовать такое преобразование, проанализируем различные встроенные механизмы платформы и выясним, какой из них наиболее эффективен в различных ситуациях.
Начнем с самого простого и производительного способа. В платформе 1С существует встроенная функция XMLСтрока(), которая предназначена для приведения значений к каноническому представлению XML. Для типа данных Дата она автоматически генерирует строку в формате ISO 8601.
Рассмотрим пример кода:
ТекущаяДатаОбмена = ТекущаяДата();
СтрокаISO = XMLСтрока(ТекущаяДатаОбмена);
// Результат будет выглядеть так: "2022-05-20T08:58:00"
Проанализируем преимущества и недостатки этого метода:
Формат(), так как она узкоспециализирована.Дата время не заполнено (равно 00:00:00), функция XMLСтрока() может вернуть только дату в формате YYYY-MM-DD. Если принимающая сторона строго ожидает наличие времени и разделителя T, этот способ может потребовать дополнительной проверки.Если нам нужен жесткий контроль над результатом или если XMLСтрока() не подходит из-за особенностей обработки времени, мы можем воспользоваться функцией Формат(). Рассмотрим, как правильно составить конструкцию ДФ (формат даты).
Разберем по шагам создание форматной строки. Нам необходимо вставить букву T как литерал, чтобы система не интерпретировала ее как служебный символ. В 1С для вставки произвольного текста в форматную строку используются одиночные кавычки.
Пример правильного кода:
НужнаяДата = ТекущаяДата();
// Обратите внимание на использование ЧЧ для 24-часового формата
СтрокаФормата = "ДФ=yyyy-MM-dd'T'ЧЧ:mm:ss";
Результат = Формат(НужнаяДата, СтрокаФормата);
Важные замечания по синтаксису:
yyyy (в нижнем регистре) для обозначения года.mm (в нижнем регистре), так как заглавные ММ зарезервированы для обозначения месяца.ЧЧ. В других языках программирования часто применяется HH, но в 1С это приведет к некорректному результату или будет проигнорировано.T обязательно заключается в одинарные кавычки внутри основной строки формата.Если вашей конечной целью является формирование JSON-пакета, то наиболее современным и правильным подходом будет использование объекта ЗаписьJSON. Начиная с версии платформы 8.3.6, разработчики получили возможность гибко управлять форматом дат при сериализации.
Посмотрим на пример использования настроек записи:
Запись = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб);
Запись.УстановитьСтроку(ПараметрыЗаписи);
// Указываем вариант записи даты в формате ISO8601
ЗаписатьJSON(Запись, ТекущаяДата(), ВариантЗаписиДатыJSON.ISO8601);
РезультатСтрокой = Запись.Закрыть();
Выясним, чем этот метод лучше других. При использовании ВариантЗаписиДатыJSON.ISO8601 система сама заботится о правильном представлении даты. Если же вы используете ВариантЗаписиДатыJSON.UniversalDate, система добавит в конец символ Z, что будет означать время по Гринвичу (UTC). Это критически важно для международных интеграций.
Рассмотрим ситуацию, когда внешняя система требует дату не просто в формате с буквой T, а именно в формате UTC. Время в 1С обычно хранится по местному часовому поясу сервера или сеанса. Перед преобразованием в строку хорошим тоном считается перевод времени в универсальное.
Проанализируем следующий алгоритм:
УниверсальноеВремя().Пример кода:
МестнаяДата = ТекущаяДата();
Дата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, которые обеспечивают максимальную совместимость со стандартами.