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

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

При обмене данными с внешними системами, веб-сервисами или при разборе лог-файлов программисты часто сталкиваются со строками вида "2020-01-10T11:36:53.326724+06:00". Это стандарт ISO 8601. Стандартная функция 1С Дата() не умеет обрабатывать такие строки напрямую, так как она ожидает либо формат без разделителей (ГГГГММДДЧЧММСС), либо строго определенный локальный формат. В этой статье мы разберем по шагам все доступные способы преобразования такой строки в объект типа Дата в среде 1С.

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

Это самый быстрый и часто используемый способ «из коробки». Функция XMLЗначение предназначена для десериализации данных из формата XML, который по умолчанию использует стандарт ISO 8601 для дат.

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


СтрокаДаты = "2020-01-10T11:36:53.326724+06:00";
ДатаРезультат = XMLЗначение(Тип("Дата"), СтрокаДаты);
// Результат будет: 10.01.2020 8:36:53 (с учетом смещения часового пояса)

Проанализируем особенности этого метода:

  1. Часовые пояса: 1С автоматически преобразует время с учетом указанного смещения (например, +06:00) в локальное время сеанса. Если ваше локальное время отличается, результат будет сдвинут.
  2. Миллисекунды: Тип данных Дата в 1С имеет точность до секунды. Дробная часть секунды (.326724) будет просто отсечена без округления.
  3. Строгий формат: Если в строке вместо разделителя T будет стоять пробел или формат будет нарушен, функция вызовет исключение. Поэтому всегда используйте конструкцию Попытка...Исключение.

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

Если вы получаете дату в составе JSON-ответа, 1С предоставляет мощные инструменты для автоматической конвертации. Начиная с версии 8.3.6, объект ЧтениеJSON умеет самостоятельно распознавать даты.

Посмотрим на пример реализации:


// Предположим, у нас есть JSON со строкой даты
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку("{""ДатаСобытия"": ""2020-01-10T11:36:53""}");

// Настраиваем параметры чтения для автоматического распознавания дат
ПараметрыЧтения = Новый ПараметрыЧтенияJSON(СпособЧтенияДатыJSON.ISO);

Данные = ПрочитатьJSON(Чтение, Ложь, , , , ПараметрыЧтения);
ДатаРезультат = Данные.ДатаСобытия; 
Чтение.Закрыть();

Этот метод удобен тем, что вам не нужно вручную вызывать функции преобразования для каждого поля — платформа сделает это сама в момент парсинга всего документа.

Способ 3. Библиотека стандартных подсистем (БСП)

В современных типовых конфигурациях (УТ 11, БП 3.0, ERP) уже существуют готовые обертки, которые учитывают множество нюансов и обеспечивают безопасную работу кода. Рекомендуем использовать функцию общего модуля СтроковыеФункцииКлиентСервер.

Пример вызова:


ЗначениеСтрокой = "2020-01-10T11:36:53";
ДатаРезультат = СтроковыеФункцииКлиентСервер.СтрокаВДатуXML(ЗначениеСтрокой);

Преимущество этого метода в том, что он соответствует стандартам разработки фирмы «1С» и делает код более читаемым для других разработчиков.

Способ 4. Использование фабрики XDTO

Если вам требуется максимальная гибкость или вы работаете в контексте сложных веб-сервисов, можно воспользоваться фабрикой XDTO. Это более «тяжеловесный», но универсальный способ.

Разберем алгоритм:


СтрокаДаты = "2020-01-10T11:36:53";
ТипДатаВремя = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime");
Попытка
    РезультатXDTO = ФабрикаXDTO.Создать(ТипДатаВремя, СтрокаДаты);
    ДатаРезультат = РезультатXDTO.Значение;
Исключение
    Сообщить("Неверный формат даты!");
КонецПопытки;

Почему не подходит стандартная функция Дата()?

Многие начинающие разработчики пытаются использовать Дата(Строка). Выясним причину, почему это не сработает для ISO 8601:

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

Для большинства повседневных задач в 1С оптимальным выбором будет Способ 1 (XMLЗначение) или Способ 3 (БСП). Они обеспечивают баланс между скоростью написания кода и надежностью результата. Если же вы работаете с API и форматом JSON, лучше всего настроить автоматическое преобразование через ПараметрыЧтенияJSON.

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

← На главную