Имя: Пароль:
1C
1С v8
прочитать файл xml
0 evg61
 
18.09.14
15:15
Уважаемые коллеги, здравствуйте!
Возникла необходимость прочитать xml-файл.
Файл таков:
<?xml version="1.0" encoding="windows-1251"?>
<ТранспортныеНакладные>
<ТранспортнаяНакладная НомерТТН="73810" ДатаТТН="20140909" Сумма="16441"/>
<ТранспортнаяНакладная НомерТТН="74089" ДатаТТН="20140909" Сумма="10967"/>
<ТранспортнаяНакладная НомерТТН="74121" ДатаТТН="20140909" Сумма="22080"/>
<ТранспортнаяНакладная НомерТТН="74147" ДатаТТН="20140909"  Сумма="21013"/>
</ТранспортныеНакладные>

Пробую решить задачу без XDTO. Здесь на форуме приводился код:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);
   Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        ИмяУзла = Чтение.Имя; Сообщить("--" + ИмяУзла);
        Пока Чтение.ПрочитатьАтрибут() Цикл
            // Прочитать данные узла атрибута.
            // Обработать полученные значения.
        КонецЦикла;
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
        // В примере просто выводим текст в окно сообщений.
        Сообщить("Текст:" + Чтение.Значение);
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
        // В примере просто выводим признак конца элемента
        // в окно сообщений Сообщить("--Конец:" + Чтение.Имя);
    КонецЕсли;
КонецЦикла;

Этим кодом я читаю информацию о всех накладных, кроме первой. Код не находит ТипУзлаXML.НачалоЭлемента Почему так получается не разобрался. Можете подсказать в чём дело?
Спасибо!
1 КонецЦикла
 
18.09.14
15:27
Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если Чтение.Имя = "ТранспортнаяНакладная" Тогда
                Если Чтение.КоличествоАтрибутов() > 0 Тогда
                    Пока Чтение.ПрочитатьАтрибут() Цикл
                        Если Чтение.Имя = "НомерТТН" Тогда
                            ....
                        КонецЕсли;

                    КонецЦикла;
                КонецЕсли;
            КонецЕсли;
2 Балоун
 
18.09.14
15:29
больше так не ври
http://i.imgur.com/eueDOpn.png
3 Барматолог
 
18.09.14
15:48
(0) XDTO?
4 evg61
 
18.09.14
15:52
Люди, спасибо! Насчёт приврать - ни в коем случае!

Дописал в код анализ типа узла и соответственно выдача сообщения о типе. Вот что выдаёт у меня в окне служебных сообщений:

КонецЭлемента -
НачалоЭлемента - ТранспортнаяНакладная
КонецЭлемента -
НачалоЭлемента - ТранспортнаяНакладная
КонецЭлемента -
НачалоЭлемента - ТранспортнаяНакладная
КонецЭлемента -
КонецЭлемента -

Платформа у меня 8.1
5 evg61
 
18.09.14
15:53
В том то и дело, что не находит начало первого элемента...
6 Балоун
 
18.09.14
15:54
а ну-ка наугад..

Чтение.Прочитать();
Пока Чтение.Прочитать() Цикл
7 evg61
 
18.09.14
15:59
Результат:
НачалоЭлемента - ТранспортнаяНакладная
КонецЭлемента -
НачалоЭлемента - ТранспортнаяНакладная
КонецЭлемента -
НачалоЭлемента - ТранспортнаяНакладная
КонецЭлемента -
КонецЭлемента -

:-))))))))))))))
8 Балоун
 
18.09.14
16:00
году в 9м со мной такое было. что это было, я не помню
9 evg61
 
18.09.14
16:02
Спасибо за помощь!
10 evg61
 
18.09.14
16:03
Попробую использовать XDTO...
11 Зеленый пень
 
18.09.14
16:05
Функция ПрочитатьXMLВДеревоЗначений(ИмяФайла)
    
    ДЗ = Новый ДеревоЗначений;
    ДЗ.Колонки.Добавить("Реквизит");
    ДЗ.Колонки.Добавить("Тип");
    ДЗ.Колонки.Добавить("Значение");
    
    Реквизит = "";
    
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ИмяФайла);
    Строки = ДЗ.Строки;
    Строки.Очистить();
    НоваяСтрока = ДЗ;
    Пока Чтение.Прочитать() Цикл
        
        ТипУзла = Чтение.ТипУзла;
        Если ТипУзла = ТипУзлаXML.НачалоЭлемента
            ИЛИ ТипУзла = ТипУзлаXML.КонецЭлемента
            Тогда
            Реквизит = СокрЛП(Чтение.Имя);
        КонецЕсли;
        
        Значение = СокрЛП(Чтение.Значение);
        
        Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            НоваяСтрока = НоваяСтрока.Строки.Добавить();
            НоваяСтрока.Реквизит = Реквизит;
            НоваяСтрока.Тип = "Узел";
            Если Чтение.КоличествоАтрибутов() <> 0 Тогда
                Строки = НоваяСтрока.Строки;
                Пока Чтение.ПрочитатьАтрибут() Цикл
                    Атрибут = Строки.Добавить();
                    Атрибут.Реквизит = Чтение.Имя;
                    Атрибут.Значение = Чтение.Значение;
                    Атрибут.Тип = "Атрибут";
                КонецЦикла;
            КонецЕсли;
        ИначеЕсли ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Если НоваяСтрока.Родитель = Неопределено Тогда
                НоваяСтрока = ДЗ;
            Иначе
                НоваяСтрока = НоваяСтрока.Родитель;
            КонецЕсли;
        Иначе
            НоваяСтрока.Значение = Значение;
        КонецЕсли;
    КонецЦикла;
    Чтение.Закрыть();    
    
    Возврат ДЗ;
    
КонецФункции // ПрочитатьXMLВДеревоЗначений(ИмяФайла)
12 evg61
 
18.09.14
16:07
Балоун, вопрос, а на какой платформе выполнялось действие? По картинке это интерфейс не 8.1....
13 evg61
 
18.09.14
16:11
Зелёный пень, спасибо! Занести данные xml в таблицу я сделал сразу. Вопрос был несколько в другом. Я попробую конструкции приведённые в Вашем коде.

Люди, прошу прощения, вынужден уйти! Ещё раз всем спасибо за помощь!!!!
14 Барматолог
 
18.09.14
16:13
XDTO [x]
15 Балоун
 
18.09.14
16:14
(12) в 9м году у меня была 8.1
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший