Имя: Пароль:
1C
1С v8
Помогите разобраться с web-сервисом. Как передать структуру (массив) как параметр ?
0 Румата
 
14.12.17
11:57
Начал разбираться с Веб - сервисами.
WSDL-файл, который является описанием web-сервиса, в конфигурацию загрузил. Его предоставил наш контрагент, с которым мы налаживаем обмен информацией.

Приинициализировать объект-посредник (типа WSПрокси).
НашСервис =WSСсылки.Портал.СоздатьWSПрокси("XXX","XXXX","ХХХХ");

Отладил, все нормально, подключается...

Теперь хочу обратится к методу Веб-сервиса. Читаю документацию, а там в качестве параметра метода передается состовной параметры, т.е. параметр, который в моем случае состоит из трех параметров.

Как этот составной параметр передать веб-сервису ? Подскажите пожалуйста, кто уже сталкивался ...
1 Mankubus
 
14.12.17
12:02
(0)
СоставнойПараметр = НашСервис.ФабрикаXDTO.Создать(НашСервис.ФабрикаXDTO.Тип("ПространствоИмен","ИмяТипа"));
СоставнойПараметр.Поле1 = ЗначениеПоля1;
СоставнойПараметр.Поле2 = ЗначениеПоля2;
СоставнойПараметр.Поле3 = ЗначениеПоля3;
2 asady
 
14.12.17
12:04
(0) как правило это json объект
можно тупо сгенерить json строку и отправить
3 VS-1976
 
14.12.17
12:06
(0) Загони web-сервис в WS-ссылки. Далее посмотри его XTDO ( для данной процедуры ). И загоняй в его структуру данные.
4 Fragster
 
гуру
14.12.17
12:06
(2) что за бред?
5 Остап Сулейманович
 
14.12.17
12:10
(4) Примерно так :
1. Сделать метод веб-сервиса с единственным входным параметром типа строка.
2. На вызывающей стороне все укладывать в строку (в строку с разделителями, в ХМЛ, в Джейсон) и скармливать ее методу веб-сервиса.
3. На стороне сервиса парсить строку и получать все три параметра.
6 Fram
 
14.12.17
12:10
я б этим программистам, расшаривающим через SOAP методы со сложными параметрами, ноги бы отрывал
7 Остап Сулейманович
 
14.12.17
12:11
+ (5) Кстати так получалось передавать таблицу значений (правда с колонками простых типов), уложенную в ХранилищеЗначения.
8 Fragster
 
гуру
14.12.17
12:12
(5) нафига тогда SOAP? Она нужен, чтобы формализовать обмен, а не ради бессмысленного воерхэда
9 Fragster
 
гуру
14.12.17
12:12
(6) может ты просто не умеешь готовить?
10 Fragster
 
гуру
14.12.17
12:12
(7) возьми с полки пирожок
11 Fragster
 
гуру
14.12.17
12:13
(8)* оверхэда
12 Остап Сулейманович
 
14.12.17
12:14
+ (7) Кстати 1С в примере передачи ТабличногоДокумента на мобильное устройство поступало точно также. ТабличныйДокумент на стороне сервера укладывался в Хранилище. Передавался через ВЕБ-сервис. И на стороне мобильного устройства получался из Хранилища.
13 Fram
 
14.12.17
12:15
(9) ну, знаешь.. подготовить в 1с сложный параметр под метод соап вебсервиса написанного на java, то еще удовольствие
14 Fram
 
14.12.17
12:16
(13) способ (5) намного проще для обеих сторон
15 Fragster
 
гуру
14.12.17
12:17
(13) не вижу ничего сложного, если в wsdl всё описано.
16 Fragster
 
гуру
14.12.17
12:17
(14)->(8)
17 Fram
 
14.12.17
12:19
(15) при динамическом вызове (без создания объекта в конфе) это долго и муторно
18 Fragster
 
гуру
14.12.17
12:21
(17) ничуть, см пример в http://fragster.ru/wsfor1c/ (там, конечно, нет большой вложенности объектов, ибо пример), но воспользоваться нужной фабрикой без веб добавления ссылки в конфигурацию очень просто.
19 Fram
 
14.12.17
12:22
(16) ну, что предоставила другая сторона, тем и пользовались. это было лет 10 назад. тогда соап в моде был
20 Fragster
 
гуру
14.12.17
12:22
Прокси = Новый WSПрокси(Определение, ПространствоИменСервиса, ИмяСервиса, ИмяТочкиПодключения);
    Фабрика = Определение.ФабрикаXDTO;

    ОбъектСервиса = Фабрика.Создать(Фабрика.Тип(ПространствоИменСервиса, "TestClass41"));
    ОбъектСервиса.a = Параметр41;
    ОбъектСервиса.b = Параметр42;
    ОбъектСервиса.res = 0;
    ОбъектРезультат = Прокси.test4(ОбъектСервиса);

    Результат41 = ОбъектСервиса.res;
    Результат42 = ОбъектРезультат.res;
21 Fragster
 
гуру
14.12.17
12:23
для массива
    Определение = Новый WSОпределения(АдресWSDL);

    Прокси = Новый WSПрокси(Определение, ПространствоИменСервиса, ИмяСервиса, ИмяТочкиПодключения);
    Фабрика = Определение.ФабрикаXDTO;

    ОбъектСервиса = Фабрика.Создать(Фабрика.Тип(ПространствоИменСервиса, "TestClass51"));
    Для Каждого Стр Из Параметр5 Цикл
            Элемент = Фабрика.Создать(Фабрика.Тип(ПространствоИменСервиса, "TestClass52"));
            ЗаполнитьЗначенияСвойств(Элемент, Стр);
            ОбъектСервиса.arr.Добавить(Элемент);
    КонецЦикла;
    ОбъектРезультат = Прокси.test5(ОбъектСервиса);
    Результат5.Очистить();
    Для каждого ЭлементРезультата Из ОбъектРезультат.res Цикл
            Результат5.Добавить().res = ЭлементРезультата;
    КонецЦикла;
22 Fragster
 
гуру
14.12.17
12:23
лишних строк практически нет
23 Fragster
 
гуру
14.12.17
12:23
(12) это сделано ради сжатия данных
24 Fram
 
14.12.17
12:24
(21) писать столько кода на каждый уровень вложенности считаю не очень нормальным
25 Fram
 
14.12.17
12:25
(24) + а в моем случае объект был очень сложным по структуре
26 Fragster
 
гуру
14.12.17
12:26
(24) ну, можно написать функцию из 3 (трёх, карл!) строк, которая создаст весь объект со всеми свойствами
27 Fram
 
14.12.17
12:31
(26) подход в (5) проще. собственно, следующая версия, используемого мной вебсервиса, уже реализовывала уже такой подход.
28 Fragster
 
гуру
14.12.17
12:34
(27) тогда отказывайтесь от soap вообще, тем более, что оверхэд там реально большой относительно http, где-то +25%
29 Fragster
 
гуру
14.12.17
12:36
вся сила - в формализации. Не все, к сожалению, понимают, что статическая типизация - путь к избавлению от кучи "детских" ошибок (опечаток, и т.п.). Вон, даже от жаваскрипта в тайпскрипт переходят.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший