Имя: Пароль:
1C
1С v8
Веб сервисы. Тип возвращаемого значения
0 Zixxx
 
18.07.13
13:18
Создал веб сервис, создал операцию NewEvent, тип возвращаемого значения указал из пакет как EventResponse.
В пакете для типа EventResponse создал два свойства
1. Error (string)
2. Description (string)

В общем сервис работает хорошо и возвращает все нормально. Но мне следует учитывать что шибок может быть несколько, соответственно при ошибки сервис должен вернуть несколько ошибок в Description. Поэтому минимальное значение я ставлю 0, а максимальное -1.

В итоге при самом ответе, после заполнения пакета получаю ошибку

Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://reforum.ru}EventResponse Проверка свойства 'Description': форма: Элемент имя: {http://reforum.ru}Description тип: {http://www.w3.org/2001/XMLSchema}string Не установлено значение одного из следующих свойств:
Ошибка преобразования данных XDTO: Чтение объекта типа: {http://reforum.ru}EventResponse - [8,81] Проверка свойства 'Description': форма: Элемент имя: {http://reforum.ru}Description тип: {http://www.w3.org/2001/XMLSchema}string
Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: {http://reforum.ru}EventResponse - [8,81] Проверка свойства 'Description': форма: Элемент имя: {http://reforum.ru}Description тип: {http://www.w3.org/2001/XMLSchema}string
Ошибка вызова операции сервиса: {http://reforum.ru}:Site:NewEvent()
Ошибка при вызове метода контекста (NewEvent)
(1): Результат = Прокси.NewEvent(СоздатьЗначениеПараметраОперации(ПараметрыОперации[0]));

В чем может быть проблема, почему не дает ответить списком?
1 Zixxx
 
18.07.13
13:20
*ошибка выходит при возврате пакета, а не при заполнении как написал выше.
2 Serginio1
 
18.07.13
13:22
Ну а ты значения то установил для Description. Для того что бы не устанавливать значение установи минимальное значение я ставлю 0, а максимальное 1.
3 Fragster
 
гуру
18.07.13
13:24
обязательное заполнение где?
4 Zixxx
 
18.07.13
13:27
(3) Да вроде уже по разному пробовал

<xs:schema xmlns:tns="http://reforum.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://reforum.ru" attributeFormDefault="unqualified" elementFormDefault="qualified">
   <xs:complexType name="Event">
       <xs:sequence>
           <xs:element name="ClientID" type="xs:string"/>
           <xs:element name="Data" type="xs:dateTime"/>
           <xs:element name="Type" type="xs:string"/>
           <xs:element name="Subject" type="xs:string"/>
           <xs:element name="Content" type="xs:string"/>
           <xs:element name="Result" type="xs:string"/>
       </xs:sequence>
   </xs:complexType>
   <xs:complexType name="EventResponse">
       <xs:sequence>
           <xs:element name="Error" type="xs:boolean"/>
           <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
   </xs:complexType>
</xs:schema>
5 Serginio1
 
18.07.13
13:29
Покажи как устанавливаешь
6 Fragster
 
гуру
18.07.13
13:29
там еще nillable должно быть где-то
7 Zixxx
 
18.07.13
13:31
(5)

[CODE]
   ТипОбъектаEventResponse = ФабрикаXDTO.Тип("http://reforum.ru", "EventResponse");
   EventResponse = ФабрикаXDTO.Создать(ТипОбъектаEventResponse);
   EventResponse.Error            = СтруктураОшибки.Ошибка;
   
   Для Каждого СтрокаОшибки Из СтруктураОшибки.ОшибкаОписание Цикл
       
       EventResponse.Description.Добавить(СтрокаОшибки);
       
   КонецЦикла;

   Возврат EventResponse;
[/CODE]
8 Serginio1
 
18.07.13
13:33
(6) Но для nillable все равно нужно устанавливать значение в
ТипNull=ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema","anySimpleType");
       СсылкаNull=ФабрикаXDTO.Создать(ТипNull);
EventResponse.Description=ТипNull;

(7) А если ошибки есть то проходит?
9 Fragster
 
гуру
18.07.13
13:33
(7) нет, добавлять ты должен ЗначениеXDTO туда...
10 acsent
 
18.07.13
13:34
Эх не юзал бы я комплексные типы в таком виде. Один гемор от них
11 Serginio1
 
18.07.13
13:36
(9) Нет это необязательно если указан простой тип для свойства .

AkStringArrayType        = ФабрикаXDTO.Тип("http://www.ACWebService.ru/sample", "AKStringArray");
   Ответ     = ФабрикаXDTO.Создать(AkStringArrayType);
   Для каждого стр из МейкПоОригиналу Цикл
   Ответ.Values.Add(стр)
   КонецЦикла;
12 Serginio1
 
18.07.13
13:38
(10) До проще сделать тип StringArray и его установить для Description
13 Fragster
 
гуру
18.07.13
13:38
(11) у меня в свое время именно из-за этого не работало.
14 acsent
 
18.07.13
13:38
(10) сама 1с делает последовательности структур, а не таблицы
15 Zixxx
 
18.07.13
13:40
Так как мне сделать? Как в (8) тоже не работает.
16 Serginio1
 
18.07.13
13:40
(13) А какой тип был у свойства?
17 Serginio1
 
18.07.13
13:41
(15) А ту установил для него возможно пустое?
18 Zixxx
 
18.07.13
13:43
(17) Да, ошибка осталась
19 Serginio1
 
18.07.13
13:43
(15) Попробуй сделай тип StringArray и добавь свойство Description 0,-1
А для EventResponse Description  сделай тип  StringArray
20 Serginio1
 
18.07.13
13:45
AkStringArrayType        = ФабрикаXDTO.Тип(ПространствоИмен,"StringArray");

EventResponse.Description= ФабрикаXDTO.Создать(StringArrayType);
21 Zixxx
 
18.07.13
13:45
(19) Нет типов StringArray в конфигураторе
22 Serginio1
 
18.07.13
13:49
(21) Ты его создай как в 19
23 Zixxx
 
18.07.13
13:50
(22) Не выходит что-то

Ошибка SOAP сервера: Unknown error. {ОбщийМодуль.МодульИнтеграции.Модуль(5104)}: Error calling context method (Создать) reason: {ОбщийМодуль.МодульИнтеграции.Модуль(5104)}: Error calling context method (Создать) reason: Type mismatch (parameter number '1')
Ошибка вызова операции сервиса: {http://reforum.ru}:Site:NewEvent()
Ошибка при вызове метода контекста (NewEvent)
24 Serginio1
 
18.07.13
13:53
(23) а ты создал этот тип? Он должен быть таким как и  EventResponse только без свойства Error
25 Serginio1
 
18.07.13
13:54
в 20 ошибка
StringArrayType        = ФабрикаXDTO.Тип(ПространствоИмен,"StringArray");

EventResponse.Description= ФабрикаXDTO.Создать(StringArrayType);
26 Zixxx
 
18.07.13
13:56
(25) Я ее поправил, в (23) ошибка на неправильный параметр в
27 Zixxx
 
18.07.13
13:56
ФабрикаXDTO.Создать(StringArrayType);
28 Serginio1
 
18.07.13
13:58
А ты создал этот тип StringArray?
29 Serginio1
 
18.07.13
14:03
Но вообще странно у меня есть тип который возвращает функция

<xs:complexType name="ListAKStringArray">
       <xs:sequence>
           <xs:element name="Values" type="tns:AKStringArrayForList" minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
   </xs:complexType>



<xs:complexType name="AKStringArrayForList">
       <xs:sequence>
           <xs:element name="AKStringArray" type="tns:AKStringArray"/>
       </xs:sequence>
       <xs:attribute name="Temp" type="xs:string" use="required"/>
   </xs:complexType>
30 Serginio1
 
18.07.13
14:04
<xs:complexType name="AKStringArray">
       <xs:sequence>
           <xs:element name="Values" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
   </xs:complexType>
31 Fragster
 
гуру
18.07.13
14:33
мой сервис такое отрабатывает:


   Определение = Новый WSОпределения("http://fragster.ru/tmp/test.php?wsdl");
   Сервис = Определение.Сервисы[0];
   ПространствоИмен =Сервис.URIПространстваИмен;
   ТочкаПодключения = Сервис.ТочкиПодключения[0];
   
   Прокси = Новый WSПрокси(Определение, ПространствоИмен, Сервис.Имя, ТочкаПодключения.Имя);
   Фабрика = Определение.ФабрикаXDTO;
   
   ТипТест = Фабрика.Тип(ПространствоИмен, "Test");
   ОбъектТест = Фабрика.Создать(ТипТест);
   
   Для Сч = 1 по 10 Цикл
       ОбъектТест.str.Добавить("" + Сч);
   КонецЦикла;
   ОбъектРезультат = Прокси.testFunction(ОбъектТест);
   
   Для каждого Стр Из ОбъектРезультат.str Цикл
       Сообщить(Стр);
   КонецЦикла;
32 Fragster
 
гуру
18.07.13
14:34
на стороне сервера правда не 1с...

/**
*
* @param Test $test
* @return Test
*/
function testFunction(Test $test) {
   return $test;
}
33 Fragster
 
гуру
18.07.13
14:34
вернее

function testFunction(Test $test) {
   $test->str = array_reverse($test->str);
   return $test;
}
34 Fragster
 
гуру
18.07.13
14:37
в случае пустого массива 1с шлет


<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header/>
   <soap:Body> <m:testFunction xmlns:m="http://fragster.ru/multithread">
   <m:test xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</m:testFunction></soap:Body>
</soap:Envelope>
35 Serginio1
 
18.07.13
14:37
(31) Сейчас не помню но если структура состоит только из одного элемента то проходит. А вот если типа как (0) то свойство должно бы типом как AKStringArray
36 Fragster
 
гуру
18.07.13
14:38
(35) смотри определение по ссылке
37 Fragster
 
гуру
18.07.13
14:39
(34)+ в случае заполненного:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header/>
   <soap:Body> <m:testFunction xmlns:m="http://fragster.ru/multithread">
   <m:test xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <m:str>1</m:str>
       <m:str>2</m:str>
       <m:str>3</m:str>
       <m:str>4</m:str>
       <m:str>5</m:str>
       <m:str>6</m:str>
       <m:str>7</m:str>
       <m:str>8</m:str>
       <m:str>9</m:str>
       <m:str>10</m:str>
   </m:test>
</m:testFunction></soap:Body>
</soap:Envelope>
38 Fragster
 
гуру
18.07.13
14:40
т.е. 1с куда-то теряет вообще весь параметр
39 Serginio1
 
18.07.13
14:45
(38) Это нормально, так как у тебя str  объявлен как 0,-1
40 Serginio1
 
18.07.13
14:45
Для интереса добаввь в свою структуру еще поле
41 Fragster
 
гуру
18.07.13
14:46
(39) да не, это я тег m:test не заметил просто
42 Fragster
 
гуру
18.07.13
14:56
(40) тоже работает.



полный массив:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header/>
   <soap:Body> <m:testFunction xmlns:m="http://fragster.ru/testservice">
   <m:test xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <m:single>одиночное свойство</m:single>
       <m:str>1</m:str>
       <m:str>2</m:str>
       <m:str>3</m:str>
       <m:str>4</m:str>
       <m:str>5</m:str>
       <m:str>6</m:str>
       <m:str>7</m:str>
       <m:str>8</m:str>
       <m:str>9</m:str>
       <m:str>10</m:str>
   </m:test>
</m:testFunction></soap:Body>
</soap:Envelope>



пустой массив:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header/>
   <soap:Body> <m:testFunction xmlns:m="http://fragster.ru/testservice">
   <m:test xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <m:single>одиночное свойство</m:single>
   </m:test>
</m:testFunction></soap:Body>
</soap:Envelope>
43 Serginio1
 
18.07.13
15:11
А в 1С принимает?
44 Fragster
 
гуру
18.07.13
15:16
(43) не понял? я вызываю мой сервия из 1с. в ответ приходит  объект того же типа. и с пустым и с полным массивом 1с не ругается (XMLки там почти одинаковые).
45 Fragster
 
гуру
18.07.13
15:16
одинаковые на вход и на выход. По структуре тегов - так вообще близнецы
46 Fragster
 
гуру
18.07.13
15:23
вот выход сервиса, который 1с нормально жрет (с пустым массивом):

output
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Header/>
 <soap:Body>
   <m:testFunctionResponse xmlns:m="http://fragster.ru/testservice">
     <m:return>
       <m:single>&#x43E;&#x434;&#x438;&#x43D;&#x43E;&#x447;&#x43D;&#x43E;&#x435; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E;</m:single>
     </m:return>
   </m:testFunctionResponse>
 </soap:Body>
</soap:Envelope>
47 Serginio1
 
18.07.13
15:36
(46) Ну значит топикастеру нужно указать какая у него версия. Кстати он куда то и пропал.