Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Как организовать проверку XSD - XML ?

v7: Как организовать проверку XSD - XML ?
Я
   Владимир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) Тогда
        Протокол=Протокол+ТекСообщ;
    КонецЕсли;
    
КонецПроцедуры//ВывестиСообщение()
   Serginio1
 
8 - 12.01.18 - 14:49
   Владимир1С
 
9 - 12.01.18 - 15:14
Спасибо, буду внедрять!

Список тем форума
Рекламное место пустует  Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует