При работе с XML-документами в среде 1С 7.7 разработчики часто сталкиваются с необходимостью проверки файлов на соответствие определенным правилам — XSD-схемам. Для этого традиционно используется объект MSXML2.XMLSchemaCache. Однако нередко возникает ситуация, когда метод add отказывается принимать файл схемы, не выдавая при этом информативной ошибки. Проанализируем основные причины этой проблемы и разберем по шагам алгоритм её решения.
Для начала рассмотрим типовой код инициализации кэша схем в 1С 7.7. Важно использовать актуальную версию библиотеки MSXML (в данном случае 6.0), так как она поддерживает современные стандарты безопасности и парсинга.
Процедура ПодключитьСхему()
Попытка
Схема = СоздатьОбъект("MSXML2.XMLSchemaCache.6.0");
Сообщить("Объект кэша схем успешно создан");
Исключение
Сообщить("Ошибка при создании MSXML2.XMLSchemaCache.6.0. Проверьте регистрацию библиотеки в системе.", "!");
Возврат;
КонецПопытки;
ПутьКСхеме = "C:\my_folder\schema.xsd";
// Попробуем добавить схему в кэш
Попытка
// Первый параметр - URI пространства имен (Namespace)
// Второй параметр - путь к файлу
Схема.add("", ПутьКСхеме);
Сообщить("Схема успешно подключена");
Исключение
Сообщить("Не удалось подключить схему: " + ПутьКСхеме, "!");
КонецПопытки;
КонецПроцедуры
Если на этапе Схема.add возникает исключение, хотя файл существует и доступен, необходимо приступить к детальной диагностике. Одной из самых частых причин является "невидимая" ошибка внутри самой структуры XSD или несоответствие параметров вызова метода.
1. Соответствие Target Namespace
Метод add(NamespaceURI, URL) крайне чувствителен к первому параметру. Выясним причину возможного конфликта. Если внутри вашего XSD-файла в корневом элементе xs:schema определен атрибут targetNamespace, то при вызове метода вы ОБЯЗАНЫ передать это значение в качестве первого параметра. Если в схеме пространство имен не указано, передается пустая строка "". Если передать "" для схемы, в которой прописан targetNamespace, MSXML выдаст ошибку.
2. Получение детальной информации об ошибке через DOMDocument
Стандартный XMLSchemaCache в 1С 7.7 не сообщает, что именно ему не понравилось в файле. Чтобы проанализировать ситуацию глубже, мы можем заставить систему распарсить XSD как обычный XML-файл. Выясним, на какой строке и по какой причине происходит сбой.
// Вспомогательный код для диагностики XSD
Док = СоздатьОбъект("MSXML2.DOMDocument.6.0");
Док.async = 0;
Док.load(ПутьКСхеме);
Если Док.parseError.errorCode <> 0 Тогда
Сообщить("Ошибка в структуре XSD!");
Сообщить("Причина: " + Док.parseError.reason);
Сообщить("Строка: " + Док.parseError.line);
Сообщить("Текст ошибки: " + Док.parseError.srcText);
КонецЕсли;
Проанализируем влияние кодировки. Платформа 1С 7.7 работает в однобайтовой кодировке Windows-1251. В то же время файлы XSD обычно создаются в UTF-8. Рассмотрим возможные коллизии:
xml version="1.0" encoding="UTF-8" не указана кодировка, парсер может ошибочно принять его за ANSI.encoding="utf-8", но сам файл физически сохранен в 1251, возникнет ошибка.Версия библиотеки 6.0 является наиболее строгой в плане безопасности. Посмотрим на критичные настройки, которые могут блокировать схему:
xs:import или xs:include), MSXML 6.0 может заблокировать их загрузку из соображений безопасности. В этом случае необходимо явно разрешить внешние связи.Добавление схемы в кэш — это лишь первый этап. Чтобы реально проверить ваш XML-документ, нужно связать кэш с объектом документа. Рассмотрим полный пример кода:
Процедура ВыполнитьВалидацию(ПутьКФайлуXML, ПутьКСхеме)
// 1. Создаем кэш схем
Схемы = СоздатьОбъект("MSXML2.XMLSchemaCache.6.0");
// Предположим, Namespace не используется
Попытка
Схемы.add("", ПутьКСхеме);
Исключение
Сообщить("Ошибка загрузки XSD: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// 2. Создаем документ для проверки
xmlДок = СоздатьОбъект("MSXML2.DOMDocument.6.0");
xmlДок.async = 0;
// Назначаем кэш схем документу
xmlДок.schemas = Схемы;
// 3. Загружаем и проверяем
Если xmlДок.load(ПутьКФайлуXML) = 0 Тогда
// Если load вернул 0, значит валидация не прошла
Ошибка = xmlДок.parseError;
Сообщить("Файл не соответствует схеме!");
Сообщить("Ошибка: " + Ошибка.reason);
Сообщить("В строке: " + Ошибка.line);
Иначе
Сообщить("Валидация успешно пройдена!");
КонецЕсли;
КонецПроцедуры
Если вы убедились, что пути верны, кодировка UTF-8 на месте, а пространство имен указано правильно, но схема всё равно не загружается — причина может крыться в использовании элементов стандарта XSD 1.1. Библиотека MSXML поддерживает только стандарт XSD 1.0.
Проанализируем ситуацию: некоторые современные генераторы схем добавляют конструкции, которые MSXML считает недопустимыми. В этом случае помогает пересохранение схемы через специализированные сервисы (например, VisualXSD или онлайн-валидаторы), которые приводят структуру к классическому виду, удаляя лишние префиксы и исправляя последовательности xs:sequence. Если после такой "очистки" схема начала подключаться в 1С, значит исходный файл содержал синтаксические нарушения, невидимые для обычного текстового редактора.
Подводя итог, при возникновении проблем с XMLSchemaCache в 1С 7.7, всегда начинайте с проверки синтаксиса через DOMDocument.parseError и внимательного сопоставления targetNamespace. Это сэкономит время и позволит быстро найти "узкое место" в интеграции.