При обмене данными с внешними системами, веб-сервисами или при разборе лог-файлов программисты часто сталкиваются со строками вида "2020-01-10T11:36:53.326724+06:00". Это стандарт ISO 8601. Стандартная функция 1С Дата() не умеет обрабатывать такие строки напрямую, так как она ожидает либо формат без разделителей (ГГГГММДДЧЧММСС), либо строго определенный локальный формат. В этой статье мы разберем по шагам все доступные способы преобразования такой строки в объект типа Дата в среде 1С.
Это самый быстрый и часто используемый способ «из коробки». Функция XMLЗначение предназначена для десериализации данных из формата XML, который по умолчанию использует стандарт ISO 8601 для дат.
Рассмотрим пример кода:
СтрокаДаты = "2020-01-10T11:36:53.326724+06:00";
ДатаРезультат = XMLЗначение(Тип("Дата"), СтрокаДаты);
// Результат будет: 10.01.2020 8:36:53 (с учетом смещения часового пояса)
Проанализируем особенности этого метода:
+06:00) в локальное время сеанса. Если ваше локальное время отличается, результат будет сдвинут.Дата в 1С имеет точность до секунды. Дробная часть секунды (.326724) будет просто отсечена без округления.T будет стоять пробел или формат будет нарушен, функция вызовет исключение. Поэтому всегда используйте конструкцию Попытка...Исключение.Если вы получаете дату в составе JSON-ответа, 1С предоставляет мощные инструменты для автоматической конвертации. Начиная с версии 8.3.6, объект ЧтениеJSON умеет самостоятельно распознавать даты.
Посмотрим на пример реализации:
// Предположим, у нас есть JSON со строкой даты
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку("{""ДатаСобытия"": ""2020-01-10T11:36:53""}");
// Настраиваем параметры чтения для автоматического распознавания дат
ПараметрыЧтения = Новый ПараметрыЧтенияJSON(СпособЧтенияДатыJSON.ISO);
Данные = ПрочитатьJSON(Чтение, Ложь, , , , ПараметрыЧтения);
ДатаРезультат = Данные.ДатаСобытия;
Чтение.Закрыть();
Этот метод удобен тем, что вам не нужно вручную вызывать функции преобразования для каждого поля — платформа сделает это сама в момент парсинга всего документа.
В современных типовых конфигурациях (УТ 11, БП 3.0, ERP) уже существуют готовые обертки, которые учитывают множество нюансов и обеспечивают безопасную работу кода. Рекомендуем использовать функцию общего модуля СтроковыеФункцииКлиентСервер.
Пример вызова:
ЗначениеСтрокой = "2020-01-10T11:36:53";
ДатаРезультат = СтроковыеФункцииКлиентСервер.СтрокаВДатуXML(ЗначениеСтрокой);
Преимущество этого метода в том, что он соответствует стандартам разработки фирмы «1С» и делает код более читаемым для других разработчиков.
Если вам требуется максимальная гибкость или вы работаете в контексте сложных веб-сервисов, можно воспользоваться фабрикой XDTO. Это более «тяжеловесный», но универсальный способ.
Разберем алгоритм:
СтрокаДаты = "2020-01-10T11:36:53";
ТипДатаВремя = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime");
Попытка
РезультатXDTO = ФабрикаXDTO.Создать(ТипДатаВремя, СтрокаДаты);
ДатаРезультат = РезультатXDTO.Значение;
Исключение
Сообщить("Неверный формат даты!");
КонецПопытки;
Многие начинающие разработчики пытаются использовать Дата(Строка). Выясним причину, почему это не сработает для ISO 8601:
Дата() ожидает строку формата "ГГГГММДДЧЧММСС" (например, "20200110113653").-, : и T приведет к ошибке приведения типа.Дата(), вам пришлось бы предварительно «очищать» строку от лишних символов с помощью функций СтрЗаменить(), что усложняет код и делает его хрупким.Для большинства повседневных задач в 1С оптимальным выбором будет Способ 1 (XMLЗначение) или Способ 3 (БСП). Они обеспечивают баланс между скоростью написания кода и надежностью результата. Если же вы работаете с API и форматом JSON, лучше всего настроить автоматическое преобразование через ПараметрыЧтенияJSON.
Важный совет: всегда помните о часовых поясах. Если ваша система работает с данными из разных регионов, убедитесь, что вы понимаете, в каком поясе сохранена дата — в UTC или в локальном времени отправителя, так как 1С при импорте может неявно изменить время под часовой пояс сервера.