|
v7: Как организовать проверку XSD - XML ? | ☑ | ||
---|---|---|---|---|
0
Владимир1С
12.01.18
✎
13:55
|
Проверить раз - другой в редакторе проблем не составит. Как в 1С 7.7 сделать это программно? Какой механизм можно использовать?
|
|||
1
Злопчинский
12.01.18
✎
14:35
|
Соответствующий
|
|||
2
Злопчинский
12.01.18
✎
14:37
|
кстати, успешная валидация по схеме совсем не означает, что файл успешно пройдет в том же операторе ЭД.
|
|||
3
Злопчинский
12.01.18
✎
14:38
|
ПолноеИмяФайла = локПапкаОбмена+ИмяФайлаОбмена+".xml";
ТекстВыгрузкиДанных.Записать(ПолноеИмяФайла); Сообщить(""+ВыбДокумент+", "+ВыбДокумент.Контрагент,"i"); Сообщить("успешно выгружен в "+ПолноеИмяФайла,"i"); ИмяСхемы = КаталогИБ()+"XSD.DIR\ON_SFAKT_1_897_01_05_01_01.xsd"; Если ФС.СуществуетФайл(ИмяСхемы)=0 Тогда Сообщить("Внимание: отсутствует формальная схема эл.счета-фактуры, проверка файла не выполняется...","!"); Возврат; КонецЕсли; Результат = ВалидацияХМЛпоСхеме(ПолноеИмяФайла,ИмяСхемы,10); Если Результат<>0 Тогда Сообщить("Информация: сформированный файл обмена успешно прошел проверку на соответсвие формальной схеме...","i"); Иначе Сообщить("Ошибка: сформированный файл обмена НЕ ПРОШЕЛ проверку на соответсвие формальной схеме, есть ошибки...","!"); КонецЕсли; |
|||
4
Злопчинский
12.01.18
✎
14:38
|
//======================================================================
// Функция ВалидацияХМЛпоСхеме(ИмяФайла,ИмяСхемы,КолвоВыводимыхОшибок=1) Попытка Схема=СоздатьОбъект("MSXML2.XMLSchemaCache.6.0"); Исключение Сообщить("Не удалось создать объект XMLSchemaCache","!"); Возврат 0; КонецПопытки; Попытка Схема.add("",ИмяСхемы); Исключение Сообщить("Не удалось подключить схему: "+ИмяСхемы,"!"); Возврат 0; КонецПопытки; Попытка ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0"); Исключение Сообщить("Не удалось создать объект DOMDocument","!"); Возврат 0; КонецПопытки; ДОМ.schemas=Схема; ДОМ.async=0; ДОМ.validateOnParse=-1; ДОМ.resolveExternals=-1; Если (КолвоВыводимыхОшибок>1) Тогда ДОМ.SetProperty("MultipleErrorMessages",-1); КонецЕсли; ДОМ.load(ИмяФайла); Если (ДОМ.parseError.errorCode<>0) Тогда // ошибки при проверке правильности ВывестиСообщение("При проверке по схеме файла "+ИмяФайла+" выявлены ошибки!",0); Если (КолвоВыводимыхОшибок>1) Тогда Для НомОш=0 По ДОМ.parseError.allErrors.length-1 Цикл parseError=ДОМ.parseError.allErrors.item(НомОш); ВывестиОшибкуРазбораХМЛ(parseError); Если НомОш>=КолвоВыводимыхОшибок Тогда ВывестиСообщение("...и еще "+(ДОМ.parseError.allErrors.length-1-НомОш)+" ошибок",0); Прервать; КонецЕсли; КонецЦикла; Иначе ВывестиОшибкуРазбораХМЛ(ДОМ.parseError); КонецЕсли; Возврат 0; КонецЕсли; ДОМ=""; Возврат 1; КонецФункции //ВалидацияХМЛпоСхеме() |
|||
5
Злопчинский
12.01.18
✎
14:39
|
//======================================================================
// Процедура ВывестиОшибкуРазбораХМЛ(Ошибка) ВывестиСообщение("",0); ВывестиСообщение("Обнаружена ошибка:",0); ВывестиСообщение("Смещение = "+Ошибка.filepos+", строка = "+Ошибка.line+", позиция = "+Ошибка.linepos+", код ошибки = "+Ошибка.errorCode,0); ВывестиСообщение("Описание ошибки: "+Ошибка.reason,0); КонецПроцедуры //ВывестиОшибкуРазбораХМЛ |
|||
6
Злопчинский
12.01.18
✎
14:39
|
а, ну и .. это...
"наш гений дарит вам"... |
|||
7
Злопчинский
12.01.18
✎
14:40
|
//======================================================================
// Функция ФорматироватьТекстСообщения(ТекстСообщения) Возврат ""+ТекущаяДата()+" "+ТекущееВремя()+": "+ТекстСообщения+РазделительСтрок; КонецФункции //ФорматироватьТекстСообщения //====================================================================== // Куда = 0 - в сообщения пользователю // Куда = 1 - в протокол // Куда = 2 - в протокол и в сообщения пользователю // Процедура ВывестиСообщение(Сообщ,Куда=1,Форматировать=0) Если (Форматировать=1) Тогда ТекСообщ=ФорматироватьТекстСообщения(Сообщ); Иначе //[*]progadmin, 11.07.2013, ДОБАВЛЕНО НЕТИПОВОЕ // ТекСообщ=Сообщ+РазделительСтрок; // ------------- ТекСообщ=Сообщ; //[*]_progadmin, 11.07.2013, ДОБАВЛЕНО НЕТИПОВОЕ КонецЕсли; Если (Куда=0) ИЛИ (Куда=2) Тогда Сообщить(ТекСообщ,"!"); КонецЕсли; Если (Куда=1) ИЛИ (Куда=2) Тогда Протокол=Протокол+ТекСообщ; КонецЕсли; КонецПроцедуры //ВывестиСообщение() |
|||
8
Serginio1
12.01.18
✎
14:49
|
||||
9
Владимир1С
12.01.18
✎
15:14
|
Спасибо, буду внедрять!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |