Как корректно настроить и использовать XML-парсинг в 1С 7.7, чтобы он заработал без ошибок?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Решение 1: Использование MSXML и DOM-модели для парсинга XML

Основным инструментом для работы с XML-документами в 1С 7.7 является компонент Microsoft XML Core Services (MSXML), который предоставляется операционной системой. Мы будем использовать его объектную модель документа (DOM) для загрузки и навигации по XML. В некоторых случаях удобно сразу автоматизировать процесс, используя импорт XML во временный справочник, что позволяет работать с данными через стандартные запросы 1С.

  1. Создание объекта DOMDocument:

    Для начала нам необходимо создать экземпляр объекта DOMDocument. Рекомендуется указывать конкретную версию, например, MSXML2.DOMDocument.6.0, так как это обеспечивает лучшую производительность и предсказуемость поведения по сравнению с более старыми или общими версиями.

    XML_DOM = CreateObject("MSXML2.DOMDocument.6.0");

    Здесь XML_DOM — это переменная, в которую мы помещаем созданный объект. Версия 6.0 обычно работает быстрее и имеет расширенный функционал по сравнению с версиями 3.0 или 4.0.

  2. Загрузка XML-файла и обработка ошибок:

    После создания объекта мы загружаем XML-файл с помощью метода Load(). Крайне важно сразу же проверять результат загрузки на наличие ошибок, используя свойство parseError. Этот объект предоставляет детальную информацию о том, что пошло не так.

    
    XML_DOM.Load(ИмяФайла);
    
    Если XML_DOM.parseError.errorCode <> 0 Тогда
        // Если БезСообщ = 0 - это условная переменная для управления выводом сообщений
        Если БезСообщ = 0 Тогда
            Сообщить("Невозможно прочитать XML-файл: " + ИмяФайла + " " + XML_DOM.parseError.reason);
        КонецЕсли;
        Возврат ""; // Возвращаем пустую строку или другое значение, сигнализирующее об ошибке
    КонецЕсли;
    

    Мы видим, что XML_DOM.parseError.errorCode содержит числовой код ошибки, а XML_DOM.parseError.reason — текстовое описание причины. Это значительно упрощает отладку и понимание, почему парсинг не удался.

  3. Настройка XPath для навигации:

    Для удобной навигации по XML-документу и выборки данных мы будем использовать язык запросов XPath. Для этого необходимо установить свойство SelectionLanguage объекта XML_DOM.

    XML_DOM.setProperty("SelectionLanguage", "XPath");

    Теперь мы можем использовать методы, такие как selectSingleNode() и selectNodes(), с XPath-выражениями для выбора нужных элементов.

  4. Получение корневого элемента и обработка исключений:

    После успешной загрузки и настройки XPath, мы можем попытаться получить корневой элемент документа. Для этого используем метод DocumentElement.selectSingleNode("/*"). Важно обернуть эту операцию в блок Попытка...Исключение, так как документ может быть невалидным или пустым.

    
    Попытка
        nodDoc = XML_DOM.DocumentElement.selectSingleNode("/*");
    Исключение
        Сообщить("Не верный или пустой XML-файл: " + ИмяФайла);
        Возврат "";
    КонецПопытки;
    

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

Решение 2: Работа с кодировками, в частности UTF-8

Одной из самых частых проблем при работе с XML в 1С 7.7 является некорректная обработка кодироввок, особенно UTF-8. Встроенные средства 1С 7.7 не всегда корректно работают с этой кодировкой, что приводит к "кракозябрам" или ошибкам парсинга.

  1. Проблема 1С 7.7 и UTF-8:

    Исторически 1С 7.7 была ориентирована на кодировку Windows-1251. При попытке прочитать UTF-8 файл напрямую, возникают сложности. Мы должны обеспечить, чтобы кодировка, указанная в XML-декларации (например, <?xml version="1.0" encoding="UTF-8"?>), соответствовала фактической кодировке файла, и что парсер правильно ее интерпретирует.

  2. Использование ADODB.Stream для работы с кодировками:

    Одним из наиболее надежных способов работы с различными кодировками в 1С 7.7 является использование объекта ADODB.Stream. Этот объект позволяет считывать или записывать файлы, явно указывая их кодировку.

    Рассмотрим пример чтения XML-файла в кодировке UTF-8 с помощью ADODB.Stream:

    
    Попытка
        Stream = СоздатьОбъект("ADODB.Stream");
        Stream.Type = 2; // adTypeText - для работы с текстовыми данными
        Stream.Charset = "UTF-8"; // Указываем кодировку UTF-8
        Stream.Open();
        Stream.LoadFromFile(ИмяФайла);
        ТекстXML = Stream.ReadText();
        Stream.Close();
    Исключение
        Сообщить("Ошибка при чтении файла с кодировкой UTF-8: " + ОписаниеОшибки());
        Возврат "";
    КонецПопытки;
    
    // Теперь ТекстXML содержит содержимое файла в корректной кодировке,
    // и его можно передать в MSXML_DOM.loadXML(ТекстXML)
    

    Аналогично, ADODB.Stream можно использовать для записи текста в файл с нужной кодировкой. Это очень полезно, если вы генерируете XML-файлы, которые должны быть в UTF-8. Дополнительные примеры работы со строками и файлами можно найти в библиотеке процедур и функций для платформы 7.7.

  3. Альтернативные компоненты:

    Мы также можем встретить упоминания о компонентах v7plus и FormEx. Компонента v7plus является стандартной для 1С 7.7 и расширяет ее функционал, но может иметь ограничения по работе с UTF-8. FormEx — это сторонняя компонента, которая предлагает более продвинутые средства для работы с файлами и кодировками, иногда более эффективно решая проблему UTF-8.

