Имя: Пароль:
1C
1С v8
СписокXTDO и ОбъектXTDO
,
0 Kamik-7
 
04.02.13
14:50
Всем привет. Вопрос нубский, видимо.
Есть xml типа
<orders>
   <order>
   </order>
   <order>
   </order>
</orders>

Когда order один, то получаю ОбъектXTDO, если несколько - то СписокXTDO.
Есстественно, при обходе For Each Order In Orders.order получаем в первом случае ошибку.
Что-то я не могу сообразить, как правильно-то сделать, чтобы Orders.order был всегда списком? Городить проверку на тип что-то некравиво.
1 cleaner
 
04.02.13
15:10
(0) Придется делать проверку на тип. Я так делаю, во всяком случае
2 Kamik-7
 
04.02.13
15:42
Хм. Ну ладно.
А если значение в xml пустое  (<Company></Company>), то я получаю при типе string (http://www.w3.org/2001/XMLSchema) - Значение ОбъектXDTO!, а не пустую строку
3 AaNnDdRrEeYy
 
04.02.13
16:03
не надо на тип, в пакете XDTO для свойства orders  указать минимально значение 0 и максимальное значение -1
4 AaNnDdRrEeYy
 
04.02.13
16:05
(2)>> А если значение в xml пустое  (<Company></Company>), то я получаю при типе string (http://www.w3.org/2001/XMLSchema) - Значение ОбъектXDTO!, а не пустую строку

Для правильного чтения файла xml нужно корретно указывать пространство имен, тогда такие случаи не возникнут, система будет определять тип не из xml файла по содержимому а именно из XDTO пакета в конфигурации
5 Fragster
 
гуру
04.02.13
16:05
(0) нужна правильная схема
6 Fragster
 
гуру
04.02.13
16:07
7 Fragster
 
гуру
04.02.13
16:08
схему можно набросать например в xmlpad
8 Fragster
 
гуру
04.02.13
16:08
(4) не всегда есть пакет в конфигурации
9 Serginio1
 
04.02.13
16:21
Сделай первую строку дефолтной и не читай её. Помню та же беда была.
10 Serginio1
 
04.02.13
16:23
9+ При выгрузке разумеется добавляй строку, а при чтении пропускай.
11 alexei366
 
04.02.13
16:29
(9) (10) Да пусть сделает минимум 1 и максимум -1, нафига тут ещё добавлять и пропускать
12 alexei366
 
04.02.13
16:29
Ну или скоко максимум допустим*
13 Kamik-7
 
04.02.13
16:32
(3) Блин, у меня orders не свойство, а тип.
(4) А можно пример, для особо тупых?
14 Serginio1
 
04.02.13
16:33
(11) Кстати посмотрел на проблемный тип. Там стоит минимум 1, максимум -1. Нужно поставить минимум 0, максимум -1
15 Fragster
 
гуру
04.02.13
16:40
(9) если ты не умеешь пользоваться и сделал костыль, то не заставляй других им пользоваться. здесь правильно - при Фабрика.ПрочитатьXML указать тип
16 Serginio1
 
04.02.13
16:52
(15) Проблема была не при загрузке, а при выгрузке. Не обратил внимания на минимальное количество. При этом выгружает как структуру. А сервисом пользовались на C# где классы уже сформированы. Смотри 14.
17 Fragster
 
гуру
04.02.13
16:54
(16) если загружать _без_ корректной схемы или не указывая тип, то если 1 подчиненный элемент, то будет ОбъектXDTO, если больше одного - то будет списокXDTO, если нет подчиненных элементов, то будет строка.
18 Fragster
 
гуру
04.02.13
16:56
схемой может быть ПакетXDTO в конфигурации
19 Fragster
 
гуру
04.02.13
16:57
кстати без указания типа еще и всякие даты/числа не будут в 1с сами преобразовываться в свои типы, а так и будут строками
20 alexei366
 
04.02.13
17:00
(19) кстати поперёк маленький вопросик: создаем объект мы на основании типа, и при выгрузке имя корневого элемента получается именем типа, а как создать объект по корневому свойству пакета, и чтоб при выгрузке в xml имя корня было именем корневого свойства пакета?
21 Serginio1
 
04.02.13
17:01
(17) Ну вообще то в вэб сервисе указано какой тип. Проблема была именно в минимальном количестве. Во всех других случаях возвращался список. А как ты без схемы читать  ОбъектXDTO будешь. При чтении всегда можно получить тип
ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)
22 Fragster
 
гуру
04.02.13
17:02
(21) где у автора веб сервис?
23 Fragster
 
гуру
04.02.13
17:03
(20)->(6)
24 Serginio1
 
04.02.13
17:06
(22) Я писал, про свою ситуацию. А схема должна быть всегда, просто при чтении нужно вычислять тип
ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ФабрикаXDTO.Имя));
И в зависимости от типа и действовать.
25 alexei366
 
04.02.13
17:07
(23) Видно не совсем ты меня понял, ну ладно не буду эту ветку засорять.
26 Fragster
 
гуру
04.02.13
17:08
(24) это написано еще по ссылке в (6), а у тебя какие-то фантазии про веб-сервисы и пакеты XDTO пошли.
27 Kamik-7
 
04.02.13
17:08
блин, зафлудили все
28 Serginio1
 
04.02.13
17:09
24 Тьфу
ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));
29 Serginio1
 
04.02.13
17:11
(27) Посмотри 14 и 28. Если ты выгружаешь  то посмотри на минимальное количество.
30 alexei366
 
