|
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) Да, указал тип пакета, тип возвращаемого значения в функции, и нужно было еще тип значения операции, которая ссылалась на эту функцию.
Вызывал как сервис, в нем была проблема. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |