Имя: Пароль:
1C
1С v8
Импорт схемы xsd -> XDTO
,
0 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, Тип);

Я уже поизучал ветки "про это", но понятнее не стало.
1 Fragster
 
гуру
06.07.20
16:10
в схеме должен ыть определен namespace
2 Fragster
 
гуру
06.07.20
16:11
сделай пакет в пустой базе, экспортни схему и сравни. сразу станет понятно, что не так
3 sitex
 
naïve
06.07.20
16:20
(2) Бывает платформа чудит  и к примеру спискиXDTO фигачит как один объектXDTO.
4 DrWeb
 
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>
5 DrWeb
 
06.07.20
16:24
Я просто хочу понять есть ли путь из нормальной схемы (а я подозреваю что присланная схема нормальная), получить нормальный рабочий пакет XDTO, или это фейковая функциональность в платформе и все на самом деле нужно делать руками?
6 sitex
 
naïve
06.07.20
16:26
(4) а вроде в начале это и не нужно <?xml version="1.0" encoding="utf-8"?>
7 Полован
 
06.07.20
16:30
(5) А зачем тебе вообще пакет ХДТО? Просто глобальной фабрикой читать/писать не катит?
8 sitex
 
naïve
06.07.20
16:32
(4) да и убери  ; лишние
9 sitex
 
naïve
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">

Вот должно быть
10 sitex
 
naïve
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">
11 sitex
 
naïve
06.07.20
16:34
(10) хм прикольно добавляется с точкой запятой...))
12 arsik
 
гуру
06.07.20
16:35
(11) Это Волшебник ворожит.
13 Segate
 
06.07.20
16:37
(4) если исправить ошибку с неймспейсами, то схема в этом сообщении грузится как надо со всеми типами...
14 DrWeb
 
06.07.20
16:44
(13) В чем ошибка? В (4) вроде нет ошибок, (если не считать точек с запятой, которых у меня нет), однако грузится без типов. Сейчас еще раз попробую.
15 DrWeb
 
06.07.20
16:48
Скрин после загрузки схемы из (4): https://yadi.sk/i/uml8Ot75S3RcSA
16 DrWeb
 
06.07.20
16:48
1С:Предприятие 8.3 (8.3.17.1386)
17 Segate
 
06.07.20
16:49
И что? ты тип полей то покажи )
18 Segate
 
06.07.20
16:52
Ааа... я понял ) У тебя в схеме не описаны рестрикшны к полям.
А ты хочешь, чтоб они отдельно упали в ограничение типа.

Описаны базовые типы, собственно они и грузятся нормально.
А зачем тебе симплтайпы получать через тип?
19 sitex
 
naïve
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>
20 DrWeb
 
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 в ордере один.
21 Fragster
 
гуру
06.07.20
16:56
Ну получи тип из КорневыеСвойства.твоесвойство.Тип() а не из ФабрикаXDTO.Тип)_
22 DrWeb
 
06.07.20
16:57
Собственно в этом и вопрос. Чтобы конструкция:

Для Каждого Строка Из ПереданныйОбъект.order.item Цикл
//---
КонецЦикла

работала даже когда item передан один
23 DrWeb
 
06.07.20
16:58
(21) Это типа как? КорневыеСвойства у меня тоже на что-то ругались. Сейчас найду тот вариант
24 Полован
 
06.07.20
16:58
(22) Так проверка на тип ХДТО Объект или Список чем не нравится?
25 Fragster
 
гуру
06.07.20
16:59
(22) ну не, там еще автопреобразование примитивных типов, трансляция в объекты 1с (например по гуиду можно в ссылки превращать прям автоматом), контроль структуры
26 Fragster
 
гуру
06.07.20
16:59
(24) потому что это костыль
27 DrWeb
 
06.07.20
17:01
(26) +1
28 Segate
 
06.07.20
17:02
Будь мужиком, напиши xsl преобразование в струкутуру )
И используй стандартный сериализатор 1с!
29 sitex
 
naïve
06.07.20
17:06
(28) Будь мужиком только хардкор!!!
30 Fragster
 
гуру
06.07.20
17:07
(28) я так выгрузку-загрузку данных xml дополнял, если структура только чуть-чуть поменялась, порядок свойств, добавить/удалить реквизит.
31 sitex
 
naïve
06.07.20
17:14
(5) Все таки лучше запросить нормальную схему со всеми описаниям.
32 DrWeb
 
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:
Структура объекта не соответствует типу:
33 Fragster
 
гуру
06.07.20
17:35
крче, выложи твой xsd и твой xml на gist.github.com, а то неудобно
34 Fragster
 
гуру
06.07.20
17:36
вообще у тебя ошибка в десятой строке xml, т.е. он в районе конца order еще что-то ждет
35 Segate
 
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>

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

Ошибка стала в 9,20. То есть ждет он после закрытия message. Чего бы ему там ждать - не ясно пока.
40 DrWeb
 
06.07.20
17:52
(37) В твоей позиции есть рациональное зерно конечно. Но костыли - не красиво.
41 Fragster
 
гуру
06.07.20
18:06
все работает
42 Fragster
 
гуру
06.07.20
18:06
только в схему все-таки добавил targetNamespace
43 Segate
 
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
44 Fragster
 
гуру
06.07.20
18:09
а, не, ошибка. забыл тип передать в Прочитать :)
45 Fragster
 
гуру
06.07.20
18:10
однако, если добавить еще один order, то ошибка не меняется, т.е. косяк именно с order
46 Segate
 
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>
47 DrWeb
 
06.07.20
18:18
(43) Да, это сильный изврат )) Можно проще. Я получаю <message> - менять его заменой сроки на <message xmlns=...>
Да, попробовал, все заработало. В последнем моем примере где оно ждало что-то после <message> не работало именно из за того, что не было xmlns=

Спасибо.

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