04.02.13
17:14
(28) А вот кстати , такой метод не пракатит, если не совпадает имя типа в пакете и имя корневого свойства
31 Serginio1
 
04.02.13
17:15
(26) В 6 это ссылка на меня. У меня была ошибка которую я и обнаружил в 14. Буду знать. И моя база знаний увеличилась.
Фантазий нет никаких ибо вэб сервисы построены на схеме, но по ней же можно и выгружать в файл.
32 Serginio1
 
04.02.13
17:18
(30) Почему? Если ты посмотришь текст xml то увидишь, что там прописывается тип. Кстати, а что такое корневое свойство?
33 Kamik-7
 
04.02.13
17:18
(29) я загружаю
34 Serginio1
 
04.02.13
17:22
(33) Кстати для интереса поинтересуйся какое у них стоит минимальное количество.
35 Fragster
 
гуру
04.02.13
17:32
(34) ну, если есть случай, когда получается строка - то вестимо 0
36 Serginio1
 
04.02.13
17:38
(35) В моем случае это было минимальное количество 1, максимальное -1 которое я озвучил в 14.
37 Kamik-7
 
04.02.13
19:04
Моя схема

<xs:schema xmlns:tns="te" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="te" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="orders">
       <xs:complexType>
           <xs:sequence>
               <xs:element name="order" minOccurs="1" maxOccurs="unbounded">
                   <xs:complexType>
                       <xs:sequence>
                           <xs:element name="Ordernumber" type="xs:string" minOccurs="1" />
                           <xs:element name="Items">
                               <xs:complexType>
                                   <xs:sequence >
                                       <xs:element name="item" minOccurs="1" maxOccurs="unbounded">
                                           <xs:complexType>
                                               <xs:sequence>
                                                   <xs:element name="Code" type="xs:string" minOccurs="1"/>
                                               </xs:sequence>
                                           </xs:complexType>
                                       </xs:element>
                                   </xs:sequence>
                               </xs:complexType>
                           </xs:element>
                       </xs:sequence>
                   </xs:complexType>
               </xs:element>
           </xs:sequence>
       </xs:complexType>
   </xs:element>
</xs:schema>

все равно order остается ОбъектXTDO.
38 Kamik-7
 
04.02.13
19:05
и item тоже )
39 Fragster
 
гуру
04.02.13
19:21
перенеси все element>complextype в отдельные типы с именами как у element (так будет реально проще)
40 Kamik-7
 
04.02.13
20:51
<xs:complexType name="order">
       <xs:sequence minOccurs="0">
           <xs:element name="partner" type="tns:partner" minOccurs="0" />
           <xs:element name="Ordernumber" type="xs:string" minOccurs="0" />
       </xs:sequence>
   </xs:complexType>

<xs:complexType name="orders">
       <xs:complexContent>
           <xs:extension base="tns:order" />
       </xs:complexContent>
   </xs:complexType>


Типа так?
41 Александр_
Тверь
 
04.02.13
20:56
http://infostart.ru/public/167459/
почитай там все три части, доступно и понятно
42 Serginio1
 
05.02.13
11:31
<xs:element name="order" minOccurs="1" maxOccurs="unbounded">

Поставь в схеме <xs:element name="order" minOccurs="0" maxOccurs="unbounded">
43 Kamik-7
 
05.02.13
14:48
Выдает ошибку формата XDTO модели

<xs:schema xmlns:tns="te" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="te" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:complexType name="order">
       <xs:sequence>
           <xs:element name="Ordernumber" type="xs:string" />
       </xs:sequence>
   </xs:complexType>
   <xs:complexType name="orders">
       <xs:sequence>
           <xs:element name="order" type="tns:order" minOccurs="0" maxOccurs="unbounded" />
       </xs:sequence>
   </xs:complexType>
   <xs:element name="orders" type="tns:orders" />
</xs:schema>

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<orders>
   <order>
       <Ordernumber>20489</Ordernumber>
   </order>
</orders>

Вот что не так тут?
44 Kamik-7
 
05.02.13
14:51
Загружаю так:

ФайлыXSD = Новый Массив();
       ФайлыXSD.Добавить("\\WIN-SERVER\pub\1C\work\test4.xsd");
       МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
       OrdersType = МояФабрикаXDTO.Тип("te", "orders");
МойXML = Новый ЧтениеXML;
       МойXML.ОткрытьФайл("\\WIN-SERVER\pub\1C\work\test.xml");
       Orders = ФабрикаXDTO.ПрочитатьXML(МойXML, OrdersType);
45 Fragster
 
гуру
05.02.13
14:57
МояФабрикаXDTO.ПрочитатьXML
46 Kamik-7
 
05.02.13
15:03
да, это просто опечатка

в общем победил. Получается в xml надо типы напрямую указывать? Вот так загрузилось...

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<tns:orders xmlns:tns="te" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <tns:order>
       <tns:Ordernumber>20489</tns:Ordernumber>
   </tns:order>
</tns:orders>
47 Fragster
 
гуру
05.02.13
15:05
(46) не, если нэймспэйс в схеме и в шапке у xml одинаковый - то все должно работатьт
48 Kamik-7
 
05.02.13
15:11
(47) Спасибо, я наконец-то понял :)
49 Serginio1
 
05.02.13
16:43
Вообще должно так работать
ЧтениеXML.УстановитьСтроку(стр);
   ЧтениеXML.ПерейтиКСодержимому();
   ТипОбъектаXDTO=ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя);
   
   ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
50 Serginio1
 
05.02.13
19:04
(46) Тип нужно указывать если это anyType
Независимо от того, куда вы едете — это в гору и против ветра!