При работе с файлами XML в 1С 7.7 многие разработчики сталкиваются с различными трудностями, начиная от проблем с кодировками и заканчивая ошибками валидации. В этом руководстве мы подробно разберем, как эффективно парсить XML-документы, используя стандартные средства, библиотеки универсальных функций и дополнительные компоненты, а также как решать наиболее распространенные проблемы.
Мы вместе пройдем по ключевым шагам, рассмотрим примеры кода и выясним причины возникновения ошибок, чтобы ваш XML-парсинг работал стабильно и предсказуемо. Для тех, кто ищет готовое решение «из коробки», может подойти простая обработка для разбора XML-файла, которая наглядно показывает базовые принципы работы.
Основным инструментом для работы с XML-документами в 1С 7.7 является компонент Microsoft XML Core Services (MSXML), который предоставляется операционной системой. Мы будем использовать его объектную модель документа (DOM) для загрузки и навигации по XML. В некоторых случаях удобно сразу автоматизировать процесс, используя импорт XML во временный справочник, что позволяет работать с данными через стандартные запросы 1С.
Создание объекта DOMDocument:
Для начала нам необходимо создать экземпляр объекта DOMDocument. Рекомендуется указывать конкретную версию, например, MSXML2.DOMDocument.6.0, так как это обеспечивает лучшую производительность и предсказуемость поведения по сравнению с более старыми или общими версиями.
XML_DOM = CreateObject("MSXML2.DOMDocument.6.0");
Здесь XML_DOM — это переменная, в которую мы помещаем созданный объект. Версия 6.0 обычно работает быстрее и имеет расширенный функционал по сравнению с версиями 3.0 или 4.0.
Загрузка 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 — текстовое описание причины. Это значительно упрощает отладку и понимание, почему парсинг не удался.
Настройка XPath для навигации:
Для удобной навигации по XML-документу и выборки данных мы будем использовать язык запросов XPath. Для этого необходимо установить свойство SelectionLanguage объекта XML_DOM.
XML_DOM.setProperty("SelectionLanguage", "XPath");
Теперь мы можем использовать методы, такие как selectSingleNode() и selectNodes(), с XPath-выражениями для выбора нужных элементов.
Получение корневого элемента и обработка исключений:
После успешной загрузки и настройки XPath, мы можем попытаться получить корневой элемент документа. Для этого используем метод DocumentElement.selectSingleNode("/*"). Важно обернуть эту операцию в блок Попытка...Исключение, так как документ может быть невалидным или пустым.
Попытка
nodDoc = XML_DOM.DocumentElement.selectSingleNode("/*");
Исключение
Сообщить("Не верный или пустой XML-файл: " + ИмяФайла);
Возврат "";
КонецПопытки;
Таким образом, мы гарантируем, что даже если файл будет иметь некорректную структуру, наше приложение не завершится аварийно.
Одной из самых частых проблем при работе с XML в 1С 7.7 является некорректная обработка кодироввок, особенно UTF-8. Встроенные средства 1С 7.7 не всегда корректно работают с этой кодировкой, что приводит к "кракозябрам" или ошибкам парсинга.
Проблема 1С 7.7 и UTF-8:
Исторически 1С 7.7 была ориентирована на кодировку Windows-1251. При попытке прочитать UTF-8 файл напрямую, возникают сложности. Мы должны обеспечить, чтобы кодировка, указанная в XML-декларации (например, <?xml version="1.0" encoding="UTF-8"?>), соответствовала фактической кодировке файла, и что парсер правильно ее интерпретирует.
Использование 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.
Альтернативные компоненты:
Мы также можем встретить упоминания о компонентах v7plus и FormEx. Компонента v7plus является стандартной для 1С 7.7 и расширяет ее функционал, но может иметь ограничения по работе с UTF-8. FormEx — это сторонняя компонента, которая предлагает более продвинутые средства для работы с файлами и кодировками, иногда более эффективно решая проблему UTF-8.
Часто проблемы парсинга связаны не с кодом 1С, а с самим XML-файлом. Мы разберем, как проверять валидность XML и что делать с определениями типа документа (DTD).
Проверка валидности XML:
Прежде чем пытаться парсить XML в 1С, всегда полезно проверить его на валидность. Мы можем просто открыть XML-файл в любом современном браузере. Если же вам нужно убедиться, что два файла имеют идентичную структуру и данные, можно использовать специализированную обработку для сравнения xml-файлов.
Проблемы с 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.
Пространства имен (Namespaces):
Неправильное объявление или использование пространств имен в XML также может привести к ошибкам парсинга или некорректной выборке данных с помощью XPath. Убедитесь, что пространства имен в вашем XML-файле объявлены корректно и последовательно используются в ваших XPath-запросах.
В некоторых случаях, когда стандартные возможности 1С 7.7 не позволяют работать с OLE-объектами так, как хотелось бы, или когда требуется выполнить скрипт на VBScript или JScript, на помощь приходит объект MSScriptControl.ScriptControl.
Что такое MSScriptControl.ScriptControl:
Этот объект позволяет встраивать и выполнять скрипты на VBScript или JScript непосредственно из 1С 7.7. Это открывает широкие возможности для взаимодействия с COM-объектами, их методами и свойствами. Для тех, кто работает с современными форматами данных, полезно будет изучить модуль «Трансформер» для конвертации JSON/XML/CSV/TOON, который расширяет границы привычного парсинга в 1С.
Применение в XML-парсинге:
В нашем исходном примере MSScriptControl используется для получения контекста выполнения (Это = Скрипт.Eval("this")), что иногда требуется для корректной работы с некоторыми свойствами или методами OLE-объектов. Например, это может быть полезно для работы с коллекциями или специфическими типами данных, возвращаемыми MSXML.
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "vbscript"; // Указываем язык скрипта
Это = Скрипт.Eval("this"); // Получаем контекст выполнения
Хотя в данном случае установка SelectionLanguage может быть выполнена и напрямую через XML_DOM.setProperty(), использование MSScriptControl демонстрирует его потенциал для более сложных сценариев взаимодействия с OLE-объектами.
Для успешного и эффективного XML-парсинга в 1С 7.7, мы должны учитывать несколько дополнительных аспектов:
Работа с большими XML-файлами:
Помните, что DOM-модель (MSXML2.DOMDocument) загружает весь XML-файл целиком в оперативную память. Это может стать серьезной проблемой для очень больших файлов (более 10-20 МБ). Примером сложной, но эффективной реализации может служить загрузка данных контрагентов из ЕГР Беларусь, где файл разбирается средствами 1С с соблюдением требований к структуре.
Ограничения метода Сообщить():
При выводе очень длинных строк с помощью Сообщить(), мы можем столкнуться с ограничением на максимальный размер строки в 1С 7.7. Для вывода больших объемов текста рассмотрите запись в файл или использование других механизмов логирования.
Отладка и логирование:
Всегда используйте возможности отладки. Объект XML_DOM.parseError — ваш лучший друг при диагностике проблем с XML. Логируйте коды ошибок и их описания, чтобы быстро выявлять и устранять причины неудачного парсинга.
Согласование версий MSXML:
Как мы уже упоминали, всегда указывайте конкретную версию MSXML2.DOMDocument.6.0 при создании объекта. Это помогает избежать проблем совместимости, если на разных машинах установлены разные версии MSXML, и обеспечивает предсказуемое поведение вашего кода.
Следуя этим рекомендациям и подробно разбирая каждый шаг, мы сможем эффективно настроить и использовать XML-парсинг в 1С 7.7, решая большинство возникающих проблем.