Имя: Пароль:
1C
1С v8
Как быстро считать файл XML по схеме XSD в таблицу значений?
0 adelaide
 
18.06.14
17:31
Есть поставщик, он по API выдает прайс в XML, я сгенерировал схему файла XSD мне нужно быстро преобразовать этот файл в ТЗ, знаю про способ через ЧтениеXML, но он не самый быстрый имхо:

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);
Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
....  

Есть что побыстрее?

Собственно вот кусок XML который мне нужно преобразовать в ТЗ:

<Price>
<product artikul="DCS101" barcode="085854226929" ..... url="" />
....
<product artikul="" barcode="6942941815029" .... url="" />
</Price>
1 adelaide
 
18.06.14
17:34
можно не в тз, можно в массив сути не меняет, мне просто по схеме надо преобразовать XML в списочный тип 1С.
2 Bober
 
18.06.14
17:41
(0) как вариант через документ DOM, там поиск элементов по "product" и считывание-заполнение тз.
3 adelaide
 
18.06.14
17:42
Вроде нашел решение:

    СхемаXML = Новый СхемаXML;
    СхемаXML.РасположениеСхемы = "C:\Users\prog1c\Documents\111\price.xsd";
    
    СхемыXML = Новый НаборСхемXML;
    СхемыXML.Добавить(СхемаXML);
    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.ОткрытьФайл("C:\Users\prog1c\AppData\Local\Temp\6\r.txt");
    
    Фабрика = Новый ФабрикаXDTO(СхемыXML);
    Данные = Фабрика.ПрочитатьXML(ЧтениеXML);
4 adelaide
 
18.06.14
17:44
(3) Да, то что надо, спасибо юзеру Jaap Vduul
из темы: v8: Чтение xml по схеме xsd

Можно закрывать, поиск рулит =)
5 DS
 
18.06.14
17:48
>> Есть поставщик, он по API выдает прайс в XML
Веб-сервис, чтоли? Так есть способы красивее...
6 Serginio1
 
18.06.14
17:55
(3) Можно проще через СоздатьФабрикуXDTO
7 Maxus43
 
18.06.14
17:57
а если в конфу xdto пакет добавить - файл схемы не нужен будет
8 adelaide
 
18.06.14
17:59
(6) покажи как
(7) я тупой, у меня так не получилось, туплю во втором параметре:
ФабрикаXDTO.Тип("http://урл_пространства_имен";, что_тут_писать?);
если пишу имя пакета, то возвращает Неопределено.
9 adelaide
 
18.06.14
17:59
(5) вебсервис но без WSDL
10 Maxus43
 
18.06.14
18:00
импортировал схему в xdto пакет в конфигураторе? не макет. xdto пакет. в общих.
там и урл написан
11 H A D G E H O G s
 
18.06.14
18:01
Я правильно понимаю, что при чтении через XDTO файл хреначиться в область памяти сразу, махом, без построчного добавления?
12 adelaide
 
18.06.14
18:02
(10) да, импортировал пакет, урл прописан, пробовал делать:  ФабрикаXDTO.Тип("http://урл_пространства_имен";, "Имя_пакета")
13 adelaide
 
18.06.14
18:02
возвращает неопределено
14 acsent
 
18.06.14
18:03
(11) конечно, ибо объект создается
15 Serginio1
 
18.06.14
18:18
(8)
Фабрика = СоздатьФабрикуXDTO("C:\Users\prog1c\Documents\111\price.xsd");
16 Serginio1
 
18.06.14
18:20
(8) ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)
17 Serginio1
 
18.06.14
18:21
16 + тьфу Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)
18 blopp
 
18.06.14
18:24
(11) Если вызывать чтение стоя на начале первого элемента файла - то конечно считается все целиком.

Но фабрикой можно тоже по частям читать - начало элемента явно через ЧтениеXML, а то что внутри - фабрикой.
19 Serginio1
 
18.06.14
18:38
(11) нет. Если в документе много объектов то считвается только один объект. Например

ЧтениеXML=Новый ЧтениеXML;
  
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ЧтениеXML.ПерейтиКСодержимому();
  
ЧтениеXML.Прочитать();

Пока ЧтениеXML.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл


ОбъектXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));

КонецЦикла;

ЧтениеXML.Закрыть();
20 Fragster
 
гуру
18.06.14
18:45
кто-нибудь осилил магию представления XML из (0) сразу в ТЗ по колонкам и строкам, без цикла, только через пакеты XDTO и схемы?
21 Bober
 
18.06.14
18:51
(20) пока не видел живого примера со схемой xml и тз.
22 Serginio1
 
18.06.14
19:16
(20) А смысл? Ты также работаешь с объектом как и с тз.
В принципе не проблема используя ИзXMLТипа создать типы колонок
23 Fragster
 
гуру
18.06.14
19:21
(22) смысл меньше букв в загрузке в базу. теоретически через XSLT можно преобразовать исходный XML к ValueTable из http://v8.1c.ru/8.1/data/core и все. Но может есть способ проще.
24 Serginio1
 
18.06.14
19:30
(23) С каких это букв меньше? Тоже самое.
ОбъектXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));
25 Serginio1
 
18.06.14
19:32
(24) Ты сначала должен преобразовать к ValueTable, а затем применить ПрочитатьXML
26 Fragster
 
гуру
18.06.14
19:38
(24)  да, но ОбъектXDTO не запихаешь параметром в запрос как ТЗ, или не запишешь в базу, например, как документ какой-ниубдь.
27 Serginio1
 
18.06.14
19:49
Объект=СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
Объект.Записать();


А так согласен. Просто задачи такой не было. Да и ОбъектXDTO может быть весьмя сложной структурой ввиде дерева
28 Fragster
 
гуру
18.06.14
19:54
(27) вот именно, что "сложной структурой". просто эта структура нам известна, и неплохо бы эту структуру сразу в определенный объект преобразовать, а не в абстрактный ОбъектXDTO, из которого через постобработку получать ТЗ, ДокументОбъект и прочее
29 Serginio1
 
19.06.14
11:50
(28) У меня обмен между конфигурациями на ОбъектахXDTO так быстрее. Причем выгружается сразу в схему загружаемой конфигурации. Так, что объекты загружаются сразу. Единственно, что когда загружающая конфигурация загружается, нужно изменять схему ну и заполнение полей.
Там все равно нужно много дополнительных действий, если документы и предопределенные элементы не совпадают.
Но зато загрузка очень быстрая. Что кстати и 1С могла сделать. Например v8: XSD схема программно с нуля.
Закон Брукера: Даже маленькая практика стоит большой теории.