Имя: Пароль:
1C
1С v8
Как передать 3 параметра вместо 4 в функцию ws-ссылки
, ,
0 rumi
 
17.03.20
13:12
Добрый день.
Существует сервис, с которым происходит обмен через ws-ссылку.

В конкретном случае у их web сервиса есть метод SaveDataObjectRecord(dataObjectRecord, lang, version, runAs)
В дереве ws ссылки:

DataObjectRecord - Возможно пустое: Истина
lang - Возможно пустое:             Истина
version: Возможно пустое:           Ложь
runAs = Возможно пустое:            Истина

Но при попытке отправки запроса с тремя параметрами, например без runAs
SaveDataObjectRecord(dataObjectRecord, lang, version)
1С перед отправкой выдает ошибку: "Недостаточно физических параметров"
Вроде как есть "какая-то галочка" которую можно убрать. Подскажите, пожалуйста.
1 rumi
 
17.03.20
13:15
2 Cyberhawk
 
17.03.20
13:19
Так "Возможно пустое" - это не про возможность опустить его, а про возможность передавать туда Неопределено
3 rumi
 
17.03.20
13:21
(2) У них этот параметр runAs не проходит проверку на NULL. Сервер возвращает ответ "SERVER_ERROR", причем первые два параметра сделаны с этой проверкой
4 rumi
 
17.03.20
13:22
(2) Смысл в том, чтобы Вызвать функцию с тремя параметрами, но чтобы при этом 1С не ругался, что их 3, а не 4
5 Cyberhawk
 
17.03.20
13:22
(4) Откуда потребность "Вызвать функцию с тремя параметрами"?
6 rumi
 
17.03.20
13:26
(5) Ответ от разработчика web сервиса.
"Будет работать, если вызовите с тремя параметрами, причем четвертый runAs не указывайте как null. Его просто не должно быть".
7 Cyberhawk
 
17.03.20
13:27
(6) Передавай туда Неопределено, не баклань
8 rumi
 
17.03.20
13:27
(7) Сервер возвращает ответ "SERVER_ERROR"
9 Cyberhawk
 
17.03.20
13:30
(8) А прокси в коде как создаешь - из файла / wsdl-описания или своего пакета? У тебя параметр в этой операции ендпоинта обязательный, поэтому не указывать не получится. Минимальное количество = 0 надо поставить в wsdl-описании, тогда заработает.
10 Cyberhawk
 
17.03.20
13:30
Но это придется динамически править wsdl-описание, коли оно кривое у поставщика сервиса
11 rumi
 
17.03.20
13:34
(9) из файла. Поставщик ленивый. Говорит, что за полгода не смогли разобраться как исправить
12 rumi
 
17.03.20
13:37
(10) Как править подскажите, пожалуйста
13 rumi
 
17.03.20
13:39
https://radikal.ru/big/lm2lry3j40w0l
Какое-то значение отсюда взять и подставить перед вызовом?
14 rumi
 
17.03.20
13:43
(9)
Определение = Новый WSОпределения("http://srs.gs1ru.org/GS46_Interfaces/GS1RU_Operations?wsdl";, Пользователь, Пароль);
Прокси = Новый WSПрокси(Определение, ПространствоИмен, ИмяСервиса, ТочкаПодключения);  
Прокси.Пользователь = Пользователь;
Прокси.Пароль = Пароль;
15 Cyberhawk
 
17.03.20
14:16
(11) Кинь файл
16 rumi
 
17.03.20
14:25
(15)
Определение = Новый WSОпределения("http://srs.gs1ru.org/GS46_Interfaces/GS1RU_Operations?wsdl";, Пользователь, Пароль);
        Прокси = Новый WSПрокси(Определение, ПространствоИмен, ИмяСервиса, ТочкаПодключения);  
        Прокси.Пользователь = Пользователь;
        Прокси.Пароль = Пароль;
        
        типdataObjectRecord = Прокси.ФабрикаXDTO.Тип(ПространствоИмен, "dataObjectRecord");
        Параметр_DataObjectRecord = ПолучитьОбъектDataObjectRecord(Прокси);
        Параметр_change_version = false;
        Параметр_lang = "RU";
        Параметр_runAs = Пользователь;
        
        ПолученныеДанные = Прокси.SaveDataObjectRecord(Параметр_DataObjectRecord, Параметр_lang, Параметр_change_version);
