Имя: Пароль:
1C
1C 7.7
v7: Обход XML 1с 7.7
,
0 kupec
 
20.07.20
16:03
Добрый день. Может ли кто-нибудь поделиться кодом для обхода xml документа. Чтобы обойти все узлы и атрибуты, так скажем прочитать XML. Заранее спасибо. Буду очень благодарен.
1 azernot
 
20.07.20
16:06
2 kupec
 
20.07.20
16:10
Спасибо, я это видел. Там конкретное позиционирование на конкретные узлы и атрибуты. А есть какая то универсальная обработка для чтения любого XML?
3 Garykom
 
гуру
20.07.20
16:19
(2) DOM или SAX ?
4 Злопчинский
 
20.07.20
18:16
(2)  есть. Минут через 40 буду дома и скину
Процедура простая рекурсивная строк 20—30
5 Злопчинский
 
20.07.20
18:51
//**************************************************************************************
//
Процедура прТестовоеЧтение()
    
    Если ПустаяСтрока(ВыбФайл)=1
    Тогда
        Сообщить("тестовое чтение файла обмена: не задано имя файла..?","i");
        Возврат;
    КонецЕсли;    
        
    оТест =  СоздатьОбъект("Microsoft.XMLDOM");
    оТест.Load(ВыбФайл);
    Корень = оТест.DocumentElement;
    ОчиститьОкноСообщений();
    прПечатьУзлов(оТест, Корень, 0);
    
КонецПроцедуры //прТестовоеЧтение()
6 Злопчинский
 
20.07.20
18:52
//**************************************************************************************
//
Процедура прПечатьУзлов(xmlDoc, Узел, Уровень=0)
    Состояние(Уровень);
    
    ЧислоДетей = Узел.childNodes.length;
    Для Инд=1 По ЧислоДетей    Цикл
        
        ТекУзел= Узел.childNodes.item(Инд-1);
        Если ТекУзел.nodeType<>1 Тогда Продолжить; КонецЕсли;
        
        Стр = Формат("","С"+Уровень*8);
        
        СтрАтрибуты="";
        
        Для Инд2=1 По Узел.attributes.length Цикл
            Атрибут=Узел.attributes.item(Инд2-1);
            СтрАтрибуты=СтрАтрибуты+?(СтрАтрибуты="","",";")+Атрибут.nodename+"="+Атрибут.value;
        КонецЦикла;
        
        Текст="";
        Если (ТекУзел.childNodes.length=1) and (ТекУзел.childNodes.item(0).nodetype=3) Тогда
            Текст=ТекУзел.childNodes.item(0).text;
        КонецЕсли;
        
        Стр=Стр+ТекУзел.tagName+?(СтрАтрибуты="","","("+СтрАтрибуты+")" ) + ":" +Текст;
        Сообщить(Стр);
        прПечатьУзлов(xmlDoc, ТекУзел, Уровень+1);
    КонецЦикла;
    
    Состояние("");
КонецПроцедуры //прПечатьУзлов()
7 Garykom
 
гуру
20.07.20
18:54
(6) Уверен что это взлетит при размере XML файлика под гиг?
8 Злопчинский
 
20.07.20
18:56
(7) хз.. вряд ли кто станет такой хренью читать файл под гиг.
но если файлик есть - давай, попробую
9 Duke1C
 
21.07.20
08:56
(8) Боюсь, окно сообщений лопнет от такого файлика))
10 kupec
 
21.07.20
09:38
Спасибо, думаю это то что надо
11 Ленинград
 
21.07.20
09:42
(9) не лопнет, но тормозить начнет
12 kupec
 
21.07.20
10:04
Мой файл не читает, ошибку выдает на первой же строке

        Если (ТекУзел.childNodes.length=1) and (ТекУзел.childNodes.item(0).nodetype=3) Тогда
            Текст=ТекУзел.childNodes.item(0).text;
        КонецЕсли;

Вот этом месте кода
13 kupec
 
21.07.20
10:10
Добавил этот блок в Попытку-Исключение, заработало
Можно пояснить, что означает этот блок, я так понимаю, он читает значение атрибута?
14 kupec
 
21.07.20
10:12
некоторые атрибуты не выводит
15 kupec
 
21.07.20
10:18
<СвОЭДОтпр НаимОрг="ООО "Компания "Тензор"" ИдЭДО="2BE" ИННЮЛ="7605016030"/> вот на этом рушится
16 Злопчинский
 
21.07.20
14:53
(15) потому что кавычки внутри кавычек - это ненормально.
17 Злопчинский
 
21.07.20
14:54
(13) нет, не атрибута.
он читает текст типа <СуммНал>420.00</СуммНал> - текст внутри тега
18 Злопчинский
 
