Имя: Пароль:
1C
1С v8
Чтение из XML
0 scanduta
 
22.10.13
16:15
Есть файлик структуры

РеквизитШапки1
РеквизитШапки2
-ТЗ
  -Строка1
    -Рек1
    -Рек2
  -Строка2
    -Рек1
    -Рек2


Нужно программно считать в 1с этот файл. То есть просто на основании файла заполнить ТЗ.
Я раньше программно никогда из XML не считывал данные. Есть у кого пример как сделать. А то какая то фигня получается
1 Ёпрст
 
22.10.13
16:17
пользуй объект ЧтениеXML
2 Ёпрст
 
22.10.13
16:17
и его методы.
3 scanduta
 
22.10.13
16:18
щас так считываю строки

Пока ЧтениеXML.Прочитать() Цикл

      Если ЧтениеXML.Имя = "ТЗ" Тогда
                
        НоваяСтрока = ПрочиеОперации.Добавить();
                    
         КонецЕсли;
конецЦикла;
4 scanduta
 
22.10.13
16:18
А вот как считать реквизиты ТЧ не понимаю
5 Maxus43
 
22.10.13
16:19
Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл(ПутьКФайлу);

Пока Чтение.Прочитать() Цикл // Прочитать «структурные части» элементов.

    // Проверить, какая часть элемента – текущая.
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        ИмяУзла = Чтение.Имя;
        
        Сообщить("--" + ИмяУзла);

        // Атрибуты элементов можно читать только если текущая часть – начало элемента
        Пока Чтение.ПрочитатьАтрибут() Цикл

            // Прочитать данные узла атрибута.
            ТипУзла  = Чтение.ТипУзла;
            Имя      = Чтение.Имя;
            Значение = Чтение.Значение;
    
        // Обработать полученные значения.
        //    ...
        
        КонецЦикла;
        
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда    

        // В примере просто выводим текст в окно сообщений.    
        Сообщить("Текст:" + Чтение.Значение);
        
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

        // В примере просто выводим признак конца элемента
        // в окно сообщений
        Сообщить("--Конец:" + Чтение.Имя);
        
    КонецЕсли;    
    
КонецЦикла    
(с)
6 Rie
 
22.10.13
16:19
(4) Углубись в элемент с тегом "ТЗ". (Если я правильно понял твою структуру файла).
7 scanduta
 
22.10.13
16:28
(5) чет не взлетает
8 scanduta
 
22.10.13
16:34
Вложенные элементы не читаются
9 Maxus43
 
22.10.13
16:36
(8) потому что это 3-й уровень, в примере углубляется только на 2 уровня
10 ptiz
 
22.10.13
16:41
Функция ПрочитатьXMLВДеревоЗначений(ИмяФайла)
    
    ДЗ = Новый ДеревоЗначений;
    ДЗ.Колонки.Добавить("Реквизит");
    ДЗ.Колонки.Добавить("Тип");
    ДЗ.Колонки.Добавить("Значение");
    
    Реквизит = "";
    
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ИмяФайла);
    Строки = ДЗ.Строки;
    Строки.Очистить();
    НоваяСтрока = ДЗ;
    Пока Чтение.Прочитать() Цикл
        
        ТипУзла = Чтение.ТипУзла;
        Если ТипУзла = ТипУзлаXML.НачалоЭлемента
            ИЛИ ТипУзла = ТипУзлаXML.КонецЭлемента
            Тогда
            Реквизит = СокрЛП(Чтение.Имя);
        КонецЕсли;
        
        Значение = СокрЛП(Чтение.Значение);
        
        Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            НоваяСтрока = НоваяСтрока.Строки.Добавить();
            НоваяСтрока.Реквизит = Реквизит;
            НоваяСтрока.Тип = "Узел";
            Если Чтение.КоличествоАтрибутов() <> 0 Тогда
                Строки = НоваяСтрока.Строки;
                Пока Чтение.ПрочитатьАтрибут() Цикл
                    Атрибут = Строки.Добавить();
                    Атрибут.Реквизит = Чтение.Имя;
                    Атрибут.Значение = Чтение.Значение;
                    Атрибут.Тип = "Атрибут";
                КонецЦикла;
            КонецЕсли;
        ИначеЕсли ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Если НоваяСтрока.Родитель = Неопределено Тогда
                НоваяСтрока = ДЗ;
            Иначе
                НоваяСтрока = НоваяСтрока.Родитель;
            КонецЕсли;
        Иначе
            НоваяСтрока.Значение = Значение;
        КонецЕсли;
    КонецЦикла;
    Чтение.Закрыть();    
    
    Возврат ДЗ;
    
КонецФункции // ПрочитатьXMLВДеревоЗначений(ИмяФайла)
11 scanduta
 
22.10.13
16:46
(10)не работает
12 scanduta
 
22.10.13
16:47
Блин документацию бы какую нибудь
13 Ёпрст
 
22.10.13
16:47
Alt+F1 в пофигураторе
14 Зойч
 
22.10.13
16:47
проще через xdto
15 Зойч
 
22.10.13
16:48
там 2 строчки кода всего
16 scanduta
 
22.10.13
16:49
Блин киньте, если у кого есть пример считывания 3-х уровневой таблицы XML
17 scanduta
 
22.10.13
16:51
Просто не понимаю как влезть в нужный уровень,
18 Ёпрст
 
22.10.13
16:57
Ну, можешь и через ДокументDOM лепить, там есть
ПолучитьЭлементыПоИмени - сразу попадешь на нужный уровень и выгребаешь элементы тока нужного уровня..
19 ptiz
 
22.10.13
16:58
(11) Сочувствую.
20 Ёпрст
 
22.10.13
16:58
а так, на нимфостарте полно поделок
и с рекурсией и без..
типа такого:

http://infostart.ru/public/84254/
21 scanduta
 
22.10.13
17:02
(20) Да блин зачем мне эти загрузки вы че шутите что  ли
22 scanduta
 
22.10.13
17:04
Мне нужно просто пример как считать элементы следующего уровня, и все
23 Ёпрст
 
22.10.13
17:04
(20) а что не устраивает ?
Там чтение xml в дерево.. вам не это разве нужно ?
24 Ёпрст
 
22.10.13
17:04
(22) тупо рекурсией.
25 Ёпрст
 
22.10.13
17:05
если это элемент - вызов рекурсивной функции и привет.
26 scanduta
 
22.10.13
17:05
(25) ну пример кода можно плиз
27 scanduta
 
22.10.13
17:05
че т у меня не получается
28 scanduta
 
22.10.13
17:05
задача горит
29 ptiz
 
22.10.13
17:06
(28) Дай пример файла, с которым не справляется код из (10).
30 scanduta
 
22.10.13
17:08
<?xml version="1.0" encoding="UTF-8"?>
-<ВыгрузкаПрочиеОперации><Организация>Открытое акционерное общество "***"</Организация><Документ>ДОК 00000526 от 22.10.2013 9:33:32</Документ>-<ПрочиеОперацииТЗ>-<Строка_1><СчетУчетаБУ_Код>57.2</СчетУчетаБУ_Код><КПП_Контрагента>555555555</КПП_Контрагента><ИНН_Контрагента>1000000000</ИНН_Контрагента><НомерДоговора/><ДатаДоговора/><ВидДоговоровСТГ>ПустойВидДоговораСТГ</ВидДоговоровСТГ></Строка_1>-<Строка_2><СчетУчетаБУ_Код>57.2</СчетУчетаБУ_Код><КПП_Контрагента>ПустоеКПП</КПП_Контрагента><ИНН_Контрагента>ПустоеИНН</ИНН_Контрагента><НомерДоговора/><ДатаДоговора/><ВидДоговоровСТГ>ПустойВидДоговораСТГ</ВидДоговоровСТГ></Строка_2></ПрочиеОперацииТЗ></ВыгрузкаПрочиеОперации>
31 ptiz
 
22.10.13
17:12
(30) Во-первых, тут ошибка.
В строке:
"-<ВыгрузкаПрочиеОперации>"

не должно быть первого символа "-", иначе это неверный XML.

А во-вторых, после этого исправления всё прекрасно читается.
32 ЧессМастер
 
22.10.13
17:14
ребят а как тэги когда вставлять чтобы код с плюсиком получался ?
33 scanduta
 
22.10.13
17:14
(31) Что значит неверный а если у меня нескколько ТЧ
34 scanduta
 
22.10.13
17:14
будет
35 scanduta
 
22.10.13
17:17
Вообщем нужен простой алгоритм считывания 3-х уровнего XML
36 Maxus43
 
22.10.13
17:18
(31) он в браузере открыл xml просто, там это просто показывается, можно сворачивать. в самом файле нет такого конечно
37 ptiz
 
22.10.13
17:18
Ладно, добрый я под вечер (код из (10) в виде обработки)
https://dl.dropboxusercontent.com/u/67681686/ЧтениеXMLвДЗ.epf
38 scanduta
 
22.10.13
17:19
да не нужно мне обработка, сколько раз говорю :


нужен простой алгоритм считывания 3-х уровнего XML
39 Maxus43
 
22.10.13
17:20
(38) дают готовую, ещё не нравится. Вот нихренаж себе
40 ЧессМастер
 
