Имя: Пароль:
1C
 
ФабрикаXDTO, вопросы
, ,
0 hawksib
 
07.08.17
08:21
Собственно, т.к. материал на просторах интернета есть, но некоторые вопросы в той или иной мере не разобраны, а синтаксис-помощник, имхо, дает противоречивую, не соответствующую реальному поведению картину, хотел бы у знатоков уточнить несколько вопросов (за "тупость" вопросов строго не ругайте, тема для меня новая):
я так понял, что при создании объектаXDTO значения свойств объекта будут не определены до тех пор, пока объект не будет "инициализирован"
Как правильно инициализировать объект? понятно, что в рекурсии, но почему конструкция ФабрикаXD.Создать("http://www.w3.org/2001/XMLSchema";,  "string")
возвращает Неопределено, как определить тип объекта, описанного примитивным типом.
1 Ёпрст
 
07.08.17
08:34
2 hawksib
 
07.08.17
09:23
(1) что-то стало яснее, но в целом, вопрос не снимается
3 hawksib
 
07.08.17
11:00
всё-таки, концептуальный вопрос: если ФабрикаXD.Создать() возвращает объектXDTO, его свойства всегда не определены, как его правильно инициализировать, что бы через точку обращаться к свойствам вложенных объектов?
как определить тип значения свойств с примитивными типами, верно ли что нужно сравнивать базовый тип свойства с пространством имен http://www.w3.org/2001/XMLSchema
4 тарам пам пам
 
07.08.17
11:50
(3) для примитивных типов можно писать в лоб:
ОбъектХДТО.ЧисловойРеквизит = 5;

Для сложных типов как-то так:
ЗначениеСложногоТипа = ФабрикаХДТО.Создать(ФабрикаХДТО.Тип("ОченнаСложныйТип"));
ЗначениеСложногоТипа.Реквизит1 = "бла бла бла";
ЗначениеСложногоТипа.Реквизит2 = 5;

ОбъектХДТО.СложныйРеквизит = ЗначениеСложногоТипа;

За точный синтаксис не ручаюсь, писал по памяти.
5 hawksib
 
08.08.17
04:54
как фабрика xdto десериализует xml? у меня есть xml-ка следующего вида:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">;
    <env:Header/>
    <env:Body>
        <receiveApplicationResultResponse xmlns="http://api.vetrf.ru/schema/cdm/application/ws-definitions">;
            <application xmlns="http://api.vetrf.ru/schema/cdm/application">;
                <applicationId>ffea66a5-bca0-448d-8162-8e7abf054b2d</applicationId>
                <status>REJECTED</status>
                <serviceId>mercury-g2b.service</serviceId>
                <issuerId>fcde4961-218a-11e2-a69b-b499babae7ea</issuerId>
                <issueDate>2017-08-08T08:49:20.000+03:00</issueDate>
                <rcvDate>2017-08-08T04:49:24.000+03:00</rcvDate>
                <prdcRsltDate>2017-08-08T04:49:24.000+03:00</prdcRsltDate>
                <errors>
                    <apl:error code="APLM0007" xmlns:apl="http://api.vetrf.ru/schema/cdm/application">Wrong application data format. Format validation failed due to XML Schema rules:  Missing Attribute 'count'</apl:error>
                </errors>
            </application>
        </receiveApplicationResultResponse>
    </env:Body>
</env:Envelope>

если засунуть её в функцию ФабрикаXDTO.ПрочитатьXML, то через точку могу получить только код ошибки ОтветDO.Body.receiveApplicationResultResponse.application.errors.error.code, а вот сообщение, т.е. текст как нужно получать?
6 hawksib
 
08.08.17
07:29
а когда каждый узел обхожу чтением xml не могу получить поле code
7 hawksib
 
08.08.17
07:38
(6) с атрибутом разобрался

Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда
                    Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
                        Сообщить(ЧтениеXML);
                        
                    КонецЦикла
                КонецЕсли;


но как десериализовать чтение, что бы получить текст элемента, не понимаю, получаю только значение атрибута, хоть свою функцию пиши
8 hawksib
 