Решение 3: Валидация XML и проблемы со структурой (DTD)

Часто проблемы парсинга связаны не с кодом 1С, а с самим XML-файлом. Мы разберем, как проверять валидность XML и что делать с определениями типа документа (DTD).

  1. Проверка валидности XML:

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

  2. Проблемы с DTD (Document Type Definition):

    Иногда XML-файл содержит объявление DTD, например: <!DOCTYPE yml_catalog SYSTEM "shops.dtd">. DTD используется для определения структуры и содержимого XML-документа. Если указанный DTD-файл недоступен по указанному пути, содержит ошибки или не соответствует самому XML-документу, парсер может выдать ошибку валидации.

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

    Важно: Удаление DTD отключает проверку структуры документа, что может быть нежелательно в некоторых случаях. Однако, это часто решает проблему "неожиданных" ошибок парсинга.

    Также существуют XSD (XML Schema Definition), которые являются более современной и мощной альтернативой DTD для описания структуры XML.

  3. Пространства имен (Namespaces):

    Неправильное объявление или использование пространств имен в XML также может привести к ошибкам парсинга или некорректной выборке данных с помощью XPath. Убедитесь, что пространства имен в вашем XML-файле объявлены корректно и последовательно используются в ваших XPath-запросах.

Решение 4: Использование MSScriptControl для расширения возможностей

В некоторых случаях, когда стандартные возможности 1С 7.7 не позволяют работать с OLE-объектами так, как хотелось бы, или когда требуется выполнить скрипт на VBScript или JScript, на помощь приходит объект MSScriptControl.ScriptControl.

  1. Что такое MSScriptControl.ScriptControl:

    Этот объект позволяет встраивать и выполнять скрипты на VBScript или JScript непосредственно из 1С 7.7. Это открывает широкие возможности для взаимодействия с COM-объектами, их методами и свойствами. Для тех, кто работает с современными форматами данных, полезно будет изучить модуль «Трансформер» для конвертации JSON/XML/CSV/TOON, который расширяет границы привычного парсинга в 1С.

  2. Применение в XML-парсинге:

    В нашем исходном примере MSScriptControl используется для получения контекста выполнения (Это = Скрипт.Eval("this")), что иногда требуется для корректной работы с некоторыми свойствами или методами OLE-объектов. Например, это может быть полезно для работы с коллекциями или специфическими типами данных, возвращаемыми MSXML.

    
    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.language = "vbscript"; // Указываем язык скрипта
    Это = Скрипт.Eval("this"); // Получаем контекст выполнения
    

    Хотя в данном случае установка SelectionLanguage может быть выполнена и напрямую через XML_DOM.setProperty(), использование MSScriptControl демонстрирует его потенциал для более сложных сценариев взаимодействия с OLE-объектами.

Общие рекомендации и важные моменты

Для успешного и эффективного XML-парсинга в 1С 7.7, мы должны учитывать несколько дополнительных аспектов:

  1. Работа с большими XML-файлами:

    Помните, что DOM-модель (MSXML2.DOMDocument) загружает весь XML-файл целиком в оперативную память. Это может стать серьезной проблемой для очень больших файлов (более 10-20 МБ). Примером сложной, но эффективной реализации может служить загрузка данных контрагентов из ЕГР Беларусь, где файл разбирается средствами 1С с соблюдением требований к структуре.

  2. Ограничения метода Сообщить():

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

  3. Отладка и логирование:

    Всегда используйте возможности отладки. Объект XML_DOM.parseError — ваш лучший друг при диагностике проблем с XML. Логируйте коды ошибок и их описания, чтобы быстро выявлять и устранять причины неудачного парсинга.

  4. Согласование версий MSXML:

    Как мы уже упоминали, всегда указывайте конкретную версию MSXML2.DOMDocument.6.0 при создании объекта. Это помогает избежать проблем совместимости, если на разных машинах установлены разные версии MSXML, и обеспечивает предсказуемое поведение вашего кода.

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

← На главную