Имя: Пароль:
1C
 
Как закинуть XML в XDTO?
,
0 vicof
 
18.05.15
13:49
Парам = СериализаторXDTO.ЗаписатьXDTO(ТекстХМЛ);
Прокси.process(Парам);

ТекстХМл - это ХМЛ в виде текстовой строки.
При обращении к веб-сервису на сервер уходит пакет в виде:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
                <soap:Header/>
                <soap:Body> <request xmlns="http://www.cft.ru/schemas/cit_type";
                               xmlns:xs="http://www.w3.org/2001/XMLSchema";
                               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SYSTEM>;
&lt;BP_ID Value="SLV_AHR_IU"/&gt;
&lt;CIT_Version Value="1.0"/&gt;
&lt;ERR Value=""/&gt;
&lt;FORMAT Value="XML"/&gt;
&lt;INTERFACE_RET Value=""/&gt;
&lt;MAIN_ID Value=""/&gt;
&lt;MSG_ID Value="1"/&gt;
&lt;SYNC Value="N"/&gt;
&lt;SYS_ID Value="SLV_1C"/&gt;
&lt;TAR_ID Value="IBSO_DISTR"/&gt;
&lt;Version Value="002"/&gt;
&lt;/SYSTEM&gt;
&lt;DATA&gt;
&lt;ReqAhrIU&gt;
&lt;BEGIN_&gt;
&lt;ahr&gt;
&lt;BEGIN_&gt;
&lt;guid Value="123-123-123-123"/&gt;
&lt;dateOp Value="2015-05-12"/&gt;
&lt;code Value="1"/&gt;
&lt;amt Value="1000.01"/&gt;
&lt;typeOp Value="SLV_PAY"/&gt;
&lt;servOp Value="SLV_SERV1"/&gt;
&lt;/BEGIN_&gt;
&lt;/ahr&gt;
&lt;/BEGIN_&gt;
&lt;/ReqAhrIU&gt;
&lt;/DATA&gt;</request></soap:Body>
</soap:Envelope>

Как сделать так, чтобы 1С-ка не экранировала символы угловых скобок при отправке?
1 DmitrO
 
18.05.15
13:54
надо сделать так, чтобы тип параметра был не string, а anyType
2 Fragster
 
гуру
18.05.15
13:55
(1) но и тогда не уйдет
3 Fragster
 
гуру
18.05.15
13:55
(0) что конкретно нужно?
4 Fragster
 
гуру
18.05.15
13:56
правильнее всего импортировать схему XSD в конфигурацию, создать объектXDTO нужного типа, заполнить его свойства и передавать его
5 vicof
 
18.05.15
13:56
(1) Тип паараметра как раз anyType
6 Fragster
 
гуру
18.05.15
13:57
можно не импортировать, но тогда некрасиво с .Добавить надо извращаться
7 vicof
 
18.05.15
13:57
(3) Нужно передать XML методу веб-сервиса, чтобы он его могу распарсить.
8 Fragster
 
гуру
18.05.15
13:58
есть один способ, добавить в XML пространство имен сервиса, прочитать его в объект XDTO, а его уже передать. но это - извращение.
9 vicof
 
18.05.15
13:58
*он его мог распарсить
10 Fragster
 
гуру
18.05.15
13:58
(7) откуда этот XML взялся?
11 vicof
 
18.05.15
13:58
(10) Прислали разработчики веб-сервиса
12 Fragster
 
гуру
18.05.15
13:59
(11) теперь пусть XSD пришлют. или WSDL.
13 DmitrO
 
18.05.15
14:00
(5)тогда попросту передавай объект XDTO а не строку
14 DmitrO
 
18.05.15
14:02
anyType, он на то и anyType, что может быть любым типом, как простым так и комплексным.
15 vicof
 
18.05.15
14:03
(12)(13) Не, вы не поняли. WSDL есть - описывает веб-сервис. Параметры, методы и т.п.
Я вызываю метод этого веб-сервиса, и передаю туда параметр типа anyType, преобразовывая его к строке в виде ХМЛ.
В результате (0).

Определение = Новый WSОпределения("\\localhost\Share\ProviderTA2.wsdl");
    Прокси = Новый WSПрокси(Определение, "http://www.xxx.ru";, "ProviderTA", "ProviderTASOAPBindingType");
Парам = СериализаторXDTO.ЗаписатьXDTO(ЗаписьХМЛ);
Прокси.process(Парам);
16 vicof
 
18.05.15
14:04
Но все, что сожержится в Парам, экранируется, чтобы получился корректный ХМЛ
17 vicof
 
18.05.15
14:05
(13) Парам = СериализаторXDTO.ЗаписатьXDTO(ЗаписьХМЛ);
как раз и формирует объектХДТО
18 Fragster
 
гуру
18.05.15
14:06
вместо того, чтобы юзать ЗаписьXML, юзай Объект = ФабрикаXDTO.Создать(Фабрика.Тип(ПространстовИмен,ИмяТипа));
Объект.Свойство = ...
Объект.Свойство = ...
Объект.Свойство = ...
Объект.Свойство = ...
Объект.Свойство = ...
Объект.Свойство = ...
Объект.Свойство = ...

Прокси.Процесс(Объект)
19 Serginio1
 
18.05.15
14:07
18+ Прокси. добавить
Объект = Прокси.ФабрикаXDTO.Создать(Прокси.Фабрика.Тип(ПространстовИмен,ИмяТипа));
20 Fragster
 
гуру
18.05.15
14:08
(17) не совсем так.
21 DmitrO
 
18.05.15
14:08
(17)начнем с того, что ЗаписатьXML по документации вроде как ничего не возвращает )
22 vicof
 
18.05.15
14:08
(18)(19) Щас попробую
23 vicof
 