08.08.17
08:23
когда создаю объект фабрики вижу, что у него полей больше, чем описано типе объектов пакета xdto, откуда эти поля берутся?
9 hawksib
 
08.08.17
10:03
(5) + (6)  и (8) актуально
10 hawksib
 
09.08.17
07:36
up
11 hawksib
 
09.08.17
10:32
переписал функцию заполнения объектов фабрики, сделал так (что бы добавлялись только нужные поля)

&НаСервере
Процедура ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO, тСоответствие)
    Для Каждого Эл Из тСоответствие Цикл
        ЛевоеИмяПоля = ?(Найти(Эл.Ключ, "/") <> 0, Лев(Эл.Ключ, Найти(Эл.Ключ, "/")-1), Эл.Ключ);
        ПравыеИменаПолей = Прав(Эл.Ключ, СтрДлина(Эл.Ключ) - Найти(Эл.Ключ, "/"));
        Если ЛевоеИмяПоля = ПравыеИменаПолей Тогда
            Если ТипЗнч(ОбъектXDTO[ЛевоеИмяПоля]) = Тип("СписокXDTO") Тогда
                ОбъектXDTO[ЛевоеИмяПоля].Добавить(Эл.Значение);
            Иначе
                ОбъектXDTO[ЛевоеИмяПоля] = Эл.Значение;
            КонецЕсли;
        Иначе
            ОбъектXDTO[ЛевоеИмяПоля] = ФабрикаXD.Создать(ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.URIПространстваИмен, ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.Имя);
            ИменаПолей = Новый Соответствие;
            ИменаПолей.Вставить(ПравыеИменаПолей, Эл.Значение);
            ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO[ЛевоеИмяПоля], ИменаПолей);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры // ЗаполнитьСвойстваОбъектаXDTOрек

после того, как записываю xml в файл, вижу, что структура xml отличается, от структуры, которая ещё была в отладке в объектеXDTO, кто-нибудь может подсказать?
12 hawksib
 
09.08.17
10:37
во все ветки дерева положил по 1 элементу, хотя в отладке смотрю, всё заполнено корректно
13 hawksib
 
09.08.17
11:02
блин, естественно, если поле инициализировано, объект фабрики больше создавать не нужно
14 hawksib
 
09.08.17
11:03
примерно так получилось
&НаСервере
Процедура ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO, тСоответствие)
    Для Каждого Эл Из тСоответствие Цикл
        ЛевоеИмяПоля = ?(Найти(Эл.Ключ, "/") <> 0, Лев(Эл.Ключ, Найти(Эл.Ключ, "/")-1), Эл.Ключ);
        ПравыеИменаПолей = Прав(Эл.Ключ, СтрДлина(Эл.Ключ) - Найти(Эл.Ключ, "/"));
        Если ЛевоеИмяПоля = ПравыеИменаПолей Тогда
            Если ТипЗнч(ОбъектXDTO[ЛевоеИмяПоля]) = Тип("СписокXDTO") Тогда
                ОбъектXDTO[ЛевоеИмяПоля].Добавить(Эл.Значение);
            Иначе
                ОбъектXDTO[ЛевоеИмяПоля] = Эл.Значение;
            КонецЕсли;
        Иначе
            Если ОбъектXDTO[ЛевоеИмяПоля] = Неопределено Тогда
                ОбъектXDTO[ЛевоеИмяПоля] = ФабрикаXD.Создать(ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.URIПространстваИмен, ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.Имя);
            КонецЕсли;
            ИменаПолей = Новый Соответствие;
            ИменаПолей.Вставить(ПравыеИменаПолей, Эл.Значение);
            ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO[ЛевоеИмяПоля], ИменаПолей);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры // ЗаполнитьСвойстваОбъектаXDTOрек
15 hawksib
 
16.08.17
04:47
up, поделитесь кто-нибудь опытом по (5) сообщению, кто что знает / думает
16 big
 
16.08.17
06:27
По-моему лучше на тематическом форуме спросить. Народ весьма активно тему обсуждает.


http://www.fsvps.ru/vetrf-forum/posts/list/6955.page
17 hawksib
 
16.08.17
06:31
(16) как раз на нем моё последнее сообщение, ладно, попробую там ещё уточнить