22.10.13
17:23
(37)

подскажи пожалуйста такую вещь (если ты добрый) :)))

как програмно вставить в заголовок XML файла код базы приемника ?

я делаю вот так

ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
    
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла);
    
// нужный узел
Узел = ПланыОбмена.Полный.НайтиПоКоду("РБ2");
    
ЗаписьСообщения.НачатьЗапись(Запись, Узел);
    
Выб = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель,ЗаписьСообщения.НомерСообщения);
    
Счетчик = 0;
    
Пока Выб.Следующий() Цикл
  Объект = Выб.Получить();
        
  Счетчик = Счетчик + 1;
        
  ЗаписатьXML(Запись, Объект);
    
  Сообщить(Объект);

КонецЦикла;

ЗаписьСообщения.ЗакончитьЗапись();
Запись.Закрыть();    

Сообщить("Обработка завершена !");
Сообщить("Выгружено " + Счетчик);

в результате получаю загловок XML типа

<v8msg:Header>
<v8msg:ExchangePlan>Полный</v8msg:ExchangePlan>
<v8msg:To>РБ2</v8msg:To>
<v8msg:From>-</v8msg:From>
<v8msg:MessageNo>1</v8msg:MessageNo>
<v8msg:ReceivedNo>0</v8msg:ReceivedNo>
</v8msg:Header>

то есть в строке From нет кода базы в которую выгружается

правильно должно быть
<v8msg:From>РБ2</v8msg:From>

но как программно записать в строку From код куда выгружается файл ?
41 ptiz
 
22.10.13
17:26
(40) Посмотри в табло:
ПланыОбмена.Полный.ЭтотУзел().Код

Наверное, он и выгружается.
42 ЧессМастер
 
22.10.13
17:50
(41) ага гляну

еще вопрос можно ?

на что влияет включение строк
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/data";);    

зачем они нужны ?
43 Serginio1
 
22.10.13
19:05
44 Rie
 
22.10.13
19:30
(42) Если ЗаписьXML - то особо ни на что. Там обычно фиксированы namespace. И не проверяются.
45 scanduta
 
22.10.13
20:34
Вообщем замутил вот так все работает:

Пока ЧтениеXML.Прочитать() Цикл
                
                Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                    
                    Если Найти(ЧтениеXML.Имя,"Строка")<>0 Тогда
                        
                         СчетУчетаБУ_Код="";
                         ИНН_Контрагента="";
                         КПП_Контрагента="";
                         НомерДоговора="";
                         ДатаДоговора=Дата(1,1,1);
                         ВидДоговоровСТГ="";
                        
                         НоваяСтрока=ПрочиеОперации.Добавить();
                         ИмяКолонки="Строка";
                        
                    ИначеЕсли ЧтениеXML.Имя="СчетУчетаБУ_Код" Тогда
                         ИмяКолонки="СчетУчетаБУ_Код";
                    ИначеЕсли ЧтениеXML.Имя="ИНН_Контрагента" Тогда
                         ИмяКолонки="ИНН_Контрагента";
                    ИначеЕсли ЧтениеXML.Имя="КПП_Контрагента" Тогда
                         ИмяКолонки="КПП_Контрагента";
                    ИначеЕсли ЧтениеXML.Имя="НомерДоговора" Тогда
                         ИмяКолонки="НомерДоговора";
                    ИначеЕсли ЧтениеXML.Имя="ДатаДоговора" Тогда
                         ИмяКолонки="ДатаДоговора";
                    ИначеЕсли ЧтениеXML.Имя="ВидДоговоровСТГ" Тогда
                         ИмяКолонки="ВидДоговоровСТГ";
                    КонецЕсли;
                    
                        
                    Сообщить("Начало элемента: "+ЧтениеXML.Имя);
                    
                ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
                    
                    Если ИмяКолонки="СчетУчетаБУ_Код" Тогда
                        СчетУчетаБУ_Код=ЧтениеXML.Значение;    
                    ИначеЕсли ИмяКолонки="ИНН_Контрагента" Тогда
                         ИНН_Контрагента=ЧтениеXML.Значение;    
                    ИначеЕсли ИмяКолонки="КПП_Контрагента" Тогда
                         КПП_Контрагента=ЧтениеXML.Значение;    
                    ИначеЕсли ИмяКолонки="НомерДоговора" Тогда
                         НомерДоговора=ЧтениеXML.Значение;    
                    ИначеЕсли ИмяКолонки="ДатаДоговора" Тогда
                         ДатаДоговора=ЧтениеXML.Значение;    
                    ИначеЕсли ИмяКолонки="ВидДоговоровСТГ" Тогда
                         ВидДоговоровСТГ=ЧтениеXML.Значение;    
                    КонецЕсли;
    
                    
                                            
                    Сообщить("Текст элемента: "+ЧтениеXML.Значение);

                ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
                    
                     Сообщить("Конец элемента: "+ЧтениеXML.Имя);
                    
                     Если Найти(ЧтениеXML.Имя,"Строка")<>0 Тогда

                         НоваяСтрока.СчетУчетаБУ_Код=СчетУчетаБУ_Код;
                         НоваяСтрока.ИНН_Контрагента=ИНН_Контрагента;
                         НоваяСтрока.КПП_Контрагента=КПП_Контрагента;
                         НоваяСтрока.НомерДоговора =НомерДоговора;
                         НоваяСтрока.ДатаДоговора=ДатаДоговора;
                         НоваяСтрока.ВидДоговоровСТГ=ВидДоговоровСТГ;
                        
                     КонецЕсли;
                    
                КонецЕсли;
                
            КонецЦикла;
