При интеграции 1С:Предприятия 7.7 с современными конфигурациями 1С 8.х (например, при загрузке реестров зарплаты из ЗУП 3 или документов формата ЕГАИС/ЭСЧФ) разработчики часто сталкиваются с ошибками разбора XML-файлов. Типичный сценарий — попытка прочитать файл через стандартную внешнюю компоненту v7plus.dll с помощью объекта AddIn.XMLParser, которая завершается ошибкой вида:
Type '{http://v8.1c.ru/edi/edi_stnd/109}СчетПК' is not found in Schema
Разберем детально, почему возникает данная ошибка и какими способами можно организовать корректную обработку XML-документов с пространствами имен и строгой типизацией в среде 1С 7.7.
Проанализируем механизм работы парсера. Компонента v7plus.dll под капотом использует системную библиотеку Windows MSXML. Начиная с версии MSXML 4.0, парсер при обнаружении атрибута xsi:type из пространства имен XML Schema Instance автоматически переходит в режим валидации типов данных по схеме.
Если в заголовке XML-документа объявлены пространства имен схемы, но сама схема XSD не была явно загружена и передана парсеру, компонент не может сопоставить тип и прерывает чтение с фатальной ошибкой. В компоненте v7plus.dll возможности гибкого отключения валидации сильно ограничены, что делает разбор таких файлов стандартным методом СоздатьДокумент() невозможным без предварительной модификации файла.
Рассмотрим основные и надежные варианты решения этой задачи.
Наиболее стабильный и современный подход для 1С 7.7 — отказ от устаревшей компоненты v7plus.dll в пользу прямого вызова системного COM-объекта MSXML2.DOMDocument. Это позволяет напрямую управлять параметрами разбора: отключить проверку схемы, резолв внешних ссылок и настроить работу с пространствами имен через XPath.
Разберем по шагам реализацию данного подхода:
СоздатьОбъект(). Рекомендуется использовать конкретную системную версию MSXML2.DOMDocument.6.0 с перехватом исключения на случай старых операционных систем.async = 0.validateOnParse = 0 и резолв внешних схем свойством resolveExternals = 0.SelectionNamespaces.Посмотрим на пример программного кода:
Попытка
DOM = СоздатьОбъект("MSXML2.DOMDocument.6.0");
Исключение
DOM = СоздатьОбъект("MSXML2.DOMDocument");
КонецПопытки;
DOM.async = 0;
DOM.validateOnParse = 0;
DOM.resolveExternals = 0;
Если DOM.load(ИмяФайлаЗагрузки) = 0 Тогда
Сообщить("Ошибка разбора XML: " + DOM.parseError.reason, "!");
Возврат;
КонецЕсли;
// Указываем пространство имен для выборки узлов через XPath
DOM.setProperty("SelectionNamespaces", "xmlns:ns=""http://v8.1c.ru/edi/edi_stnd/109""");
// Выбираем узлы документа
Узлы = DOM.selectNodes("//ns:СчетаПК");
Для Индекс = 0 По Узлы.length - 1 Цикл
ТекущийУзел = Узлы.item(Индекс);
// Чтение данных узла
КонецЦикла;
Если в проекте критически важно остаться в рамках компоненты v7plus.dll, можно обойти загрузку всего DOM-дерева в память и применить потоковое последовательное чтение. Объект последовательного чтения не выполняет строгую валидацию по схеме при открытии файла.
Посмотрим, как выглядит инициализация такого парсера:
Если ЗагрузитьВнешнююКомпоненту("v7plus.dll") = 0 Тогда
Предупреждение("Не удалось загрузить v7plus.dll!");
Возврат;
КонецЕсли;
Анализатор = СоздатьОбъект("AddIn.XMLParser");
ФайлДанных = Анализатор.СоздатьПоследовательноСчитываемыйДокумент();
ФайлДанных.СвязатьСФайлом(ИмяФайлаЗагрузки);
// Переход к последовательному обходу тегов
Пока ФайлДанных.Прочитать() = 1 Цикл
// Обработка текущего элемента
КонецЦикла;
Если структура документа строго регламентирована и у вас в наличии есть файл схемы XSD (например, при обмене электронными счетами-фактурами или работе со стандартами обмена), мы можем явно передать коллекцию схем в объект AddIn.XMLParser перед чтением или формированием данных.
Рассмотрим пример инициализации документа с привязкой схемы:
Анализатор = СоздатьОбъект("AddIn.XMLParser");
Коллекция = Анализатор.СоздатьКоллекциюСхем();
// Добавляем схему с указанием целевого пространства имен
Коллекция.ДобавитьСхему("http://v8.1c.ru/edi/edi_stnd/109", КаталогИБ() + "Schemas\Schema.xsd");
ДокументXML = Анализатор.СоздатьДокумент();
ДокументXML.Кодировка = "UTF-8";
ДокументXML.РазрешатьВнешниеСсылки = 1;
ДокументXML.Схемы = Коллекция;
ДокументXML.Загрузить(ИмяФайлаЗагрузки);
В ситуациях, когда файл сформирован внешней системой некорректно или схема недоступна, а парсинг необходимо выполнить стандартными средствами без модификации логики чтения, можно программно удалить объявления пространств имен и атрибутов xsi:type перед парсингом. Для этого текст файла предварительно обрабатывается через регулярные выражения с использованием COM-объекта VBScript.RegExp.
Удалению подлежат следующие шаблоны:
xmlns(:\w+)?="[^"]*"xsi:type="[^"]*"После очистки текстового содержимого XML парсится как обычный документ без типизации схемы.