Имя: Пароль:
1C
 
работа с WSDL
0 Baloven
 
20.12.14
05:53
Доброго дня,

решил себе голову заморочить и реализовать получения списка запрещенных сайтов РКН... ну это не в тему :)
в общем раньше с WSDL не сталкивался:

код
    WSDLОпределение = Новый WSОпределения("http://vigruzki.rkn.gov.ru/services/OperatorRequestTest/?wsdl");//сервер тестирования выгрузок
    WSDLОпределение2 = Новый WSОпределения("http://vigruzki.rkn.gov.ru/services/OperatorRequest/?wsdl");//рабочий сервер выгрузок
    WSDLОпределение1 = Новый WSОпределения("http://86.57.245.235/TimeTable/Service.asmx?WSDL";); //сервер для понятия (моего разумеется) механизма работы
    WSСервис = WSDLОпределение.Сервисы[0];
    WSСервис1 = WSDLОпределение1.Сервисы[0];
    WSСервис2 = WSDLОпределение2.Сервисы[0];
    Proxy = Новый WSПрокси(WSDLОпределение,WSСервис.URIПространстваИмен,WSСервис.Имя,WSСервис.ТочкиПодключения[0].Имя);
    Proxy1 = Новый WSПрокси(WSDLОпределение1,WSСервис1.URIПространстваИмен,WSСервис1.Имя,WSСервис1.ТочкиПодключения[0].Имя);
    Proxy2 = Новый WSПрокси(WSDLОпределение2,WSСервис2.URIПространстваИмен,WSСервис2.Имя,WSСервис2.ТочкиПодключения[0].Имя);
    а1 = Proxy1.GetAirportsList("RU");// здесь все отлично - список аэропортов получаю
    а = Proxy.getLastDumpDateEx(); // здесь ругается на обращение к процедуре объекта как к функции (предположительно дело в том что на выходе несколько параметров
    а2 = Proxy2.getLastDumpDateEx(); // здесь ругается на обращение к процедуре объекта как к функции (предположительно дело в том что на выходе несколько параметров

    б = Proxy.getLastDumpDate(); // здесь на выходе всего 1 параметр и возможно по этому есть ответ без ошибки
    б2 = Proxy2.getLastDumpDate(); // здесь на выходе всего 1 параметр и возможно по этому есть ответ без ошибки


Вопрос к сообществу - как с этим монстром работать - так увы и не понял... потому как в идеале хочется по 1 кнопке отправить файл XML и файл подписи на сервер (sendRequest) и потом через getResult
мне нужно получить файл в ответ указав code из предыдущего запроса...