46 H A D G E H O G s
 
22.10.13
20:48
"Я сотрудник франча - позор 1с"

Неплохо так.

p.s. Если вы не знаете как писать - смотрите типовые. ЧСХ - там все есть, и даже постройка ДЗ по файлу XML и макету.
47 scanduta
 
22.10.13
20:49
(46) Меня мой код полностью устраивает, а то что я выложил только образец как делать
48 scanduta
 
22.10.13
20:51
(46) Что не нравиться то ?
49 scanduta
 
22.10.13
20:51
ИМХО это самый простой и быстрый вариант.
50 H A D G E H O G s
 
22.10.13
20:53
(47) Это то понятно. После нас хоть потоп.

Как минимум вот это портянка

                    ИначеЕсли ЧтениеXML.Имя="СчетУчетаБУ_Код" Тогда
                         ИмяКолонки="СчетУчетаБУ_Код";
                    ИначеЕсли ЧтениеXML.Имя="ИНН_Контрагента" Тогда
                         ИмяКолонки="ИНН_Контрагента";
                    ИначеЕсли ЧтениеXML.Имя="КПП_Контрагента" Тогда
                         ИмяКолонки="КПП_Контрагента";
                    ИначеЕсли ЧтениеXML.Имя="НомерДоговора" Тогда
                         ИмяКолонки="НомерДоговора";
                    ИначеЕсли ЧтениеXML.Имя="ДатаДоговора" Тогда
                         ИмяКолонки="ДатаДоговора";
                    ИначеЕсли ЧтениеXML.Имя="ВидДоговоровСТГ" Тогда
                         ИмяКолонки="ВидДоговоровСТГ";
                    КонецЕсли;
51 scanduta
 
22.10.13
20:53
(50)Ты что предлагаешь?
52 scanduta
 
22.10.13
20:56
Просто ты наверное не в курсе что мне не все колонки нужно загружать, а они могут в хмл добовляться
53 H A D G E H O G s
 
22.10.13
21:00
(52) Это никак не меняет дело.
54 zavrik
 
22.10.13
21:00
(52) Тебе как бы предлагают заменить на

Если ЧтениеXML.Имя="СчетУчетаБУ_Код" или ЧтениеXML.Имя="ИНН_Контрагента" или ЧтениеXML.Имя="КПП_Контрагента" или ЧтениеXML.Имя="НомерДоговора" или ЧтениеXML.Имя="ДатаДоговора" или ЧтениеXML.Имя="ВидДоговоровСТГ"
                         ИмяКолонки=ЧтениеXML.Имя;
                    КонецЕсли;

Вряд ли это хуже.
55 zavrik
 
22.10.13
21:01
(54) или ЧтениеXML.Имя="ВидДоговоровСТГ" Тогда
56 scanduta
 
22.10.13
21:04
О господи... Да Вы просто чудо оптимизаторы кода.
57 H A D G E H O G s
 
22.10.13
21:04
(54) Еще один.
58 scanduta
 
22.10.13
21:05
(53) Еще как меняет
59 scanduta
 
22.10.13
21:06
Ладо уж че спорить, когда проблема решена, знатоки повылазили. Где ж вы раньше были
60 Мимохожий Однако
 
22.10.13
21:07
(48)Индийский код форева!
61 zavrik
 
22.10.13
21:07
(57) Ну ему же почему-то не нравится

ИмяКолонки=ЧтениеXML.Имя;
62 scanduta
 
22.10.13
21:08
Критиковать легко ....продолжайте
63 scanduta
 
22.10.13
21:10
Писал на скорую руку пример,... я не претендую на супероптимальность