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

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

В процессе интеграции систем нередко приходится сталкиваться с файлами формата XML, которые были сформированы устаревшими версиями платформ или сторонним софтом. Часто такие файлы не соответствуют стандартам W3C, из-за чего стандартные инструменты, такие как ЧтениеXML или ФабрикаXDTO, могут выдавать ошибки. Давайте разберем, как поступить, если файл представляет собой текстовую структуру, имитирующую атрибуты, но при этом является «кривым» с точки зрения парсера.

Анализ проблемы и подготовка данных

Прежде чем приступать к написанию кода, проанализируем структуру нашего файла. Если внутри тега данные записаны как Ключ="Значение", а сам файл при этом не читается как объектное дерево, мы должны сменить подход и работать с ним как с обычным текстовым документом. Мы не будем пытаться «подружить» кривой формат с валидатором, а поймем, как извлечь нужную нам пару ключ-значение программно.

Решение 1: Построчный разбор текстового документа

Этот метод является самым гибким. Мы считаем файл в переменную, разобьем его на массив строк и последовательно обработаем каждую. Давайте разберем этот процесс по шагам:

  1. Считываем весь файл в объект ТекстовыйДокумент.
  2. Разбиваем полученный текст на отдельные строки по символу переноса строки.
  3. В каждой строке ищем разделитель =, чтобы отделить имя ключа от значения.
  4. Очищаем полученное значение от кавычек.

Посмотрим, как это выглядит в коде:


Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("путь_к_файлу.xml", "windows-1251");

СоответствиеДанных = Новый Соответствие;

Для Индекс = 1 По Текст.КоличествоСтрок() Цикл
    СтрокаСодержимого = СокрЛП(Текст.ПолучитьСтроку(Индекс));
    
    // Ищем позицию знака равенства
    ПозицияРавно = СтрНайти(СтрокаСодержимого, "=");
    
    Если ПозицияРавно > 0 Тогда
        Ключ = Лев(СтрокаСодержимого, ПозицияРавно - 1);
        Значение = Сред(СтрокаСодержимого, ПозицияРавно + 1);
        
        // Удаляем кавычки из значения
        Значение = СтрЗаменить(Значение, """", "");
        
        СоответствиеДанных.Вставить(Ключ, Значение);
    КонецЕсли;
КонецЦикла;

Разберем методы, которые мы здесь использовали: СтрНайти позволяет определить позицию разделителя в строке, Лев и Сред помогают филигранно вырезать нужные фрагменты, а СтрЗаменить очищает данные от «мусора» в виде кавычек.

Решение 2: Приведение к формату XML

Если вам критически важно использовать встроенные возможности платформы для работы с XML, можно произвести «препроцессинг» файла. Если файл небольшой, мы можем считать его целиком в строку, заменить переносы строк на пробелы и дописать недостающие закрывающие теги. После такой манипуляции файл станет валидным, и вы сможете использовать метод ПолучитьАтрибут().

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

Почему использование соответствия — это правильно?

Использование объекта Соответствие — это наиболее эффективный способ хранения пар ключ-значение. Во-первых, это дает нам возможность мгновенного доступа к нужному значению по известному ключу (через метод Получить), во-вторых, мы полностью абстрагируемся от порядка следования данных в файле. Даже если в будущем формат файла изменится и ключи поменяются местами, наш код останется работоспособным.

Рекомендации по дальнейшей автоматизации

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

Теперь вы знаете, как быстро и надежно извлечь данные из файлов с нестандартной структурой. Сочетание функций СтрНайти, Лев, Сред и использование Соответствие поможет вам автоматизировать любую задачу по парсингу данных!

← На главную