Имя: Пароль:
1C
1C 7.7
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
Спасибо, буду внедрять!