Как преобразовать строковое значение даты из ПостроителяDOM в тип Дата 1С

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

При работе с XML-документами через объект ПостроительDOM программисты часто сталкиваются с тем, что все данные из узлов считываются в текстовом виде. Даже если в самой схеме XML поле определено как дата или дата-время, программный интерфейс DOM вернет его как обычную строку. Рассмотрим подробнее, как корректно и эффективно преобразовать эти текстовые данные в полноценный тип Дата среды 1С:Предприятие.

Метод 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);
НужнаяДата = Дата(СтрокаДляКонструктора);

Метод 2: Использование встроенной функции XMLЗначение

Выясним, существует ли более «цивилизованный» способ решения задачи. В платформе 1С предусмотрена мощная функция XMLЗначение, которая специально разработана для преобразования текстовых представлений типов XML в типы данных 1С. Это наиболее правильный подход, так как он соответствует стандартам XML (ISO 8601).

Стандартный формат даты в XML обычно выглядит так: 2015-09-12T09:26:00. Если ваш ПостроительDOM извлекает данные в таком формате, нам не нужно ничего резать вручную. Посмотрим на пример использования:


// Допустим, ТекстовоеЗначениеУзла = "2015-09-12T09:26:00"
НужнаяДата = XMLЗначение(Тип("Дата"), ТекстовоеЗначениеУзла);

Важное преимущество: функция XMLЗначение автоматически обрабатывает пустые значения и специфические разделители, а также корректно интерпретирует часовые пояса, если они указаны в строке (например, наличие смещения +03:00).

Метод 3: Применение глобального объекта СериализаторXDTO

Если вы работаете с объектной моделью документа и хотите максимально автоматизировать процесс, рекомендуем использовать СериализаторXDTO. Этот объект позволяет считывать данные напрямую из узлов DOM, которые вы получили через ПостроительDOM.

Рассмотрим, как это работает на практике. Предположим, у нас есть переменная УзелDOM, указывающая на элемент с датой:


// Сериализатор сам определит формат и преобразует его в Дату 1С
НужнаяДата = СериализаторXDTO.ПрочитатьXML(УзелDOM, Тип("Дата"));

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

Специфика формата ISO 8601 и типичные ошибки

Проанализируем ситуацию, когда формат даты в XML нестандартный или содержит лишние символы. Часто встречается символ T, разделяющий дату и время. Если вы решите использовать прямой конструктор Дата(), передав туда строку 2023-10-25T14:30:00, система выдаст ошибку.

Чтобы этого избежать при ручной обработке, выполним следующие шаги:

  1. Заменим разделитель T на пробел.
  2. Заменим тире на точки или уберем их вовсе.
  3. Убедимся, что итоговая строка соответствует шаблону ГГГГММДДЧЧММСС или ДД.ММ.ГГГГ ЧЧ:ММ:СС.

Пример быстрой очистки строки перед использованием конструктора:


СтрДата = "2023-10-25T14:30:00";
СтрДата = СтрЗаменить(СтрДата, "T", "");
СтрДата = СтрЗаменить(СтрДата, "-", "");
СтрДата = СтрЗаменить(СтрДата, ":", "");
// Теперь СтрДата = "20231025143000"
Результат = Дата(СтрДата);

Обработка пустых дат

Особое внимание стоит уделить обработке пустых значений. В XML пустая дата может выглядеть как пустая строка "". Попытка применить к ней функции Сред или Лев приведет к получению некорректных подстрок и последующей ошибке при вызове Дата().

Посмотрим, как правильно организовать проверку:


ЗначениеИзDOM = Узел.ТекстовоеСодержимое; // Читаем текст узла
Если ЗначениеЗаполнено(ЗначениеИзDOM) Тогда
    // Применяем один из методов преобразования
    Попытка
        НужнаяДата = XMLЗначение(Тип("Дата"), ЗначениеИзDOM);
    Исключение
        НужнаяДата = '00010101'; // Дефолтное значение при ошибке формата
    КонецПопытки;
Иначе
    НужнаяДата = '00010101';
КонецЕсли;

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

← На главную