Имя: Пароль:
1C
1С v8
Передача незаполненных параметров в сторонний веб-сервис
0 masha_x
 
21.09.22
12:55
Добрый день, помогите, пожалуйста, разобраться.
Есть задача настроить интеграцию через сторонний веб-сервис. В нем есть два похожих метода. В обоих есть необязательные параметры. В первом методе в wsdl указано:

<xs:complexType name="getPurchasesByParams">
<xs:sequence>
<xs:element name="dateOperDay" type="xs:dateTime"/>
<xs:element minOccurs="0" name="shopNumber" nillable="true" type="xs:long"/>
<xs:element minOccurs="0" name="cashNumber" nillable="true" type="xs:long"/>
<xs:element minOccurs="0" name="shiftNumber" nillable="true" type="xs:long"/>
<xs:element minOccurs="0" name="purchaseNumber" nillable="true" type="xs:long"/>
</xs:sequence>

Во втором:

<xs:complexType name="getFullPurchasesByParams">
<xs:sequence>
<xs:element name="dateOperDay" type="xs:dateTime"/>
<xs:element minOccurs="0" name="shopNumber" type="xs:long"/>
<xs:element minOccurs="0" name="cashNumber" type="xs:long"/>
<xs:element minOccurs="0" name="shiftNumber" type="xs:long"/>
<xs:element minOccurs="0" name="purchaseNumber" type="xs:long"/>
</xs:sequence>

Если я вызываю первый метод только с одним обязательным параметром dateOperDay, а необязательные параметры оставляю незаполненными:
Прокси.getPurchasesByParams(Параметр.dateOperDay,,,,)
то он отрабатывает корректно.

Если аналогичным образом вызываю второй метод:
Прокси.getFullPurchasesByParams(Параметр.dateOperDay,,,,)
то он отрабатывает с ошибкой

Ошибка при вызове метода контекста (getFullPurchasesByParams): При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса:  {http://plugins.operday.ERPIntegration.crystals.ru/}:FiscalInfoExportService:getFullPurchasesByParams(): При вызове веб-сервиса произошла ошибка. Ошибка SOAP сервера:  Unmarshalling Error: For input string: ""
Код ошибки: Client
Не удалось отправить данные на сервер.

Если же вызываю только с обязательным параметром, а необязательные не указываю вообще:
Прокси.getPurchasesByParams(Параметр.dateOperDay)
и
Прокси.getFullPurchasesByParams(Параметр.dateOperDay)

то получаю ошибку Недостаточно фактических параметров.

Насколько я понимаю, все дело в том, что для второго метода для необязательных параметров в wsdl не указано nillable="true". Хотя вроде бы minOccurs="0" также делает элемент необязательным...

Но при этом, когда я посылаю запрос через  SoapUI и указываю только обязательный параметр:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:plug="http://plugins.operday.ERPIntegration.crystals.ru/">
   <soapenv:Header/>
   <soapenv:Body>
      <plug:getFullPurchasesByParams>
         <dateOperDay>2022-09-14</dateOperDay>
      </plug:getFullPurchasesByParams>
   </soapenv:Body>
</soapenv:Envelope>

то он отрабатывает и возвращает нужные данные. Т.е.как бы параметры-то все же необязательны и их можно не указывать...

Помогите, пожалуйста, совсем запуталась уже
1 ejikbeznojek
 
21.09.22
17:04
nillable="true" же только в 1м сервисе есть.
А во 2м нет.
2 ejikbeznojek
 
21.09.22
18:59
Недочитал немного (0). Я так понял это фича именно 1С.
Судя по тому что пишут в 0 вот тут.
v8: soap nillable="true" или minOccurs="0";
3 masha_x
 
22.09.22
08:47
Спасибо за ответ. Стало немного яснее ))
А что с этим можно сделать? В веб-сервисах сильно плаваю еще. Если это схема стороннего веб-сервиса, я ее менять не могу, правильно же? Можно как-то обойти это? Потому как нужно использовать именно второй сервис и именно с незаполненными параметрами
4 ejikbeznojek
 
22.09.22
18:22
Может пустыми строками заполнить?
5 masha_x
 
23.09.22
08:12
Нет, там числовые значения. И я так понимаю, именно незаполненные нужны. Если ставлю 0, то возвращает пустой результат, если "", то ошибка
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан