Как преобразовать строку из XML-файла в дату в 1С

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

При обмене данными с внешними системами через формат XML программисты часто сталкиваются со строковым представлением даты вида 2015-08-01T00:00:00. Попытка прямого преобразования такой строки с помощью конструктора Дата() приводит к ошибке, так как 1С ожидает строку в формате ГГГГММДДЧЧММСС. В этой статье мы подробно разберем, как правильно и эффективно конвертировать такие строки в объект типа Дата, используя как встроенные механизмы платформы, так и альтернативные методы парсинга.

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

Это наиболее правильный и "чистый" способ с точки зрения архитектуры платформы 1С. Функция XMLЗначение() специально предназначена для преобразования текстовых данных из XML в соответствующие типы 1С. Давайте рассмотрим, как она работает.

Для корректной работы функции нам необходимо передать два параметра: целевой тип (в нашем случае это Дата) и саму строку. Проанализируем пример кода:


СтрокаИзXML = "2015-08-01T22:22:22";
ДатаДок = XMLЗначение(Тип("Дата"), СтрокаИзXML);
// Результат будет: 01.08.2015 22:22:22

Важный нюанс: Обратите внимание на символ T в середине строки. Он является разделителем даты и времени согласно стандарту ISO 8601. Если в вашей строке вместо T стоит пробел или другой символ, функция XMLЗначение может вернуть дату с пустым временем (00:00:00). Поэтому перед преобразованием стоит убедиться, что формат соответствует стандарту.

Способ 2. Использование механизмов XDTO

Если ваша задача не ограничивается разовым преобразованием одной строки, а подразумевает чтение всего XML-документа, мы рекомендуем использовать фабрику XDTO. Это мощный инструмент, который автоматически типизирует данные на основе схемы XML. Если обмен XML-файлами требуется выполнять на постоянной основе, для автоматизации процесса по расписанию можно использовать программу для регулярной синхронизации баз 1С по XML-правилам.

Рассмотрим ситуацию, когда мы читаем файл. При использовании ФабрикаXDTO.ПрочитатьXML(), если в схеме поле описано как xs:dateTime, платформа самостоятельно преобразует строку в дату 1С. Нам не придется писать дополнительный код для конвертации. Давайте разберем последовательность действий:

  1. Создаем объект ЧтениеXML и открываем файл.
  2. Используем метод ФабрикаXDTO.ПрочитатьXML().
  3. Обращаемся к свойству объекта, которое уже будет иметь тип Дата.

Этот метод исключает ошибки ручного парсинга и корректно обрабатывает пустые значения. Для освоения механизмов работы с фабрикой подойдёт руководство по работе с XDTO с нуля.

Способ 3. Ручное преобразование строки через замену символов

Иногда возникают ситуации, когда формат входящей строки нестандартен или использование XMLЗначение по каким-то причинам недоступно (например, в специфических условиях выполнения кода). В таких случаях можно прибегнуть к манипуляциям со строкой, чтобы привести её к виду ГГГГММДДЧЧММСС, который понимает стандартный конструктор Дата().

Давайте проанализируем метод, основанный на последовательном удалении лишних разделителей:


СтрокаИзXML = "2015-08-01T14:30:05";
// Удаляем "-", ":", и "T"
ЧистаяСтрока = СтрЗаменить(СтрокаИзXML, "-", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ":", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, "T", "");

// Теперь ЧистаяСтрока содержит "20150801143005"
ДатаДок = Дата(ЧистаяСтрока); 

Этот способ прост, но требует осторожности. Если формат времени изменится (например, добавятся миллисекунды), код может сработать некорректно. Рассмотрим более гибкий вариант функции для парсинга дат в формате дд.мм.гггг, который часто встречается при выгрузках из Excel или текстовых реестров:


Функция ПреобразоватьВДату(СтрокаДата)
    // Очищаем от возможного времени, если оно не нужно
    СтрокаДата = СтрЗаменить(СтрокаДата, " 0:00:00", "");
    
    // Преобразуем точки в переносы строк для удобного извлечения
    МножСтрока = СтрЗаменить(СтрокаДата, ".", Символы.ПС);
    
    стрДень = СтрПолучитьСтроку(МножСтрока, 1);
    стрМесяц = СтрПолучитьСтроку(МножСтрока, 2);
    стрГод = СтрПолучитьСтроку(МножСтрока, 3);
    
    Возврат Дата(стрГод, стрМесяц, стрДень);
КонецФункции

Способ 4. Современный метод через JSON (для версии 8.3.6 и выше)

Интересной особенностью является то, что формат даты в XML (ISO 8601) идентичен формату, принятому в JSON. В современных версиях платформы 1С появилась функция ПрочитатьДатуJSON(), которая отлично справляется с парсингом таких строк. Давайте посмотрим, как применить её для нашей задачи:


СтрокаИзXML = "2015-08-01T22:22:22";
// Используем формат ISO
ДатаДок = ПрочитатьДатуJSON(СтрокаИзXML, ФорматДатыJSON.ISO);

Этот метод часто работает быстрее ручного парсинга и так же надежен, как XMLЗначение.

Разбор сложных случаев: Часовые пояса и миллисекунды

При работе с реальными данными из XML-файлов мы можем столкнуться с дополнительными символами в строке даты. Выясним, как на них реагирует 1С:

  1. Символ Z или смещение часового пояса: Строка может выглядеть так: 2015-08-01T00:00:00Z или 2015-08-01T00:00:00+03:00. При использовании XMLЗначение платформа попытается привести это время к локальному времени сеанса. Это критически важно учитывать, чтобы время документа не "поплыло" на несколько часов.
  2. Миллисекунды: Если строка содержит дробную часть секунды (например, .000), стандартный конструктор Дата() выдаст ошибку. Функция XMLЗначение просто проигнорирует (отсечет) миллисекунды, что обычно и требуется в бизнес-логике 1С, так как тип Дата в системе не поддерживает точность выше секунды.
  3. Пустые значения: В XML пустая дата может быть передана как 0001-01-01T00:00:00. Все встроенные функции 1С (XMLЗначение, ПрочитатьДатуJSON) корректно преобразуют это в пустую дату 1С: '00010101000000'.

Почему решение может "не взлететь"?

Проанализируем типичные ошибки, которые мешают правильному преобразованию:

Во-первых, наличие невидимых пробелов. Часто при чтении текстовых узлов XML в строку попадают пробелы или символы переноса строк в начале или конце. Всегда используйте функцию СокрЛП() перед преобразованием.

Во-вторых, путаница с типами данных. Если вы используете XMLЗначение, убедитесь, что вторым параметром передается именно строка, а первым — Тип("Дата"). Ошибка в написании типа или передача Неопределено приведет к сбою программы.

В-третьих, особенности релиза платформы. Хотя метод XMLЗначение универсален, в очень старых версиях (или при работе в специфических режимах совместимости) он может требовать строгого соответствия формату. В таких случаях ручной парсинг через Сред() и Лев() остается самым надежным "топором" программиста.

Подводя итог, можно сказать, что для большинства задач оптимальным выбором будет XMLЗначение(). Если же вы строите сложную систему интеграции, лучше один раз настроить Фабрику XDTO, которая возьмет на себя всю работу по приведению типов.

← На главную