проблем с формированием xmlи подписи нет - в остальном попросту нет понимания :(
1 Baloven
 
20.12.14
05:54
если кто поможет документация здесь http://vigruzki.rkn.gov.ru/docs/description_for_operators_actual.pdf
2 Эмбеддер
 
20.12.14
06:42
3 Baloven
 
20.12.14
07:14
(2) и как это ко мне относится?
4 Baloven
 
20.12.14
07:19
(2) я не понял как вообще это использовать???? ну создам я структуру - а с какими значениями? я ж написал что понять вообще не могу почему у меня пусть даже может быть со струтурированными данными на выходе мне 1С говорит что я обращаюсь к процедуре как к функции - я даже отладчиком не вижу ответа :(
5 Baloven
 
20.12.14
07:25
(2) и опять же насколько я понимаю в той ветке - там типикстартер - ОТПРАВЛЯЕТ данные на сервер струтурированные, Вы ему подсказыли насколько я понял что нужно обратится в XDTO... у меян ситуация, что я не могу получить от сервера ответ - и не знаю структура это или нет вообще.... потому и задал вопрос
6 Baloven
 
20.12.14
07:31
(2)
даже если так прописать:

    а = Новый Структура;
    а = Proxy.getLastDumpDateEx();

все равно Обращение к процедуре объекта как к функции.... так что бредовый Ваш молчаливый совет
7 Baloven
 
20.12.14
07:34
и даже так

СериализаторXDTO.ЗаписатьXDTO(Proxy2.getLastDumpDateEx())

та же самая ошибка
8 Эмбеддер
 
20.12.14
07:38
почему она тебе говорит, что обращаешься к процедуре как к функции, могу только предположить, что 1С в случае возвращаемого результата с несколькими полями считает, что возвращаемого результата вообще нет

может кто-нибудь знает способ заставить работать 1С с таким веб-сервисом, я же у себя делал работу через http соединение

есть желание разбираться и экспериментировать - попробуй заставить 1С работать своими средствами, нужен результат - сделай как я
9 Эмбеддер
 
20.12.14
07:39
(6) не важно, чем "а" инициализирована до вызова а = Proxy.getLastDumpDateEx();
10 Эмбеддер
 
20.12.14
07:40
(5) проблема на в отправляемых, а в получаемых данных, что из названия темы следует
11 Baloven
 
20.12.14
07:50
(8) (9) (10) только что попробовал поставить просто строку
Proxy.getLastDumpDateEx(); и галку "останавливать по ошибке" так вот теперь он мне выдал что недостачно параметров.... нифига не понимаю ведь в документации сказано что getLastDumpDateEx вызывается без параметров и отдает их 5 штук....
12 Baloven
 
20.12.14
07:51
+(11) простоя я думал присвоив переменную - в нее как раз и получить эти 5 переменных
13 Baloven
 
20.12.14
07:54
уж не знаю как эти параметры задавать/получать
вот так:

Proxy.getLastDumpDateEx("lastDumpDate");

облом

вот так:

Proxy.getLastDumpDateEx().lastDumpDate

облом

И вот так:

Proxy.getLastDumpDateEx().Получить("lastDumpDate")

все то же самое :(
14 Baloven
 
20.12.14
07:55
lastDumpDate - это один из возвращаемых параметров
15 Эмбеддер
 
20.12.14
07:56
(11) в SoapUI смотрю, там нет параметров
запрос такой
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:oper="http://vigruzki.rkn.gov.ru/OperatorRequest/">;
   <soapenv:Header/>
   <soapenv:Body>
      <oper:getLastDumpDateEx/>
   </soapenv:Body>
</soapenv:Envelope>

результат

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:ns1="http://vigruzki.rkn.gov.ru/OperatorRequest/">;
   <SOAP-ENV:Body>
      <ns1:getLastDumpDateExResponse>
         <lastDumpDate>1419051000000</lastDumpDate>
         <lastDumpDateUrgently>1419051000000</lastDumpDateUrgently>
         <webServiceVersion>3.0</webServiceVersion>
         <dumpFormatVersion>2.0</dumpFormatVersion>
         <docVersion>4.1</docVersion>
      </ns1:getLastDumpDateExResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
16 Baloven
 
20.12.14
07:56
который нормально возвращается Proxy.getLastDumpDate - но в этом случае он единственный
17 Эмбеддер
 
20.12.14
07:57
(16) логично, если 1С не понимает возвращаемый Web сервисом тип данных структура...
18 Baloven
 
20.12.14
07:57
ну и ты получил ответ в соответсвии с http://vigruzki.rkn.gov.ru/docs/description_for_operators_actual.pdf - все абсолютно правильно
как его в 1С получить-то?
19 Эмбеддер
 
20.12.14
08:01
если подойдет мое решение через http соединение, могу на почту кинуть через час. а как заставить 1С "прожевать" такой возвращаемый результат - только если это баг поправили в 1С
20 Baloven
 
20.12.14
08:01
я не вижу чтобы в (15) был тип данных структура - ответ правильный, и параметров и на запрос и по доке нету!!!
но весь трабл получить его 1с'кой
21 Baloven
 
20.12.14
08:03
кинь - если не лень - если честно - для меня - это чисто вопрос самообразования и не более того - но всеж хочется его решить и ни как не могу понять в каком месте грабли :(
22 Baloven
 
20.12.14
08:06
... хм может с платформой связано у меня 1.3.58.2 - попробую новую поставить и попробовать - может что изменится
23 alle68
 
20.12.14
09:17
Вроде по-русски написано в инструкции: выходные параметры, 5 штук...
Proxy2.getLastDumpDateEx(п1, п2, п3, п4, п5);
24 Эмбеддер
 
20.12.14
09:28
(23) а Вы точно уверены, что так можно?
25 Эмбеддер
 
20.12.14
09:29
Автор, адрес в личке неправильно указан, письмо не уходит
26 Baloven
 
21.12.14
01:33
(25) какой он старый :) я уже думал что его везде поменял-то :) новый заполнил
27 Baloven
 
21.12.14
01:38
(23) здесь главное ВЫХОДНЫЕ параметры, т.е. он отдать их 5 штук должен
специально на белавиа эксперементировал - там 1 параметр на входе (язык на котором сервис отдаст названия аэропортов) и отдает он таблицу и все нормально работает
getLastDumpDate - тоже без параметра (как и getLastDumpDateEx), но в первом случае реально 1С получает ответ но там тольео 1 параметр выходной, а второй почему-то не работает и там выходных 5 параметров
в (15) получен Эмббеддер'ом правильный ответ на запрос без параметров
28 Baloven
 
21.12.14
01:40
+(23) если по вашему так - то что туда в параметры передать-то? пустые строки или пустые типизированные переменные?
29 Baloven
 
21.12.14
02:30
поставил новую платформу - результат тот же :(
30 hhhh
 
21.12.14
02:44
(27) ну создай пакет xdto, где перечисли эти 5 параметров и распиши их типы.
31 alle68
 
21.12.14
05:27
(28) Передавать ничего не надо, надо указать какие переменные принимают ВЫХОДНЫЕ параметры. В чём проблема принять 5 значений примитивного типа?

Выражение    Значение    Тип
'1970-01-01'+п1/1000    21.12.2014 2:10:00    Дата
п2    1 419 127 800 000    Число
п3    "3.0"    Строка
п4    "2.0"    Строка
п5    "4.1"    Строка
32 Эмбеддер
 
21.12.14
06:06
(31) см. (24) Вы точно уверены, что можно таким образом получать выходные данные? или это предположение?
33 Baloven
 
21.12.14
06:13
(31) и как их получить? я ж писал что ошибку выдает обращения к процедуре как к функции... вы хоть бы сами попробовали - строки моего кода рабочие-то (точнее там указано что работает а что нет и чего хочется добиться!!!
(30) пример можно?
(32) получил - спасибо, сейчас гляну
34 Baloven
 
21.12.14
06:19
+(30) по в идеале (сейчас неуверен, но по мойму так и есть) когда смотрел отладчиком Proxy - где-то видел описание в какой-то из веток и входных и выходных параметров и их типы, т.е. исходя их этого - по сути можно статически не прописывая типы - выдернуть все это из того же Proxy... щас попробую еще раз поковырять найду - отпишусь
...но все же как работать (создавть/описывать) эти самые XDTO пакеты?
35 hhhh
 
21.12.14
06:25
(34) ну есть в ут и в бп, в конфигурации описано. ну где общие модули, там ниже. Посмотри готовые как в типовых сделано.
36 Baloven
 
21.12.14
06:26
... да так и есть насчет описания типов параметров, например:

Proxy.Определение.Сервисы[0].ТочкиПодключения[0].Интерфейс.Операции[1].Параметры

содержит колекцию WSПараметр - выходных (там вообще-то перечислено выходные они или выходные) для getLastDumpDateEx
37 Baloven
 
21.12.14
06:27
(35) нет у меня ни УТ ни бухии у меня УПП стоит, а качать указанные - ну ... дорого - нет у нас безлимитов :(
38 Baloven
 
21.12.14
06:29
(36) "...перечислено выходные они или выходные" имел ввиду конечно же входные или выходные
39 alle68
 
21.12.14
06:31
(32) Если я их получил (см. таблицу в 31), то, наверное, уверен!
40 Baloven
 
21.12.14
06:32
(39) ты просто молодец - так объясни нучам каким кодом ты это получил?
41 alle68
 
21.12.14
06:38
Строку а2 = Proxy2.getLastDumpDateEx(); // здесь ругается
заменил на (23).
42 Baloven
 
21.12.14
06:40
(39) alle68 извиняюсь - буру свои слова обратно - вы правы!!!

в общем код:

Перем п1, п2, п3, п4, п5;
WSDLОпределение2 = Новый WSОпределения("http://vigruzki.rkn.gov.ru/services/OperatorRequest/?wsdl";);
WSСервис2 = WSDLОпределение2.Сервисы[0];
Proxy2 = Новый WSПрокси(WSDLОпределение2,WSСервис2.URIПространстваИмен,WSСервис2.Имя,WSСервис2.ТочкиПодключения[0].Имя);
Proxy2.getLastDumpDateEx(п1, п2, п3, п4, п5);


в итоге в обозначенных переменных и будут значения - спасибо огромное
43 Baloven
 
21.12.14
06:41
+ (42) причем типизированные и описывать их нет надобности :)
44 Baloven
 
21.12.14
06:43
а насчет того что на выходе числа вместо времени - так в доке и указано что на выходе время в миллисекундах :)
45 Baloven
 
21.12.14
06:46
хорошо, с этим понятно, а может кто подскажет теперича как отправить файлы параметрами? я так понимаю что нужно аналогично getLastDumpDateEx в параметрах sendRequest
(там 3 входные и 3 выходные) указать 3м входным параметрам задать их значения, а выходные по принцыпу выше?
46 Эмбеддер
 
21.12.14
06:51
(44) миллисекунды поделить на 1000 и прибавить к 01.01.1970
47 Baloven
 
21.12.14
06:58
(46) я это понял в (31) это написано :) это я "разжевал" для тех кто будет в далеком будущем читать эту ветку :)
48 hhhh
 
21.12.14
07:25
49 Baloven
 
22.12.14
05:35
вот что получилось:

    Перем lastDumpDate, lastDumpDateUrgently, webServiceVersion, dumpFormatVersion,docVersion;//getLastDumpDateEx
    Перем requestFile,signatureFile;//sendRequest входные
    Перем result,resultComment,code;//sendRequest выходные
    
    Перем result_getResult,resultComment_getResult,registerZipArchive,resultCode_getResult,dumpFormatVersion_getResult;//getResult Выходные
    
    ЗапросXML = "C:\RKN\Request.xml";
    Подпись = "C:\RKN\Request.xml.sig";
    Результат = "C:\RKN\rezult.zip";
    Сервис = "http://vigruzki.rkn.gov.ru/services/OperatorRequestTest/?wsdl";;
    WSDLОпределение = Новый WSОпределения(Сервис);
    WSСервис = WSDLОпределение.Сервисы[0];
    Proxy = Новый WSПрокси(WSDLОпределение,WSСервис.URIПространстваИмен,WSСервис.Имя,WSСервис.ТочкиПодключения[0].Имя);
    Proxy.getLastDumpDateEx(lastDumpDate, lastDumpDateUrgently, webServiceVersion, dumpFormatVersion, docVersion);

    ддЗапросXML = Новый ДвоичныеДанные(ЗапросXML);
    ддПодпись = Новый ДвоичныеДанные(Подпись);
    ТипДвоичныеДанные    = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "base64Binary");

    requestFile      = ФабрикаXDTO.Создать(ТипДвоичныеДанные,ддЗапросXML);
    signatureFile   = ФабрикаXDTO.Создать(ТипДвоичныеДанные,ддПодпись);
    Proxy.sendRequest(requestFile,signatureFile,dumpFormatVersion,result,resultComment,code);
    
    Proxy.getResult(code,result_getResult,resultComment_getResult,registerZipArchive,resultCode_getResult,dumpFormatVersion_getResult);

