Имя: Пароль:
1C
Веб-мастеринг
1С Веб-сервис. Работа с XDTO.
0 kevin
 
10.09.13
07:50
Проблема: есть веб-сервис на 1С. Там открыта функция Fun(). Есть клиент на C#, где добавлена ссылка (Web Reference) на этот веб-сервис. Fun() должна иметь возвращаемое значение объектXDTO (Имя и Номер), а студия видит string. Только начал работать с 1С. Созданный клиент на 1С адекватно отрабатывает.

Код C#
var f = new Service1.Service();
f.Fun();   // тип возвращаемого значения string, а должен быть КакойтоКласс и при обращении вываливается с ошибкой анализа XML.

Я понимаю, что SOAP это XML и его можно передавать строкой, но почему студия не адекватно видит возвращаемый тип функции Fun()? С веб-сервисами на других языках всё отлично. Или как указать явно в 1С возвращаемый тип?
1 Asmody
 
10.09.13
08:18
(0) и как выглядит этот Fun со стороны 1С?
2 kevin
 
10.09.13
08:35
Функция Fun()
МассивАдресов = ФабрикаXDTO.Создать(МассивАдресовТип);
Возврат МассивАдресов;

Также принимается без указания типа, как в скриптах, где результат сам как-то преобразуется куда нравится.
3 catena
 
10.09.13
08:42
В указанном пакете XDTO должны быть прописаны возвращаемые элементы с типами.
4 Asmody
 
10.09.13
08:48
(2) вернул пустой объект, а в чем Fun?
5 kevin
 
10.09.13
09:00
wsdl

<types>

<xs:schema xmlns:tns="adress" xmlns:xs="http://www.w3.org/2001/XMLSchema"; targetNamespace="adress" attributeFormDefault="unqualified" elementFormDefault="qualified">

<xs:complexType name="Adress">
<xs:sequence>
  <xs:element name="Code" type="xs:string"/>
  <xs:element name="Name" type="xs:string"/>
</xs:sequence>
</xs:complexType>

</xs:schema>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xs1="adress" xmlns:xs2="Service" targetNamespace="Service" elementFormDefault="qualified">
<xs:import namespace="adress"/>
<xs:element name="Fun">
  <xs:complexType>
   <xs:sequence/>
  </xs:complexType>
</xs:element>
<xs:element name="FunResponse">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="return" type="xs:string"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

</types>

FunResponse имеет string - здесь указывается тип возвращаемых данных? Почему тогда в FunResponse? Почему не указан возврат у Fun? Что-то здесь не то.
6 kevin
 
10.09.13
09:03
(4) Fun() не важно что внутри, она возвращает результат на клиенте 1С, проблема со студией.
7 Asmody
 
10.09.13
09:28
(5) а это вам читать стандарты. WSDL не 1С придумало.
Но причина скорее в том, что у вас пакет XDTO неверно настроен
8 Asmody
 
10.09.13
09:29
(6) полный бред и непонимание
9 kevin
 
10.09.13
10:44
Полный вариант
Функция Fun()

АдресТип = ФабрикаXDTO.Тип("adress", "AdressSpr");
МассивАдресовТип = ФабрикаXDTO.Тип("adress", "MassAdress");
МассивАдресов = ФабрикаXDTO.Создать(МассивАдресовТип);

Запрос = Новый Запрос;
Запрос.Текст =
       "ВЫБРАТЬ
       | АдресныеСокращения.Наименование,
       | АдресныеСокращения.Код
       |ИЗ
       | Справочник.АдресныеСокращения КАК АдресныеСокращения";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Если Выборка.Количество() = 0 Тогда
  Возврат Null;
КонецЕсли;

Пока Выборка.Следующий() Цикл
  Адрес = ФабрикаXDTO.Создать(АдресТип);
  Адрес.Code = Выборка.Код;
  Адрес.Name = Выборка.Наименование;
  МассивАдресов.Adress.Добавить(Адрес);
КонецЦикла;
  
Возврат МассивАдресов;

КонецФункции

в C# вываливается ошибка анализа XML. При добавлении ссылки на веб-сервис должны сгенерироваться описания классов по wsdl, но этого не происходит.
10 Asmody
 
10.09.13
10:47
(5) это тебе 1Ска такой wsdl сгенерировала?
11 kevin
 
10.09.13
11:06
(10) Да, как-то она криво генерит.
12 Asmody
 
10.09.13
11:16
проверь, что у тебя стоит в типе возвращаемого значения в функции веб-сервиса
13 Serginio1
 
10.09.13
11:26
(12) У него и стоит string
<xs:element name="FunResponse">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="return" type="xs:string"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>
14 Serginio1
 
10.09.13
11:28
А возвращает он MassAdress
15 Asmody
 
10.09.13
11:28
(13) так я ему и пытаюсь намекнуть, куда смотреть
16 Serginio1
 
10.09.13
11:37
(5) Смотри что у тебя возвращает, а типы 1С сама добавляет.
В типах можно добавлять возможно пустое.


<operation name="Fun">
            <input message="tns:FunRequestMessage"/>
            <output message="tns:FunResponseMessage"/>
        </operation>
17 kevin
 
10.09.13
12:02
короче, сделал. В 1С есть так называемые операции. Так вот, нужно не только создать соответствующий тип, указать в функции возвращаемый тип и вернуть данные в этом самом типе, но и указать в операции, которая ссылается на эту функцию тип возвращаемого значения. Как-то всё не правильно в этом 1С. Вопрос закрыт.

Теперь не понятно, почему сама 1С данные принимала нормально, а студия не хотела?
18 kevin
 
10.09.13
12:21
(15) (14) Всё верно, в нескольких местах нужно прописать тип.
19 Serginio1
 
10.09.13
12:34
(18) Нужно определить тип в пакете и указать тип возвращаемого значения.
(17) А ты вызывал как сервис или просто как функцию? Если как функцию на толстом клиенте, то 1С не контролирует тип.
20 kevin
 
10.09.13
12:56
(19) Да, указал тип пакета, тип возвращаемого значения в функции, и нужно было еще тип значения операции, которая ссылалась на эту функцию.

Вызывал как сервис, в нем была проблема.