17 rumi
 
17.03.20
14:28
(15)
Файл получаю по ссылке... Правда она сейчас перестала работать. Может начали ковырять в ней

<xsd:complexType name="SaveDataObjectRecord">
<xsd:sequence>
  <xsd:element name="DataObjectRecord" type="ns0:dataObjectRecord" form="qualified" minOccurs="0"/>
  <xsd:element name="lang" type="xsd:string" form="qualified" minOccurs="0"/>
  <xsd:element name="change_version" type="xsd:boolean" form="qualified"/>
  <xsd:element name="runAs" type="xsd:string" form="qualified" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
18 rumi
 
17.03.20
14:31
19 rumi
 
17.03.20
15:11
(15)
подняли web сервис. Теперь там другой файлик, но смысл тот же.

https://dropmefiles.com/pxaTF
20 Cyberhawk
 
17.03.20
16:08
Схему-то скинь
21 Cyberhawk
 
17.03.20
16:10
А лучше логин и пароль
22 rumi
 
17.03.20
16:21
l: 4660059229997
p: 906214335
23 Cyberhawk
 
17.03.20
16:35
Нормально все в схеме, minOccurs = 0
24 rumi
 
17.03.20
16:51
(23)
Это означает, что значение параметра можно передать как Неопределено. Верно?
Смысл в том, что их серверу нужно передать функцию с ТРЕМЯ параметрами . Если вызвать функция(п1, п2, п3, Неопределено), то приходит ошибка SERVER_ERROR
25 Cyberhawk
 
17.03.20
16:53
Вообще есть ощущение, что 1С при импорте ВС-ссылки сама разворачивает объект-параметр на 4 входящих параметра.
Попробуй вызывать операцию прокси с одним параметром (ХДТО-объектом) с тремя свойствами.
26 Cyberhawk
 
17.03.20
16:55
wrapped-стайл и все такое. Мрак.
27 rumi
 
17.03.20
17:06
"Недостаточно фактических параметров" (26)
28 rumi
 
17.03.20
17:12
Можно ли как-то убрать проверку от 1С на количество параметров?
29 arsik
 
гуру
17.03.20
17:24
(28) Попробуй вот так сделать
<xs:complexType name="SaveDataObjectRecord">
        <xs:sequence>
            <xs:element name="DataObjectRecord" type="tns:dataObjectRecord" form="qualified" minOccurs="0"/>
            <xs:element name="lang" type="xs:string" form="qualified" minOccurs="0"/>
            <xs:element name="change_version" type="xs:boolean" form="qualified"/>
            <xs:element name="runAs" type="xs:string" nillable="true" form="qualified" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
30 arsik
 
гуру
17.03.20
17:28
+ (29) Ну или вообще так оставь
<xs:complexType name="SaveDataObjectRecord">
        <xs:sequence>
            <xs:element name="DataObjectRecord" type="tns:dataObjectRecord" form="qualified" minOccurs="0"/>
            <xs:element name="lang" type="xs:string" form="qualified" minOccurs="0"/>
            <xs:element name="change_version" type="xs:boolean" form="qualified"/>
            <xs:element name="runAs" type="xs:string" nillable="true" form="qualified" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
31 arsik
 
гуру
17.03.20
17:28
+ (30) Сори. Вот так
<xs:complexType name="SaveDataObjectRecord">
        <xs:sequence>
            <xs:element name="DataObjectRecord" type="tns:dataObjectRecord" form="qualified" minOccurs="0"/>
            <xs:element name="lang" type="xs:string" form="qualified" minOccurs="0"/>
            <xs:element name="change_version" type="xs:boolean" form="qualified"/>
        </xs:sequence>
    </xs:complexType>
32 rumi
 
17.03.20
17:30
(31) К сожалению, я не могу у них на сервере подредактировать этот файлик. Они упираются рогами, что у них всё ок.
33 arsik
 
гуру
17.03.20
17:31
(32) Зачем на их сервере? Ты можешь их схему сохранить в файл и поправить его. И при создании использовать его, а не с их сайта.
34 arsik
 