только теперь я опять туплю как из registerZipArchive (это и есть файл результата, т.е. по сути ZIP-архив - как его сохранить на диск?
50 Baloven
 
22.12.14
06:45
все задачу решил :)
конечный результат - куму нужно пользуйтесь, только вот я не понял - неужели сохранять двоичные данные можно только через хранилище значений?

    Перем lastDumpDate, lastDumpDateUrgently, webServiceVersion, dumpFormatVersion,docVersion;//getLastDumpDateEx
    Перем requestFile,signatureFile;//sendRequest входные
    Перем result,resultComment,code;//sendRequest выходные
    
    Перем result_getResult,resultComment_getResult,registerZipArchive,resultCode_getResult,dumpFormatVersion_getResult;//getResult Выходные
    ЗапросXML = "C:\RKN\Request.xml";
    Подпись = "C:\RKN\Request.xml.sig";
    Результат = "C:\RKN\rezult.zip";
    Сервис = "http://vigruzki.rkn.gov.ru/services/OperatorRequestTest/?wsdl";;
    WSDLОпределение = Новый WSОпределения(Сервис);
    WSСервис = WSDLОпределение.Сервисы[0];
    Proxy = Новый WSПрокси(WSDLОпределение,WSСервис.URIПространстваИмен,WSСервис.Имя,WSСервис.ТочкиПодключения[0].Имя);
    Proxy.getLastDumpDateEx(lastDumpDate, lastDumpDateUrgently, webServiceVersion, dumpFormatVersion, docVersion);

    ддЗапросXML = Новый ДвоичныеДанные(ЗапросXML);
    ддПодпись = Новый ДвоичныеДанные(Подпись);
    ТипДвоичныеДанные    = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "base64Binary");

    requestFile      = ФабрикаXDTO.Создать(ТипДвоичныеДанные,ддЗапросXML);
    signatureFile   = ФабрикаXDTO.Создать(ТипДвоичныеДанные,ддПодпись);
    Proxy.sendRequest(requestFile,signatureFile,dumpFormatVersion,result,resultComment,code);
    
    Proxy.getResult(code,result_getResult,resultComment_getResult,registerZipArchive,resultCode_getResult,dumpFormatVersion_getResult);
    УдалитьФайлы(Результат);
    ХранилищеФайла = Новый ХранилищеЗначения(registerZipArchive);
    ХранилищеФайла.Получить().Записать(Результат);
51 Baloven
 
22.12.14
06:48
ну и да если кому действительно нужно для получение с сайта РКН файла выгрузки - то нужно тестовый сервер сменить на действующий и делать ожидание получения файла (переменная code) с периодической проверкой getResult, ну а для этого code надо в переменный формы/модуля или куда хотите с признаком Экспорт :)