21.07.20
17:08
(14) выводит все нормально.
у меня эта процедура используется для тестового просмотра во всяких загрузках, читает выводит все нормально.
вот как раз сейчас Гиперглобус поправлял

Order-Header:
        OrderNumber:22217678
        OrderDate:2020-07-21
        ExpectedDeliveryDate:2020-07-24
        ExpectedDeliveryTime:09:00
        Currency:RUB
        DocumentFunctionCode:O
Order-Parties:
        Buyer:
                ILN:4680387000006
        Seller:
                ILN:4607172169991
                CodeByBuyer:26705
        DeliveryPoint:
                ILN:4680387000006
                Name:Логистика
                StreetAndNumber:г.Пушкино,Красноармейское ш. 107/1
                CityName:Пушкинский район
                PostalCode:141211
                Country:RU
                PhoneNumber:495 223-75-00
                LocationNumber:5600
        Invoicee:
                ILN:4690202000005
Order-Lines:
        Line:
                Line-Item:
                        LineNumber:1
19 kupec
 
22.07.20
08:21
(16) т.е. если есть кавычки то функция не работает?
20 Garykom
 
гуру
22.07.20
08:57
21 trad
 
22.07.20
09:26
(12) при length=0 ошибка при обращении к .item(0)
22 kupec
 
22.07.20
09:33
(21) поправил. Заработало. Только все равно не все узлы и атрибуты выводит.
23 kupec
 
22.07.20
09:38
https://yadi.sk/d/2v0wk2dE-bc_gA
Попробуйте данным кодом прочитать этот файл
24 Злопчинский
 
22.07.20
11:55
(23) угу, атрибуты не читает в комплексных типах,
это уже вечером только покопаюсь
25 Злопчинский
 
22.07.20
11:56
ИдСв:
                                СвЮЛУч:
                        Адрес:
                                АдрРФ:
26 Злопчинский
 
22.07.20
11:56
атрибуты в СвЮЛУч и АдрРФ не прочитал
27 trad
 
22.07.20
12:03
28 kupec
 
22.07.20
12:40
(27) Спасибо
29 Serginio1
 
22.07.20
14:11
30 Злопчинский
 
22.07.20
16:37
(28) поправленное, вроде разбирает
.
Процедура прПечатьУзлов(xmlDoc, Узел, Уровень=0)
    Состояние(Уровень);
    
    ЧислоДетей = Узел.childNodes.length;
    Для Инд=1 По ЧислоДетей Цикл
        
        ТекУзел = Узел.childNodes.item(Инд-1);
        Если ТекУзел.nodeType<>1 Тогда Продолжить; КонецЕсли;
        
        Отступ = Формат("","С"+Уровень*8);
        СтрАтрибуты="";
        
        Для Инд2=1 По ТекУзел.attributes.length Цикл
            Атрибут=ТекУзел.attributes.item(Инд2-1);
            СтрАтрибуты=СтрАтрибуты+?(СтрАтрибуты="","",";")+Атрибут.nodename+"="+Атрибут.value;
        КонецЦикла;
        
        Текст="";
        Если ТекУзел.childNodes.length=1 Тогда
            Если ТекУзел.childNodes.item(0).nodetype=3 Тогда
                Текст=ТекУзел.childNodes.item(0).text;
            КонецЕсли;    
        КонецЕсли;
        
        Стр = Отступ+ТекУзел.tagName+?(СтрАтрибуты="","","("+СтрАтрибуты+")" ) + ":" +Текст;
        Сообщить(Стр);
        
        прПечатьУзлов(xmlDoc, ТекУзел, Уровень+1);
    КонецЦикла;
    
    Состояние("");
КонецПроцедуры //прПечатьУзлов()
31 Злопчинский
 
22.07.20
16:37
//**************************************************************************************
//
Процедура прТестовоеЧтение()
    
    Если ПустаяСтрока(ВыбФайл)=1 Тогда
        Сообщить("тестовое чтение файла обмена: не задано имя файла..?","i");
        Возврат;
    КонецЕсли;    
        
    оТест =  СоздатьОбъект("Microsoft.XMLDOM");
    оТест.Load(ВыбФайл);
    Корень = оТест.DocumentElement;
    ОчиститьОкноСообщений();
    прПечатьУзлов(оТест, Корень, 0);
    
КонецПроцедуры //прТестовоеЧтение()
32 Злопчинский
 
22.07.20
16:38
апшипачка была здесь:
.
       Для Инд2=1 По ТекУзел.attributes.length Цикл  //ТекУзел, было Узел
            Атрибут=ТекУзел.attributes.item(Инд2-1); //ТекУзел, было Узел