гуру
17.03.20
17:34
+(33) Ну или прямо импортировать схему в 1С и там ее поправить.
https://i.imgur.com/RgvnXpC.png
35 Cyberhawk
 
17.03.20
17:47
(27) Ок. В ХДТО-пакете ВС-ссылки поставь "Возможно пустое" = Истина, это и есть nillable = true
36 Cyberhawk
 
17.03.20
17:48
Но вообще конфигурацию насиловать необязательно, в (10) и подразумевался способ, описанный в (33).
37 rumi
 
17.03.20
21:49
(34) (36)
Начал сначала:

Удалил из конфы WS-ссылку
Добавил из файла xsd схему. В конфе появился XDTO-пакет.
Удалил параметр runAs.
Заполнил параметры:

Определение = Новый WSОпределения("http://srs.gs1ru.org/GS46_Interfaces/GS1RU_Operations?wsdl";, Пользователь, Пароль);
Прокси = Новый WSПрокси(Определение, ПространствоИмен, ИмяСервиса, ТочкаПодключения,);
        
Прокси.Пользователь = Пользователь;
Прокси.Пароль = Пароль;

типSaveDataObjectRecord = ФабрикаXDTO.Тип(ПространствоИмен, "SaveDataObjectRecord");
параметрыSaveDataObjectRecord = ФабрикаXDTO.Создать(типSaveDataObjectRecord);
        
параметрыSaveDataObjectRecord.dataObjectRecord = ПолучитьОбъектDataObjectRecord();
параметрыSaveDataObjectRecord.change_version = false;
параметрыSaveDataObjectRecord.lang = "RU";

Здесь туплю. Как его теперь отправить и получить ответ?
ОтветОтСервера = ???
38 Cyberhawk
 
18.03.20
09:23
(37) Зачем ты что-то в конфу добавляешь и правишь в ней, если прокси все равно создаешь по wsdl-описанию из онлайна (от поставщика сервиса)?
"Как его теперь отправить и получить ответ?" // Ну так же, как и раньше - Прокси.SaveDataObjectRecord(параметрыSaveDataObjectRecord);
39 rumi
 
18.03.20
13:53
(38)
Потому у меня и пошел ступор, что все равно придется вызывать функцию у них на сервере и передавать туда параметры (а их там будет 4), хотя в XML описана эта функция с одним параметром parameters в который и добавляем нужные.

На самом деле тут проблема в том, что 1С почему-то по разному импортирует XML блоки.
Может быть есть какая-то обработка для редактирования импортированной схемы из ws-ссылки?

Написал к ним в тех поддержку. Они создали тикет. Надеюсь удалят ненужный им параметр из XML
40 Cyberhawk
 
18.03.20
16:31
"1С почему-то по разному импортирует XML блоки" // Ну, в (25) же об этом речь.
У тебя всегда есть железобетонный вариант, который сработает всегда - это формировать СОАП-конверт вручную (в виде xml-текста) и стучаться в веб-сервис не через ВС-прокси, а через ХТТП-соединение
41 rumi
 
13.04.20
18:06
(40) К сожалению, так и сделал. Вручную составлял запрос через HTTPСоединение.
Вот здесь похожая тема
https://partners.v8.1c.ru/forum/message/1781734
42 DES
 
13.04.20
18:10
4 ПАРАМЕТР ПОПРОБУЙ 0 ИЛИ -1
43 rumi
 
13.04.20
18:19
(42) Пробовал. Проверки на null у них нет (выполнение на сервере прекращается), а на любое другое значение  стоит заглушка - возвращает ошибку, что такое значение нельзя использовать. Криворукие разрабы. Говорят, что у всех работает, проблема в 1С. В чем-то они конечно правы, но они сами костылей напихали.
44 rumi
 
13.04.20
18:20
*Сервис на java
45 sevod
 
13.04.20
21:09
(43) Есть утилита SoapUI. Если из нее работает, ковыряй дальше у себя. Если не работает, шлешь им все настройки тестовые и пусть правят. Они ее наверняка знают.
46 pechkin
 
13.04.20
23:04
А если пустую строку передать?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший