Имя: Пароль:
1C
1С v8
вебСервис
0 obscured
 
09.10.13
11:37
Добрый день.
На этом форуме полгода назад была тема про проблему с веб-сервисом:
v8: ВебСервис
Я разработчик серверной стороны, но ни черта не шарю в 1С. Проблема все еще актуальна, к сожалению про эту тему не знал.

Итак, имеем веб-сервис, WSDL можно получить например здесь:
http://demo.omnicomm.ru:8282/AnalyticalServer/ws?wsdl

Имеем проблему с авторизацией через 1С:

{Обработка.Omnicomm.Форма.Форма.Форма(65)}: Ошибка при вызове метода контекста (signIn)
id=Прокси.signIn(Логин, Пароль);
по причине:
Ошибка вызова операции сервиса:  {http://omnicomm.ru/analyticalserver}:AnalyticalServer:signIn()
по причине:
Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://omnicomm.ru/analyticalserver}authResponseEntry - [1,148]
Проверка дополнительного свойства:
    форма: Элемент
    имя: error
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://omnicomm.ru/analyticalserver}authResponseEntry - [1,148]
Проверка дополнительного свойства:
    форма: Элемент
    имя: error
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://omnicomm.ru/analyticalserver}authResponseEntry

Сам authResponseEntry описан в WSDL куском:

<xs:complexType abstract="true" name="baseResponseEntry">
<xs:sequence>
<xs:element minOccurs="0" name="error" type="xs:string"/>
<xs:element minOccurs="0" name="status" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="authResponseEntry">
<xs:complexContent>
<xs:extension base="tns:baseResponseEntry">
<xs:sequence>
<xs:element minOccurs="0" name="dateTimeEnd" type="xs:long"/>
<xs:element minOccurs="0" name="sessionId" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

Фактически веб-сервис возвращает (если подключиться Python'ом):
При ошибке:
(authResponseEntry){
   error = "Signing in failed"
   status = False
}

При правильном логине
(authResponseEntry){
   status = True
   dateTimeEnd = 1381301939
   sessionId = "1c2f83036ce1dd1bd6fc3090016494e440f702c9"
}

Вопрос - что нужно изменить в WSDL, чтобы 1С нормально работал с этим сервисом?
1 Serginio1
 
09.10.13
11:51
Добавь
Убери <xs:extension base="tns:baseResponseEntry">


и добавь
<xs:element minOccurs="0" name="error" type="xs:string"/>
<xs:element minOccurs="0" name="status" type="xs:boolean"/>
2 obscured
 
09.10.13
11:57
А extension 1С в принципе не умеет понимать?
Видимо, придется переделывать, хотя это не самый приятный вариант - WSDL у нас генерируется, придется все классы переписывать (от baseResponseEntry наследуются все сервисы)...
3 Serginio1
 
09.10.13
12:00
(2) не знаю попробуй. Какая платформа 1С стоит?
4 Serginio1
 
09.10.13
12:06
Или попробовать сделать authResponseEntry открытым
5 Serginio1
 
09.10.13
12:10
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:anyAttribute namespace="##any" processContents="lax"/>
6 Serginio1
 
09.10.13
12:35
Или попробуй сделать baseResponseEntry открытым
7 obscured
 
09.10.13
14:44
Спасибо, попробуем оба варианта.
А как в 1С указать адрес веб-сервиса, если WSDL загружается не по ссылке, а из файла?
Хотели попробовать с быстро поправленным файлом проверить, но непонятно, где тогда задавать URL. WSDL генерируется сервером, и быстро поправить код не получится, т.к. проект, ресурсы, бюрократия...
8 obscured
 
09.10.13
14:44
Да, платформа 8.2.
9 Serginio1
 
09.10.13
14:48
А в wsdl файле есть секция

<wsdl:service name="AnalyticalServer">
    <wsdl:port binding="tns:AnalyticalServerSoapBinding" name="AnalyticalServerPort">
      <soap:address location="http://demo.omnicomm.ru:8282/AnalyticalServer/ws"/>;
    </wsdl:port>
  </wsdl:service>

откуда она и берет реальный адрес
10 obscured
 
09.10.13
14:50
Спасибо!
11 Serginio1
 
09.10.13
14:51
По сути подключение по дефолту выглядит так

ОпределениеТ=Новый WSОпределения(ИмяФайла_wsdl);
    WSСервис=ОпределениеТ.Сервисы[0];
    прокси=Новый WSПрокси(ОпределениеТ, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя);
12 obscured
 
09.10.13
15:07
Похоже нашли ошибку у себя в веб-сервисе.
В WSDL-файле описан ответ authResponseEntry.
По факту - сервер возвращает:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
<soap:Body>
<ns1:signInResponse xmlns:ns1="http://omnicomm.ru/analyticalserver">;
<return>
<status>true</status>
<dateTimeEnd>1381311439</dateTimeEnd>
<sessionId>c05f07617a6942d6ed28edf3867c165dfe4b4b86</sessionId>
</return>
</ns1:signInResponse>
</soap:Body>
</soap:Envelope>

Т.е. вместо authResponseEntry - приходит signInResponse.
Может ли быть с этим связано? В других языках (например - в Python с модулем suds) на работоспособность это не влияет, и signInResponse нигде даже не отображается - поэтому не могли долго найти ошибку, пока wireshark'ом не покопались.
13 Serginio1
 
09.10.13
15:11
Только в описании ошибки совсем другое.
14 obscured
 
09.10.13
15:14
Тогда хз, попробуем все варианты - отпишусь.
15 Serginio1
 
09.10.13
15:16
Или подкорректируйте WSDL файл что бы возвращала signInResponse  или anyType
16 Serginio1
 
09.10.13
15:26
Хотя в описании

<wsdl:operation name="signIn">
      <wsdl:input message="tns:signIn" name="signIn">
    </wsdl:input>
      <wsdl:output message="tns:signInResponse" name="signInResponse">
    </wsdl:output>
    </wsdl:operation>

Он на самом деле оборачивает в нужную форму ответ.
17 Serginio1
 
09.10.13
15:27
Это нормальное поведение. 1С тоже оборачивает ответ и параметры в структуру

<xs:element name="HelloResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="return"
                                type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
18 Serginio1
 
09.10.13
15:29
<xs:element name="signInResponse" type="tns:signInResponse"/>
  <xs:complexType name="signInResponse">
    <xs:sequence>
      <xs:element name="return" type="tns:authResponseEntry"/>
    </xs:sequence>
  </xs:complexType>
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой