Как преобразовать строку формата ISO в дату или сплошную строку в 1С?

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

При обмене данными с внешними системами через HTTP-сервисы, REST API или XML/JSON-файлы программисты 1С часто сталкиваются с датами в формате ISO 8601 (например, "0001-01-01T12:34:12" или "2023-10-25T12:34:12"). Нам требуется не только получить из этой строки полноценное значение типа Дата, но и иногда привести ее к строго заданному текстовому виду без разделителей (например, "00010101123412").

Рассмотрим подробно несколько методов решения этой задачи, оценим их плюсы, минусы и границы применимости.

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

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

Посмотрим на пример работы с методом XMLЗначение:


ИсходнаяСтрока = "0001-01-01T12:34:12";
НашаДата = XMLЗначение(Тип("Дата"), ИсходнаяСтрока);

Альтернативный вариант — применение функции ПрочитатьДатуJSON, доступной в современной платформе:


ИсходнаяСтрока = "0001-01-01T12:34:12";
НашаДата = ПрочитатьДатуJSON(ИсходнаяСтрока, ФорматДатыJSON.ISO);

Преимущества: эти встроенные функции корректно отрабатывают спецификацию формата ISO, игнорируют лишние разделители и корректно обрабатывают суффиксы часовых поясов или доли секунд, отсекая их при формировании даты.

Способ 2. Очистка строки от разделителей и приведение к типу Дата

Разберем вариант с ручным удалением разделителей. Если исходная строка всегда строго фиксированной длины и формата, можно последовательно вырезать дефисы, двоеточия и символ T, после чего передать получившуюся 14-значную строку в конструктор Дата().

Рассмотрим реализацию через замену символов:


ВходнойПараметр = "0001-01-01T12:34:12";
ВходнойПараметр = СтрЗаменить(ВходнойПараметр, "-", "");
ВходнойПараметр = СтрЗаменить(ВходнойПараметр, ":", "");
ВходнойПараметр = СтрЗаменить(ВходнойПараметр, "T", "");

// ВходнойПараметр стал равен "00010101123412"
НашаДата = Дата(ВходнойПараметр);

Также можно отфильтровать только символы-цифры по их кодам, если формация строки гарантированно содержит нужные компоненты даты:


Функция СтрокаВДатуОчисткой(НашаСтрока)
    ВыходнаяСтрока = "";
    Для й = 1 По СтрДлина(НашаСтрока) Цикл
        Символ = Сред(НашаСтрока, й, 1);
        Код = КодСимвола(Символ);
        Если Код >= 48 И Код <= 57 Тогда // Коды цифр 0..9
            ВыходнаяСтрока = ВыходнаяСтрока + Символ;
        КонецЕсли;
    КонецЦикла; 
    
    Возврат Дата(ВыходнаяСтрока);
КонецФункции

Важно: явный конструктор Дата(Строка) в 1С требует строго 8 цифр (ггггММдд) или 14 цифр (ггггММддЧЧммсс). Если во входящих данных окажутся миллисекунды (например, .123) или указание часового пояса (Z или +03:00), при простой замене длина строки изменится, и платформа сгенерирует критическую ошибку преобразования.

Способ 3. Использование Фабрики XDTO и БСП

В тиражных решениях и при интеграции через веб-сервисы удобно использовать штатные механизмы XDTO или функции Библиотеки Стандартных Подсистем (БСП):


// Вариант 1: Через Фабрику XDTO
НашаДата = ФабрикаXDTO.ПривестиИзXML(ИсходнаяСтрока, ТипXDTO("http://www.w3.org/2001/XMLSchema", "dateTime"));

// Вариант 2: С использованием библиотеки БСП
НашаДата = СтроковыеФункцииКлиентСервер.СтрокаВДату(ИсходнаяСтрока);

Преобразование полученной даты в сплошную строку цифр

Если конечная цель заключается в том, чтобы из объекта типа Дата получить строку вида "00010101123412" без разделителей, проанализируем самый правильный инструмент — системную функцию Формат.


НашаДата = XMLЗначение(Тип("Дата"), "0001-01-01T12:34:12");
СплошнаяСтрока = Формат(НашаДата, "ДФ=ггггММддЧЧммсс");

Рекомендации по повышению надежности кода

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

  1. Всегда оборачивайте операции парсинга внешних строк в блок Попытка ... Исключение, чтобы некорректно сформированная строка не приводила к аварийному завершению программы.
  2. Для стандарта ISO 8601 отдавайте преимущество системным функциям XMLЗначение или ПрочитатьДатуJSON перед ручным удалением символов.
  3. Для обратного вывода даты в сплошную строку без разделителей используйте конструкцию Формат(НашаДата, "ДФ=ггггММддЧЧммсс").
← На главную