Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Импорт схемы xsd -> XDTO

Импорт схемы xsd -> XDTO
Я
   DrWeb
 
06.07.20 - 16:09
Добрый день, коллеги. Вся эта история с XDTO варится у меня в котелке все выходные, поэтому уже начинает постепенно срывать крышечку... Импортирую схему:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">;
    <xs:element name="message">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="order" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="item" maxOccurs="unbounded" minOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="sku" type="xs:string"/>
                                        <xs:element name="price" type="xs:decimal"/>
                                        <xs:element name="quantity" type="xs:decimal"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

В результате получаю пакет со свойствами, но без типов. Соответственно ФабрикаXDTO.Тип(...) возвращает "Неопределено". Я конечно мог бы поразбираться и определить типы вручную, но какой тогда смысл в экспорте схемы? И как мне получить тип message из имеющегося описания пакета XDTO, чтобы потом сделать

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

Я уже поизучал ветки "про это", но понятнее не стало.
   Fragster
 
1 - 06.07.20 - 16:10
в схеме должен ыть определен namespace
   Fragster
 
2 - 06.07.20 - 16:11
сделай пакет в пустой базе, экспортни схему и сравни. сразу станет понятно, что не так
   sitex
 
3 - 06.07.20 - 16:20
(2) Бывает платформа чудит  и к примеру спискиXDTO фигачит как один объектXDTO.
   DrWeb
 
4 - 06.07.20 - 16:22
(1) - он определен. По ошибке скопировал схему которую прислал разработчик плагина для сайта. Импортирую с прописанными ns:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://losthost.online/plugin/instock"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; targetNamespace="http://losthost.online/plugin/instock"; attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:element name="message">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="order" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                          <xs:sequence>
                        <xs:element name="item" maxOccurs="unbounded" minOccurs="1">
                            <xs:complexType>
                                      <xs:sequence>
                                          <xs:element name="sku" type="xs:string"/>
                                        <xs:element name="price" type="xs:decimal"/>
                                        <xs:element name="quantity" type="xs:decimal"/>
                                </xs:sequence>
                                  </xs:complexType>
                        </xs:element>
                          </xs:sequence>
                      </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
   DrWeb
 
5 - 06.07.20 - 16:24
Я просто хочу понять есть ли путь из нормальной схемы (а я подозреваю что присланная схема нормальная), получить нормальный рабочий пакет XDTO, или это фейковая функциональность в платформе и все на самом деле нужно делать руками?
   sitex
 
6 - 06.07.20 - 16:26
(4) а вроде в начале это и не нужно <?xml version="1.0" encoding="utf-8"?>
   Полован
 
7 - 06.07.20 - 16:30
(5) А зачем тебе вообще пакет ХДТО? Просто глобальной фабрикой читать/писать не катит?
   sitex
 
8 - 06.07.20 - 16:32
(4) да и убери  ; лишние
   sitex
 
9 - 06.07.20 - 16:33
(4) <xs:schema xmlns:tns="http://losthost.online/plugin/instock"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; targetNamespace="http://losthost.online/plugin/instock"; attributeFormDefault="unqualified" elementFormDefault="qualified">

Вот должно быть
   sitex
 
10 - 06.07.20 - 16:33
+ (9) <xs:schema xmlns:tns="http://losthost.online/plugin/instock"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; targetNamespace="http://losthost.online/plugin/instock"; attributeFormDefault="unqualified" elementFormDefault="qualified">
   sitex
 
11 - 06.07.20 - 16:34
(10) хм прикольно добавляется с точкой запятой...))
   arsik
 
12 - 06.07.20 - 16:35
(11) Это Волшебник ворожит.
   Segate
 
13 - 06.07.20 - 16:37
(4) если исправить ошибку с неймспейсами, то схема в этом сообщении грузится как надо со всеми типами...
   DrWeb
 
14 - 06.07.20 - 16:44
(13) В чем ошибка? В (4) вроде нет ошибок, (если не считать точек с запятой, которых у меня нет), однако грузится без типов. Сейчас еще раз попробую.
   DrWeb
 
15 - 06.07.20 - 16:48
Скрин после загрузки схемы из (4): https://yadi.sk/i/uml8Ot75S3RcSA
   DrWeb
 
16 - 06.07.20 - 16:48
1С:Предприятие 8.3 (8.3.17.1386)
   Segate
 
17 - 06.07.20 - 16:49
И что? ты тип полей то покажи )
   Segate
 
18 - 06.07.20 - 16:52
Ааа... я понял ) У тебя в схеме не описаны рестрикшны к полям.
А ты хочешь, чтоб они отдельно упали в ограничение типа.

Описаны базовые типы, собственно они и грузятся нормально.
А зачем тебе симплтайпы получать через тип?
   sitex
 
19 - 06.07.20 - 16:54
(18) Имеется ввиду это наверно <xs:simpleType name="sku">
        <xs:restriction base="xs:string">
            <xs:length value="2"/>
            <xs:pattern value="[0-9]{2}"/>
        </xs:restriction>
    </xs:simpleType>
   DrWeb
 
