Используется парсер msxml 6, соответственно, целевая платформа - Windows
&НаКлиентеНаСервереБезКонтекста Функция ФорматироватьТекстСообщения(ТекстСообщения) Возврат ""+ТекущаяДата()+": "+ТекстСообщения+Символы.ПС; КонецФункции // Куда = 0 - в сообщения пользователю // Куда = 1 - в протокол // Куда = 2 - в протокол и в сообщения пользователю &НаКлиенте Процедура ВывестиСообщение(Сообщ,Куда=1,Форматировать=Ложь) Если Форматировать Тогда ТекСообщ=ФорматироватьТекстСообщения(Сообщ); Иначе ТекСообщ=Сообщ+Символы.ПС; КонецЕсли; Если (Куда=0) ИЛИ (Куда=2) Тогда Сообщить(ТекСообщ,СтатусСообщения.ОченьВажное); КонецЕсли; Если (Куда=1) ИЛИ (Куда=2) Тогда Протокол=Протокол+ТекСообщ; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВывестиОшибкуРазбораХМЛ(Ошибка,Куда,Форматировать) ВывестиСообщение(" ",Куда,Форматировать); ВывестиСообщение("Обнаружена ошибка:",Куда,Форматировать); ВывестиСообщение("Смещение = "+Формат(Ошибка.filepos,"ЧГ=0")+", строка = "+Формат(Ошибка.line,"ЧГ=0")+", позиция = "+Формат(Ошибка.linepos,"ЧГ=0")+", код ошибки: "+Формат(Ошибка.errorCode,"ЧГ=0"),Куда,Форматировать); ВывестиСообщение("Описание ошибки: "+Ошибка.reason,Куда,Форматировать); КонецПроцедуры &НаКлиенте Функция ПроверкаПоСхемеКлиент(ИмяФайла,ИмяФайлаСхемы,ВыводитьВсеОшибки=Истина) Куда=1; Форматировать=Ложь; РезПроверки=Ложь; Если Не ЗначениеЗаполнено(ИмяФайла) Тогда Возврат РезПроверки; КонецЕсли; Если НЕ ЗначениеЗаполнено(ИмяФайлаСхемы) Тогда // Не удалось извлечь файл схемы Возврат РезПроверки; КонецЕсли; Попытка Схема=Новый COMОбъект("MSXML2.XMLSchemaCache.6.0"); Исключение ВывестиСообщение("Не удалось создать объект XMLSchemaCache (возможно, не установлен MSXML 6)",2); Возврат РезПроверки; КонецПопытки; Попытка Схема.add("",ИмяФайлаСхемы); Исключение ВывестиСообщение("Не удалось подключить схему: "+ИмяФайлаСхемы,2); Схема=Неопределено; Возврат РезПроверки; КонецПопытки; Попытка ДОМ=Новый COMОбъект("MSXML2.DOMDocument.6.0"); Исключение ВывестиСообщение("Не удалось создать объект DOMDocument (возможно, не установлен MSXML 6)",2); Схема=Неопределено; Возврат РезПроверки; КонецПопытки; ДОМ.schemas=Схема; ДОМ.async=Ложь; ДОМ.validateOnParse=Истина; ДОМ.resolveExternals=Истина; Если ВыводитьВсеОшибки Тогда ДОМ.SetProperty("MultipleErrorMessages",Истина); КонецЕсли; ДОМ.load(ИмяФайла); Если (ДОМ.parseError.errorCode<>0) Тогда // ошибки при проверке правильности ВывестиСообщение("При проверке по схеме выявлены ошибки!",Куда,Форматировать); Если ВыводитьВсеОшибки Тогда Для каждого parseError из ДОМ.parseError.AllErrors Цикл ВывестиОшибкуРазбораХМЛ(parseError,Куда,Форматировать); КонецЦикла; Иначе ВывестиОшибкуРазбораХМЛ(ДОМ.parseError,Куда,Форматировать); КонецЕсли; Иначе ВывестиСообщение("Файл успешно прошёл проверку по схеме!",Куда,Форматировать); РезПроверки=Истина; КонецЕсли; Схема=Неопределено; ДОМ=Неопределено; Возврат РезПроверки; КонецФункции