18.05.15
14:10
(21) Сорри, это я уже тут пробовал отлаживать, Там не ЗаписьXML, там текстовая строка
24 Serginio1
 
18.05.15
14:12
Тебе все нужно делать через методы Прокси.ФабрикаXDTO
25 Serginio1
 
18.05.15
14:13
(23) Не проходит так строка
anyType в XDTO
26 vicof
 
18.05.15
14:14
(20)(24)
Объект = Прокси.ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "anyType"));

Отлично, создался объект XDTO.
Без свойств, поскольку это anyType.
Как теперь я туда теперь произвольный XML запихну?
27 vicof
 
18.05.15
14:17
Чтобы он встроился между
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;;
                <soap:Header/>
                <soap:Body> <request xmlns="http://www.cft.ru/schemas/cit_type";;
                               xmlns:xs="http://www.w3.org/2001/XMLSchema";;
                               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;ВОТ СЮДА ВОТ
</request></soap:Body>
</soap:Envelope>

и воспринялся как часть запроса, отправляемого на сервер
28 Fragster
 
гуру
18.05.15
14:18
скинь на http://pastebin.com/ WSDL
29 DmitrO
 
18.05.15
14:19
(26)ну по идее тебе изначально надо строить объект XDTO а не строку, или у тебя иначально есть откуда-то строка и ты ее не строишь?
30 Serginio1
 
18.05.15
14:20
(26) Зачем тебе anyType? Создавай уже по известному типу. Либо как я уже тебе писал v8: Тип AnyType в Веб-сервисах и массив
Только создавай свой объект через Прокси.ФабрикаXDTO
31 DmitrO
 
18.05.15
14:22
(30)у него может и типа-то в схеме такого нет
32 vicof
 
18.05.15
14:23
(31) ты понял :) Нету типа, просто левый ХМЛ, нужный сторонней системе.
(28) http://pastebin.com/ZVa8FKQw
33 Serginio1
 
18.05.15
14:24
(31) Тогда 2 решения
Прокси.ФабрикаXDTO.ПрочитатьXML(<ЧтениеXML>, <Тип>)
либо формировать через anyType как в v8: Тип AnyType в Веб-сервисах и массив
34 Fragster
 
гуру
18.05.15
14:25
и правда нету типов, передавай что как хочешь
35 Fragster
 
гуру
18.05.15
14:28
тогда так:
36 Fragster
 
гуру
18.05.15
14:28
ОбъектXDTO (XDTODataObject)
Добавить (Add)
Вариант синтаксиса: Установка значения нового произвольного свойства

Синтаксис:

Добавить(<Форма>, <URIПространстваИмен>, <ЛокальноеИмя>, <ЭлементДанных>)
Параметры:

<Форма> (обязательный)

Тип: ФормаXML.
Форма XML представления произвольного свойства.
Может принимать значения Элемент или Атрибут.
<URIПространстваИмен> (обязательный)

Тип: Строка.
URI пространства имен XML представления произвольного свойства.
<ЛокальноеИмя> (обязательный)

Тип: Строка.
Локальное имя произвольного свойства.
<ЭлементДанных> (обязательный)

Тип: ЗначениеXDTO; ОбъектXDTO.
Элемент данных XDTO (значение или объект), являющийся значением произвольного свойства.
Описание варианта метода:

Имя свойства будет создано автоматически, на основе локального имени XML представления свойства.
В случае, если произвольное свойство с полученным именем уже существует и если предыдущая установка значения произвольного свойства выполнялась для данного произвольного свойства, либо другого свойства в случае наличия последовательности, свойство становится списковым с неограниченной верхней границей.
В противном случае будет инициировано исключение.
Тип создаваемого свойства всегда устанавливается anyType пространства имен схемы XML.
37 vicof
 
18.05.15
14:31
(33) (36) Так нельзя - появляется новый тэг, в котором будет нужный ХМЛ. Этого тэга быть не должно.
38 vicof
 
18.05.15
14:39
+(37) Поэтому и сделал через СериализаторXDTO.ЗаписатьXDTO(ТекстСМоимХМЛ);
но в таком виде экранируются угловые скобки.
39 Fragster
 
гуру
18.05.15
14:40
(37) выкинь нафиг тот текст XML, которые есть у тебя
40 vicof
 
18.05.15
14:43
(39) Отлично, а что взамен?
41 Serginio1
 
18.05.15
14:43
(37) Фрмируй свой объект с нужными тебе тегами
Еще раз

ЧтениеХМЛ= новый ЧтениеXML;
    ЧтениеХМЛ.ОткрытьФайл(ИмяФайла);//УстановитьСтроку

       возврат Прокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеХМЛ);
XDTO атрибуты и свойства
42 Fragster
 
гуру
18.05.15
14:43
(39)+ либо преобразуй его в объектXDTO
43 Serginio1
 
18.05.15
14:44
ЧтениеХМЛ= новый ЧтениеXML;
    ЧтениеХМЛ.УстановитьСтроку(твояСтрока);


       Парам=Прокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеХМЛ);
44 Fragster
 
гуру
18.05.15
14:44
я предлагаю вместо формирования XML формировать объект
45 vicof
 
18.05.15
14:50
(43) Супер, сработало :) Ставлю 100 лайков, благодарю. Если хочешь, можем пива сходить попить за мой счет.
46 Fragster
 
гуру
18.05.15
14:55
а смысл где-то в коде формировать XML, а потом преобразовывать его в объект XDTO? Лично мне такое пришлось делать только когда у меня реально на входе был XML. Подозреваю, что у автора не тот случай.
47 Serginio1
 
18.05.15
14:58
(45) Спасибо. Не пью. На здоровье.
48 vicof
 
18.05.15
15:03
(46) У автора такой случай. Возможно, такой уклад изменится, но пока так.