Имя: Пароль:
1C
1С v8
Передача необязательных параметров в web-сервис
0 ashamontev
 
25.04.14
06:46
Приведу примитивный пример.
Есть сторонний web-сервис, для поиска неких данных по юридическим и физическим лицам. В нем три параметра.
Первый PhysicalPerson - структура, описывающая физическое лицо. В ней есть обязательные поля, например паспортные данные
Второй JuridicalPerson - структура, описывающая юридическое лицо. В ней есть обязательные поля, например ИНН.
Третий параметр путь будет OrderNumber - номер заказа

Этот сторонний web-сервис определяет данные кого искать по заполненности  первых двух параметров. Если первый Null, а второй нет, тогда искать надо по юр. лицам. Если второй Null, а первый нет, тогда искать по физ. лицам.

Если оба параметра не null, а соответствующие структуры (правильно заполнены), то ругается на то, что одновременно нельзя передавать данные по физ. и юр. лицам - один из параметров должен быть пустым.

Передача в сервис Null вместо одного из параметров выдает ошибку несоответствия типов.
Передача Неопределено (или пропуск параметра) выдает ошибку, что некорректно заполнена соответствующая структура (например, для структуры JuridicalPerson это будет "ИНН обязателен для заполнения 10 цифрами"). Видимо 1С создает объект XDTO и заполняет его дефолтными значениями.

На C# и любом другом языке программирования создается экземпляр объекта JuridicalPerson и присваивается ему значение Null. Именно это и требует сторонний веб-сервис. Т.е. в сервис передается объект типа JuridicalPerson со значением Null.
В 1С о таком даже и мечтать нельзя - увидеть в отладчике переменную какого-то типа со значением Null :)

Может кто знает как это обойти? Очень не хочется поддерживать код в 1С и в какой-то прослойке, написанной на C# или любом другом языке программирования. Т.е. 1С будет дергать некий промежуточный сервис на моей стороне, а уже эта прослойка будет дергать сторонний сервис.

P.S. позвонить в стороннюю компанию, чей сервис я юзаю,  и попалакаться что у меня 1С и, поэтому, нужно переделать контракт метода или обязательность полей (или поднять новый сервис), не вариант.
1 ashamontev
 
25.04.14
06:52
Забыл добавить, что платформа 8.3.4.408, если это имеет значение. Если на какой-то более поздней версии это исправлено, то подскажите, на какой.
2 Wobland
 
25.04.14
06:52
>В 1С о таком даже и мечтать нельзя - увидеть в отладчике переменную какого-то типа со значением Null :)
http://i.imgur.com/Liaw5KB.png
3 Dmitry1c
 
25.04.14
06:57
>JuridicalPerson

(-_\\
4 Dmitry1c
 
25.04.14
06:58
>В 1С о таком даже и мечтать нельзя - увидеть в отладчике переменную какого-то типа со значением Null

Ещё как можно
5 Wobland
 
25.04.14
07:05
телепатирую. у ТС нулл не включен в тип ЖуридикалПёрсон
6 DitriX
 
25.04.14
13:01
а пробовал вообще не заполнять, т.е. ничего не передавать?
7 Serginio1
 
25.04.14
13:42
8 Serginio1
 
25.04.14
13:43
Парамтры должны быть nullable
9 Serginio1
 
25.04.14
13:56
Тьфу nillable
10 ashamontev
 
25.04.14
21:19
> Wobland http://i.imgur.com/Liaw5KB.png
пример, в котором скрыта колоночка "Тип". Видимо 1С там не смог написать что-то отличное от Null.

Не заполнять пробовал. Это аналогично тому, что отправить НЕОПРЕДЕЛЕНО. Только вот у сторонней организации такого типа нет и у них не проходит равенство на Null, что и вызывает в конечном итоге ошибку.

Пробовал из 1С стукануться в сервис 1С с такими же параметрами   и оказалось, что в сервисе значение необязательной переменной будет НЕОПРЕДЕЛЕНО. Понятно, что не в java  ни в c# (не знаю на чем там этот сервис написан) нет такого значения переменной и скорее всего, туда доходит заполненный дефолтами объект, а не как нужно Null
11 su_mai
 
25.04.14
21:45
(8) Точно! А еще должен наследовать интерфейс "INullable" :)
12 Serginio1
 
25.04.14
21:57
(10) В 1С неопределено соответсвует нормальному null.
1C Null это БД шный NULL. http://rsdn.ru/forum/db/5570744.flat

И по БД шной логике (Null==8) будет Null

Вообще параметр должен быть определен как nillable и тогда все будет проходить
v8: Необязательный параметр web сервис
13 Wobland
 
26.04.14
07:08
(10) видимо, так работает табло. не в курсе про тип нулл?
14 ilpar
 
26.04.14
07:23
Посмотри во что сериализуется Неопределено.
Потом посмотри во что сериализуется NULL из запроса.

Эти результаты обсуди с разработчиками сервиса.
15 ashamontev
 
26.04.14
20:43
Очень тяжело попросить стороннюю организацию "посмотреть" как к ним приходит Null и Неопределено

В wsdl эти параметры описываются так:
xs:element type="r:PhysicalPersons" name="PhysicalPersons" minOccurs="0">-<xs:annotation>
<!-- <xs:documentation>Лица, допущенные к вождению</xs:documentation> -->
</xs:annotation></xs:element>-<xs:element type="r:JuridicalPerson" name="JuridicalPerson" minOccurs="0">-<xs:annotation>
<!-- <xs:documentation>Юридическое лицо</xs:documentation> -->
</xs:annotation></xs:element>

В ws-ссылке 1С свойство "Возможно пустое" имеет значение истина.

Вообщем, мне сказали, что веб-сервисы не самая сильная сторона 1С, и даже если я решу эту проблему, то возникут другие, что заставит писать промежуточный сервис на шарпе. Поэтому всем спасибо за помощь

p.s. но очень бы хотелось узнать, как передать Null в веб-сервис :)
16 Serginio1
 
26.04.14
21:16
(15) У тебя minOccurs="0"
Для передачи неопределено параметр должен быть nillable="true"

Не надо тебе никакого промежуточного кода. Используй (7) и наслаждайся.
17 Serginio1
 
26.04.14
23:22
Для тебя minOccurs="0"  параметр может быть не установлен.
И это будет аналогично JavaSctipt unassigned.
В структуре это поле просто отсутствует.
В C# для такого поля создается дополнительное поле Specified
или DefaultValueAttribute или Ссылочный тип, свойство IsNullable=false, либо свойство IsNullable не задано.

http://msdn.microsoft.com/ru-ru/library/vstudio/zds0b35c(v=vs.100).aspx
18 etc
 
26.04.14
23:31
(2) на твоем скринштоте вижу какой-то бред во второй строке:
Выражение:NULL=NULL  Значение:Да
ведь NULL <> NULL на сколько я помню. Именно для этого и ввели в SQL выражение <поле> IS NULL
19 Ksandr
 
26.04.14
23:59
(15) >> мне сказали, что веб-сервисы не самая сильная сторона 1С
Дай угадаю кто тебе это сказал.
Тебе сказали те кто их не осилил?
20 Serginio1
 
27.04.14
00:43
(19) Ну да например v8: soap:Header
И еще куча спецификаций WS-* 1С не поддерживает.
Например Ws-Security Ws-Reliable и др
21 ashamontev
 
27.04.14
09:27
(17) параметр Specified  действительно добавляется при работе с сервисом в C#, но для другого поля. И, как я понял, этот параметр означает "доверять или не доверять значению поля", а не "возможно пустое". Именно в этом сервисе при установке его в false значение параметра игнорируется сервисом при обработке и принимается по-умолчанию. И только Specified true "заставляет" сервис обработать переданное значение.

Как 1С обработает этот Specified, мне неизвестно. Может он всегда False туда подставляет и тут будет точно тупик. Поэтому   меня и попросили "не терять времени" с сервисами на 1С, а сделать прослойку на C#, а для 1С выставить самый примитивный сервис, который он без труда обработает, а все специфические действия для сервиса внешнего контрагента сделает C#
22 Эмбеддер
 
27.04.14
09:41
(18) в SQL условие NULL=NULL не выполняется, а на Си выполняется, так что в 1С это логично что тоже выполняется
23 Serginio1
 
27.04.14
11:33
(21) Понятиие доверять или не доверять это и есть установлено не установлено значение. В 1С тоже есть метод для просмотра установлено значение или нет.
Просто в твоем примере парамеитр minOccurs="0" но не nillable. И установка в null говорит о том что параметр нужно опускать. В итоге все равно передается структура.

Я в итоге и сделал (7) что бы не мучатся с разного рода проблемами коих в те времена было огромное количество.
v8: Объекты Net в IDispatch
24 Эмбеддер
 
27.04.14
13:47
если поле не обязательное, я в 1С ставлю минимальное количество 0, максимальное -1. получается так
minOccurs="0" maxOccurs="unbounded"

и когда я такую конструкцию обрабатываю gsoap (чтобы перевести в код Си), он правильно понимает, что поле необязательное
25 etc
 
27.04.14
16:03
(24) да, только у тебя тогда поле может сколько угодно раз повторяться что в приципе нарушает валидацию файла.