20 - 06.07.20 - 16:54
(17) Ты про это?
https://yadi.sk/i/BXrKDiZs5GKnaQ
https://yadi.sk/i/eh29q5RacgBvGg

К этому то претензий нет. Но     

ФабрикаXDTO.Тип("http://losthost.online/plugin/instock";, "message")

возвращает Неопределено. Потому как message не тип, а свойство (подозреваю) 

(7) Потому что иначе не работает Для Каждого если item в ордере один.
   Fragster
 
21 - 06.07.20 - 16:56
Ну получи тип из КорневыеСвойства.твоесвойство.Тип() а не из ФабрикаXDTO.Тип)_
   DrWeb
 
22 - 06.07.20 - 16:57
Собственно в этом и вопрос. Чтобы конструкция:
Для Каждого Строка Из ПереданныйОбъект.order.item Цикл
//---

КонецЦикла

работала даже когда item передан один
   DrWeb
 
23 - 06.07.20 - 16:58
(21) Это типа как? КорневыеСвойства у меня тоже на что-то ругались. Сейчас найду тот вариант
   Полован
 
24 - 06.07.20 - 16:58
(22) Так проверка на тип ХДТО Объект или Список чем не нравится?
   Fragster
 
25 - 06.07.20 - 16:59
(22) ну не, там еще автопреобразование примитивных типов, трансляция в объекты 1с (например по гуиду можно в ссылки превращать прям автоматом), контроль структуры
   Fragster
 
26 - 06.07.20 - 16:59
(24) потому что это костыль
   DrWeb
 
27 - 06.07.20 - 17:01
(26) +1
   Segate
 
28 - 06.07.20 - 17:02
Будь мужиком, напиши xsl преобразование в струкутуру )
И используй стандартный сериализатор 1с!
   sitex
 
29 - 06.07.20 - 17:06
(28) Будь мужиком только хардкор!!!
   Fragster
 
30 - 06.07.20 - 17:07
(28) я так выгрузку-загрузку данных xml дополнял, если структура только чуть-чуть поменялась, порядок свойств, добавить/удалить реквизит.
 
 Рекламное место пустует
   sitex
 
31 - 06.07.20 - 17:14
(5) Все таки лучше запросить нормальную схему со всеми описаниям.
   DrWeb
 
32 - 06.07.20 - 17:30
(31) Я поверю что нормальная схема заработает, когда заработает не нормальная ))

Все равно че-то не хочет. Определяют тип через корневые свойства:

Процедура ЧтениеXML(Кнопка)

    ХМЛ = "<?xml version=""1.0"" encoding=""UTF-8""?>
    |<message >
    |    <order>
    |        <item>
    |            <sku>G-1221</sku>
    |            <price>240.0000</price>
    |            <quantity>3</quantity>
    |       </item>
    |    </order>
    |</message>";
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ХМЛ);
    
    КорневыеСвойства = ФабрикаXDTO.Пакеты.Получить("http://losthost.online/plugin/instock").КорневыеСвойства;
    Тип = КорневыеСвойства.Получить(0).Тип;
    
    Объект = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, Тип);
КонецПроцедуры



В итоге получаю:

{ВнешняяОбработка.ВызовТестовойФункции.Форма.Форма.Форма(65)}: Ошибка при вызове метода контекста (ПрочитатьXML)
    Объект = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, Тип);
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа:  - [10,11]
Проверка дополнительного свойства:
    форма: Элемент
    имя: order
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу:
   Fragster
 
33 - 06.07.20 - 17:35
крче, выложи твой xsd и твой xml на gist.github.com, а то неудобно
   Fragster
 
34 - 06.07.20 - 17:36
вообще у тебя ошибка в десятой строке xml, т.е. он в районе конца order еще что-то ждет
   Segate
 
35 - 06.07.20 - 17:40
(32) вот тебе тестовый xml
Он грузится твоим кодом абсолютно нормально.
<?xml version="1.0" encoding="utf-8"?>
<tns:message xmlns:tns="http://losthost.online/plugin/instock"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="http://losthost.online/plugin/instock file:///D:/%D0%92%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B/123.xsd">
    <tns:order>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>197310.234905804</tns:price>
            <tns:quantity>3809270.2349058</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>-151039.765094196</tns:price>
            <tns:quantity>4833360.2349058</tns:quantity>
        </tns:item>
    </tns:order>
    <tns:order>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>449350.234905804</tns:price>
            <tns:quantity>1739710.2349058</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>-1793139.7650942</tns:price>
            <tns:quantity>2213550.2349058</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>2536640.2349058</tns:price>
            <tns:quantity>-1856419.7650942</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>-469779.765094196</tns:price>
            <tns:quantity>2909620.2349058</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>-4034029.7650942</tns:price>
            <tns:quantity>2803280.2349058</tns:quantity>
        </tns:item>
    </tns:order>
    <tns:order>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>2540880.2349058</tns:price>
            <tns:quantity>486900.234905804</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>-2881029.7650942</tns:price>
            <tns:quantity>-2853509.7650942</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>1550560.2349058</tns:price>
            <tns:quantity>3345610.2349058</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>-1503099.7650942</tns:price>
            <tns:quantity>-2175069.7650942</tns:quantity>
        </tns:item>
        <tns:item>
            <tns:sku>string</tns:sku>
            <tns:price>-4782589.7650942</tns:price>
            <tns:quantity>4186810.2349058</tns:quantity>
        </tns:item>
    </tns:order>
</tns:message>

Не благодари, и генерируй нормально сериализованную тест-дату
   DrWeb
 
36 - 06.07.20 - 17:41
(33) git@github.com:Datahider/instock.git
Файлы:
пример сообщения с сайта.xml
схема сообщения с сайта в 1С.xsd
   Полован
 
37 - 06.07.20 - 17:42
(26) (27) Да лучше убить полдня, чтобы найти некостыль, а потом наткнуться на XSD, который 1С не сможет загрузить в XDTO пакет.
   DrWeb
 
38 - 06.07.20 - 17:45
(35) Это прекрасно, спасибо. Но от сайта я получаю <message>...</message>, а не <tns:message xmlns:tns=...
   DrWeb
 
39 - 06.07.20 - 17:49
(34) не. Обсчитался: Я сделал     |    </order></message>";

Ошибка стала в 9,20. То есть ждет он после закрытия message. Чего бы ему там ждать - не ясно пока.
   DrWeb
 
40 - 06.07.20 - 17:52
(37) В твоей позиции есть рациональное зерно конечно. Но костыли - не красиво.
   Fragster
 
41 - 06.07.20 - 18:06
все работает
   Fragster
 
42 - 06.07.20 - 18:06
только в схему все-таки добавил targetNamespace
   Segate
 
43 - 06.07.20 - 18:09
(38)У тебя в схеме нет указания namespace
В конце концов можно вот так вот сделать:
 ХМЛ = РеквизитФормыВЗначение("Объект").ПолучитьМакет("TecтXML").получитьТекст();


      ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ХМЛ);
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    ЧтениеXML.Закрыть();
    
    ДокументDOM.ПервыйДочерний.УдалитьАтрибут("xmlns");
    ДокументDOM.ПервыйДочерний.УстановитьАтрибут("xmlns", "http://losthost.online/plugin/instock";);
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьDOM = Новый ЗаписьDOM;
    ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
    ХМЛ = ЗаписьXML.Закрыть();

    ЧтениеXML = Новый ЧтениеXML;

    ЧтениеXML.УстановитьСтроку(ХМЛ);

    

    КорневыеСвойства = ФабрикаXDTO.Пакеты.Получить("http://losthost.online/plugin/instock").КорневыеСвойства;
    Тип = КорневыеСвойства.Получить(0).Тип;
    dfsfsfsd = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, Тип);


Но это конечно порнография

Лучше затребовать нормально сериализованый xml
   Fragster
 
44 - 06.07.20 - 18:09
а, не, ошибка. забыл тип передать в Прочитать :)
   Fragster
 
45 - 06.07.20 - 18:10
однако, если добавить еще один order, то ошибка не меняется, т.е. косяк именно с order
   Segate
 
46 - 06.07.20 - 18:14
Ну и да...
Сам тестовый xml
<?xml version="1.0" encoding="utf-8"?>
<message>
    <order>
        <item>
            <sku>string</sku>
            <price>197310.234905804</price>
            <quantity>3809270.2349058</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>-151039.765094196</price>
            <quantity>4833360.2349058</quantity>
        </item>
    </order>
    <order>
        <item>
            <sku>string</sku>
            <price>449350.234905804</price>
            <quantity>1739710.2349058</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>-1793139.7650942</price>
            <quantity>2213550.2349058</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>2536640.2349058</price>
            <quantity>-1856419.7650942</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>-469779.765094196</price>
            <quantity>2909620.2349058</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>-4034029.7650942</price>
            <quantity>2803280.2349058</quantity>
        </item>
    </order>
    <order>
        <item>
            <sku>string</sku>
            <price>2540880.2349058</price>
            <quantity>486900.234905804</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>-2881029.7650942</price>
            <quantity>-2853509.7650942</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>1550560.2349058</price>
            <quantity>3345610.2349058</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>-1503099.7650942</price>
            <quantity>-2175069.7650942</quantity>
        </item>
        <item>
            <sku>string</sku>
            <price>-4782589.7650942</price>
            <quantity>4186810.2349058</quantity>
        </item>
    </order>
</message>
   DrWeb
 
47 - 06.07.20 - 18:18
(43) Да, это сильный изврат )) Можно проще. Я получаю <message> - менять его заменой сроки на <message xmlns=...>
Да, попробовал, все заработало. В последнем моем примере где оно ждало что-то после <message> не работало именно из за того, что не было xmlns=

Спасибо.

targetNamespace в той схеме которую я импортировал конечно есть. Без него не импортируется.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.