|
Чтение из 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
|
Писал на скорую руку пример,... я не претендую на супероптимальность
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |