При обмене данными с внешними системами через HTTP-сервисы, REST API или XML/JSON-файлы программисты 1С часто сталкиваются с датами в формате ISO 8601 (например, "0001-01-01T12:34:12" или "2023-10-25T12:34:12"). Нам требуется не только получить из этой строки полноценное значение типа Дата, но и иногда привести ее к строго заданному текстовому виду без разделителей (например, "00010101123412").
Рассмотрим подробно несколько методов решения этой задачи, оценим их плюсы, минусы и границы применимости.
Это наиболее надежный и лаконичный путь преобразования стандарта ISO в системную дату 1С, так как платформа берет на себя парсинг структуры строки.
Посмотрим на пример работы с методом XMLЗначение:
ИсходнаяСтрока = "0001-01-01T12:34:12";
НашаДата = XMLЗначение(Тип("Дата"), ИсходнаяСтрока);
Альтернативный вариант — применение функции ПрочитатьДатуJSON, доступной в современной платформе:
ИсходнаяСтрока = "0001-01-01T12:34:12";
НашаДата = ПрочитатьДатуJSON(ИсходнаяСтрока, ФорматДатыJSON.ISO);
Преимущества: эти встроенные функции корректно отрабатывают спецификацию формата ISO, игнорируют лишние разделители и корректно обрабатывают суффиксы часовых поясов или доли секунд, отсекая их при формировании даты.
Разберем вариант с ручным удалением разделителей. Если исходная строка всегда строго фиксированной длины и формата, можно последовательно вырезать дефисы, двоеточия и символ T, после чего передать получившуюся 14-значную строку в конструктор Дата().
Рассмотрим реализацию через замену символов:
ВходнойПараметр = "0001-01-01T12:34:12";
ВходнойПараметр = СтрЗаменить(ВходнойПараметр, "-", "");
ВходнойПараметр = СтрЗаменить(ВходнойПараметр, ":", "");
ВходнойПараметр = СтрЗаменить(ВходнойПараметр, "T", "");
// ВходнойПараметр стал равен "00010101123412"
НашаДата = Дата(ВходнойПараметр);
Также можно отфильтровать только символы-цифры по их кодам, если формация строки гарантированно содержит нужные компоненты даты:
Функция СтрокаВДатуОчисткой(НашаСтрока)
ВыходнаяСтрока = "";
Для й = 1 По СтрДлина(НашаСтрока) Цикл
Символ = Сред(НашаСтрока, й, 1);
Код = КодСимвола(Символ);
Если Код >= 48 И Код <= 57 Тогда // Коды цифр 0..9
ВыходнаяСтрока = ВыходнаяСтрока + Символ;
КонецЕсли;
КонецЦикла;
Возврат Дата(ВыходнаяСтрока);
КонецФункции
Важно: явный конструктор Дата(Строка) в 1С требует строго 8 цифр (ггггММдд) или 14 цифр (ггггММддЧЧммсс). Если во входящих данных окажутся миллисекунды (например, .123) или указание часового пояса (Z или +03:00), при простой замене длина строки изменится, и платформа сгенерирует критическую ошибку преобразования.
В тиражных решениях и при интеграции через веб-сервисы удобно использовать штатные механизмы XDTO или функции Библиотеки Стандартных Подсистем (БСП):
// Вариант 1: Через Фабрику XDTO
НашаДата = ФабрикаXDTO.ПривестиИзXML(ИсходнаяСтрока, ТипXDTO("http://www.w3.org/2001/XMLSchema", "dateTime"));
// Вариант 2: С использованием библиотеки БСП
НашаДата = СтроковыеФункцииКлиентСервер.СтрокаВДату(ИсходнаяСтрока);
Если конечная цель заключается в том, чтобы из объекта типа Дата получить строку вида "00010101123412" без разделителей, проанализируем самый правильный инструмент — системную функцию Формат.
НашаДата = XMLЗначение(Тип("Дата"), "0001-01-01T12:34:12");
СплошнаяСтрока = Формат(НашаДата, "ДФ=ггггММддЧЧммсс");
Проанализируем основные правила безопасности при парсинге дат:
Попытка ... Исключение, чтобы некорректно сформированная строка не приводила к аварийному завершению программы.XMLЗначение или ПрочитатьДатуJSON перед ручным удалением символов.Формат(НашаДата, "ДФ=ггггММддЧЧммсс").