При работе с XML-документами через объект ПостроительDOM программисты часто сталкиваются с тем, что все данные из узлов считываются в текстовом виде. Даже если в самой схеме XML поле определено как дата или дата-время, программный интерфейс DOM вернет его как обычную строку. Рассмотрим подробнее, как корректно и эффективно преобразовать эти текстовые данные в полноценный тип Дата среды 1С:Предприятие.
Если формат даты в вашем XML-файле строго фиксирован (например, «ДД.ММ.ГГГГ ЧЧ:ММ:СС»), мы можем применить классический подход с использованием функций Лев, Сред и Прав. Проанализируем ситуацию: конструктор Дата в 1С ожидает либо строку в формате «ГГГГММДДЧЧММСС», либо последовательный набор чисел (год, месяц, день и т.д.).
Разберем по шагам пример, когда дата представлена в формате «12.09.2015 09:26:00». Для того чтобы собрать из этого значения дату 1С, мы можем использовать следующий код:
ДатаСтрока = "12.09.2015 09:26:00"; // Получено из узла DOM
НужнаяДата = Дата(Сред(ДатаСтрока, 7, 4), // Год
Сред(ДатаСтрока, 4, 2), // Месяц
Лев(ДатаСтрока, 2), // День
Сред(ДатаСтрока, 12, 2),// Часы
Сред(ДатаСтрока, 15, 2),// Минуты
Сред(ДатаСтрока, 18, 2) // Секунды
);
Этот способ надежен, если вы абсолютно уверены, что формат даты никогда не изменится. Однако, если разделители (точки, тире) могут варьироваться, такой код может вызвать ошибку. Проанализируем альтернативный вариант сборки строки:
// Приводим к виду ГГГГММДДЧЧММСС через конкатенацию
СтрокаДляКонструктора = Сред(ДатаСтрока, 7, 4) + Сред(ДатаСтрока, 4, 2) + Лев(ДатаСтрока, 2) + Сред(ДатаСтрока, 12, 2) + Сред(ДатаСтрока, 15, 2) + Сред(ДатаСтрока, 18, 2);
НужнаяДата = Дата(СтрокаДляКонструктора);
Выясним, существует ли более «цивилизованный» способ решения задачи. В платформе 1С предусмотрена мощная функция XMLЗначение, которая специально разработана для преобразования текстовых представлений типов XML в типы данных 1С. Это наиболее правильный подход, так как он соответствует стандартам XML (ISO 8601).
Стандартный формат даты в XML обычно выглядит так: 2015-09-12T09:26:00. Если ваш ПостроительDOM извлекает данные в таком формате, нам не нужно ничего резать вручную. Посмотрим на пример использования:
// Допустим, ТекстовоеЗначениеУзла = "2015-09-12T09:26:00"
НужнаяДата = XMLЗначение(Тип("Дата"), ТекстовоеЗначениеУзла);
Важное преимущество: функция XMLЗначение автоматически обрабатывает пустые значения и специфические разделители, а также корректно интерпретирует часовые пояса, если они указаны в строке (например, наличие смещения +03:00).
Если вы работаете с объектной моделью документа и хотите максимально автоматизировать процесс, рекомендуем использовать СериализаторXDTO. Этот объект позволяет считывать данные напрямую из узлов DOM, которые вы получили через ПостроительDOM.
Рассмотрим, как это работает на практике. Предположим, у нас есть переменная УзелDOM, указывающая на элемент с датой:
// Сериализатор сам определит формат и преобразует его в Дату 1С
НужнаяДата = СериализаторXDTO.ПрочитатьXML(УзелDOM, Тип("Дата"));
Этот метод является наиболее универсальным и профессиональным, так как он полностью абстрагирует разработчика от строковых манипуляций. Если в XML-схеме указано, что это дата, СериализаторXDTO выполнит типизацию безупречно.
Проанализируем ситуацию, когда формат даты в XML нестандартный или содержит лишние символы. Часто встречается символ T, разделяющий дату и время. Если вы решите использовать прямой конструктор Дата(), передав туда строку 2023-10-25T14:30:00, система выдаст ошибку.
Чтобы этого избежать при ручной обработке, выполним следующие шаги:
T на пробел.ГГГГММДДЧЧММСС или ДД.ММ.ГГГГ ЧЧ:ММ:СС.Пример быстрой очистки строки перед использованием конструктора:
СтрДата = "2023-10-25T14:30:00";
СтрДата = СтрЗаменить(СтрДата, "T", "");
СтрДата = СтрЗаменить(СтрДата, "-", "");
СтрДата = СтрЗаменить(СтрДата, ":", "");
// Теперь СтрДата = "20231025143000"
Результат = Дата(СтрДата);
Особое внимание стоит уделить обработке пустых значений. В XML пустая дата может выглядеть как пустая строка "". Попытка применить к ней функции Сред или Лев приведет к получению некорректных подстрок и последующей ошибке при вызове Дата().
Посмотрим, как правильно организовать проверку:
ЗначениеИзDOM = Узел.ТекстовоеСодержимое; // Читаем текст узла
Если ЗначениеЗаполнено(ЗначениеИзDOM) Тогда
// Применяем один из методов преобразования
Попытка
НужнаяДата = XMLЗначение(Тип("Дата"), ЗначениеИзDOM);
Исключение
НужнаяДата = '00010101'; // Дефолтное значение при ошибке формата
КонецПопытки;
Иначе
НужнаяДата = '00010101';
КонецЕсли;
Подводя итог, можно сказать: для простых задач и фиксированных форматов подходят функции Сред и Лев, но для создания отказоустойчивых систем интеграции лучше использовать XMLЗначение или СериализаторXDTO. Это гарантирует правильную обработку стандартов XML и избавляет от написания громоздких функций парсинга строк.