Имя: Пароль:
1C
 
Обмен через XDTO с мобильным приложением
0 Timekiller
 
13.07.15
07:11
Переношу подчиненный номенклатуре справочник (серии, хар-ки, ед изм), применяю следующий метод, для формирования xml файла:
ФабрикаXDTO.ЗаписатьXML(ЗаписьХМЛ, Спр);

Получается результат:
...
<Ref>9b5d143d-2910-11e5-ba43-005056c00008</Ref>
<DeletionMark>false</DeletionMark>
<Owner>2bfc3504-290f-11e5-ba43-005056c00008</Owner>
<Code>000000001</Code>
<Description>31.07.2015</Description>
...


А нужен вот такой:
...
<Ref>9b5d143d-2910-11e5-ba43-005056c00008</Ref>
<DeletionMark>false</DeletionMark>
<Owner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:type="CatalogRef.Номенклатура">2bfc3504-290f-11e5-ba43-005056c00008</Owner>
<Code>000000001</Code>
<Description>31.07.2015</Description>
...


Вид XDTO: http://joxi.ru/Dr8NopRfq36526
Как добиться нужного результата?
1 Timekiller
 
13.07.15
07:13
Разница лишь в:
<Owner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";; xsi:type="CatalogRef.Номенклатура">
2 Cube
 
13.07.15
07:16
ФабрикаXDTO.ЗаписатьXML(ЗаписьХМЛ, Спр, , , , НазначениеТипаXML.Явное); ?
3 Timekiller
 
13.07.15
07:22
(2) Это пробовал, не то получается:
<CatalogObject.СерииНоменклатуры>
Меняется на:
<CatalogObject.СерииНоменклатуры xsi:type="CatalogObject.СерииНоменклатуры">

А меня интересует реквизит объекта СерииНоменклатуры Owner
4 Cube
 
13.07.15
07:44
Может, косяк в релизе?
5 Широкий
 
13.07.15
09:08
Штатная сериализация на планшетах работает как бы очень долго.
Советую подумать над своей структурой обмена
6 Timekiller
 
13.07.15
19:43
(5) Подскажи, что мне еще придумать, кроме штатной сериализации? Конвертация мне не доступна. Я думал прочитатьXML - максимально оптимально.
И какой вариант у меня с Owner'ом? Кроме СтрЗаменить()
7 DitriX
 
13.07.15
22:58
Есть куча вариантов :)
Начиная от простого дум парсера, и удаления не нужной инфы, заканчивая простым xsl преобразованием, проходя мимо создания своих xdto, либо записью данных через запись плана обмена (но тут тоже надо бы править xml, если струтукура данных отличается).

А конкрентно вашу проблему, как я понимаю - можно решить просо добавив новый тип объекта "CatalogRef.Номенклатура" и указав в овнерах его, так как он у вас сюда не импортирван, то естественно - 1С считает, что этот тип не определен в пакете и указывает его явно.
Кроме этого - вы можете указать вместо типа у овнера "CatalogRef.Номенклатура" - просто тип UID, и все, суть от этого не меняется, ибо вам по сути именно он и нужен.
8 Timekiller
 
14.07.15
17:03
(7) Воспользовался преобразованием XSL, все получилось, работает, вот код:
    ОписаниеХСЛ = "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:v8msg='http://v8.1c.ru/messages'>;
                    |    <xsl:output method='xml' encoding='UTF-8' indent='yes'/>
                    |    <xsl:template match='node()|@*'>
                    |        <xsl:copy>
                    |            <xsl:apply-templates select='@*' />
                    |            <xsl:apply-templates />
                    |        </xsl:copy>
                    |    </xsl:template>
                    |    <xsl:template match='v8msg:Message/v8msg:Body/CatalogObject.СерииНоменклатуры/Owner'>
                    |        <Owner xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""; xsi:type=""CatalogRef.Номенклатура"">
                    |            <xsl:value-of select='.'/>
                    |        </Owner>
                    |    </xsl:template>
                    |</xsl:stylesheet>";
    Преобразование = Новый ПреобразованиеXSL;
    Преобразование.ЗагрузитьИзСтроки(ОписаниеХСЛ);
    СообщениеНаКлиент = Преобразование.ПреобразоватьИзСтроки(ИзначальныйХМЛ);


Данный код работает после ИзначальныйХМЛ = ЗаписьХМЛ.Закрыть();

P.S. У кого-нибудь есть мысли по более оптимальному решению? Меня в целом все устраивает))
9 Serginio1
 
14.07.15
17:29
(0) У тебя в приемнике составной тип, а в отправителе тип Номенклатура
10 Serginio1
 
14.07.15
17:31
Тип=СериализаторXDTO.XMLТипЗнч(ТекОбъект.Owner);
Объект.Owner=Фабрика.Создать(Фабрика.Тип(Тип.URIПространстваИмен, Тип.ИмяТипа),XMLСтрока(ТекОбъект.Owner));
11 Timekiller
 
14.07.15
17:45
(9) В целом да, т.к. владельцы - это всегда список
(10) Попробую
12 DitriX
 
14.07.15
20:13
(11) смысл? преобразования - очень быстрые и гибкие, я вообще не создаю пакеты xdto, а тупо сериализирую как есть, а потом режу лишнее - выходит гибко и быстро.