Имя: Пароль:
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, то возвращает пустой результат, если "", то ошибка