Имя: Пароль:
1C
1С v8
Передача сообщения стороннему web-service
,
0 TanjaWing
 
05.06.15
07:10
Уважаемые эксперты! В 1с (ЗУП 8.2) я создала WS_Ссылку, заполнила параметры, но при выполнении функции с этими параметрами возникает ошибка (к общедоступным сервисам обращалась, проблем не возникает). Установила SoapUI и в нем проверила: автоматически созданное сообщение тоже вызывает ошибку. Но у меня есть пример "правильного" soap сообщения, если отправляю его в SoapUI, то ошибки не возникает. Как -то повлиять на разработчиков сервиса возможности нет. Мне нужно просто отправлять самостоятельно созданный XML на этот сервис из 1С. Здесь у меня возникла загвоздка, так как не знаю как отправить свое сообщение. Хотелось бы еще прочитать автоматически созданное сообщение и его отредактировать, т.к. это будет менее трудоемко.
1 sapphire
 
05.06.15
07:31
Придется отправлять через хттп
2 sda553
 
05.06.15
07:34
(0) xmlhttprequest и в нем формируй "правильное" соап сообщение
3 TanjaWing
 
05.06.15
07:39
т.е работать с xmlhttprequest из 1С?
4 sda553
 
05.06.15
07:40
(3) абсолютно
5 sapphire
 
05.06.15
07:49
(2) можно встроенный объект использовать
6 sapphire
 
05.06.15
07:51
(2) что его формировать то, заполнил текст, как надо, установил заголовки и отправил методом пост
7 sda553
 
05.06.15
07:54
(6) Ты несколько локально смотришь. Поднимись на уровень выше и подумай, а что если завтра будет еще какой то сторонний вс? А если эта фирма добавит функционала? Может стоит унифицировать создание таких сообщений, собрав данный функционал в едином модуле
8 sapphire
 
05.06.15
07:56
(7) я нормально смотрю, а если там линукс?
9 sapphire
 
05.06.15
07:58
(7) да и лучше таки не в модуле, а в обработке. Кошерней семантически
10 TanjaWing
 
05.06.15
10:33
я попробовала через Http соединение. Дело в том, что у меня есть WDSL ссылка: https://wingsppd.firmweb.firmnet/PSIGW/PeopleSoftServiceListeningConnector/NODE_WN85WPPD/function.1.wsdl, я не знаю нужных параметров для соединения. server = "wingsppd.firmweb.firmnet", а адрес ресурса "PSIGW/PeopleSoftServiceListeningConnector/NODE_WN85WPPD/function.1.wsdl". Возникает ошибка при оправке методом Post. Понимаю, что неправильные параметры передаю. Можно ли из WDSL  ссылки получить адрес ресурса? Вариант с xmlhttprequest я тоже рассматриваю, но мне хочется побыстрее получить вменяемый ответ от WS в 1с.
11 oleg_km
 
05.06.15
10:40
(10) Традиционный совет: фиддлер тебе в помощь. Сравни в нем, что отсылает SoapUI и что 1С. Увидишь разницу. Будешь двигаться дальше
12 Serginio1
 
05.06.15
10:43
13 sapphire
 
05.06.15
10:53
(12) Исчо один :)
14 sapphire
 
05.06.15
10:56
(10) В SoapUI стяни параметры
15 Serginio1
 
05.06.15
11:33
(13) Угу лучше заниматься сексом с SOAP на уроне HTTP запросов. Мыши кололись, плакали но жрали кактус.
16 sda553
 
05.06.15
11:37
Дарю, 6 лет назад ваял с использование xmlhttprequest, сейчас наверняка можно переделать на httpСоединение (6 лет назад его еще не было)

Функция    ИнициализироватьФабрику()
    активком = Новый ComОбъект("Microsoft.XMLHTTP");
    активком.open("POST", WSPORT()+"?wsdl", false);
    активком.send("<?xml version=""1.0"" encoding=""UTF-8""?>
        |<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">; <soap:Header/>
        |<soap:Body> <m:ПриветНикарагуа xmlns:m=""http://www.sample-package.org""/>; </soap:Body>
        |</soap:Envelope>");
    Пока активком.ReadyState<>4 Цикл
        ОбработкаПрерыванияПользователя();
    КонецЦикла;        
    Если активком.Status<>200 Тогда
        Сообщить("Не удалось установить соединение с внешним WS. Описание ошибки:"+активком.ResponseText);
        Возврат Ложь;
    КонецЕсли;    
    СтрокаXML = активком.ResponseText;        
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    НовыйПостроительДом = Новый ПостроительDOM;
    НовыйДокументДом = НовыйПостроительДом.Прочитать(ЧтениеXML);
    ЭлементНаш = НовыйДокументДом.ПолучитьЭлементыПоИмени("types").Элемент(0).ПервыйДочерний;
    ДокументДомНужный = Новый ДокументDOM("http://www.w3.org/2001/XMLSchema","xs:schema";);
    //ЭлементИмпорта = ДокументДомНужный.ИмпортироватьУзел(ЭлементНаш,Ложь);    
    //ДокументДомНужный.ЗаменитьДочерний(ЭлементИмпорта,ДокументДомНужный.ЭлементДокумента);
    ЭлементНовый =   ДокументДомНужный.ЭлементДокумента;
    Для каждого атр Из ЭлементНаш.Атрибуты Цикл
        НовАтр = ДокументДомНужный.ИмпортироватьУзел(атр,Истина);
        ЭлементНовый.Атрибуты.УстановитьИменованныйЭлемент(НовАтр);
    КонецЦикла;    
    ЭлементДочерний = ЭлементНаш.ПервыйДочерний;
    Пока Истина Цикл
        Если ЭлементДочерний.ИмяЭлемента="xs:complexType" Тогда
            ЭлементНовыйДочерний = ДокументДомНужный.ИмпортироватьУзел(ЭлементДочерний,Истина);
            ЭлементНовый.ДобавитьДочерний(ЭлементНовыйДочерний);
        КонецЕсли;        
        Если ЭлементДочерний.СледующийСоседний = Неопределено Тогда
            прервать;            
        КонецЕсли;
        ЭлементДочерний = ЭлементДочерний.СледующийСоседний;
    КонецЦикла;        
    ПостроительСхем = Новый ПостроительСхемXML;
    Схема = ПостроительСхем.СоздатьСхемуXML(ДокументДомНужный);
    НаборСхем = Новый НаборСхемXML;
    НаборСхем.Добавить(Схема);
    ТекФабрикаXDTO = Новый ФабрикаXDTO(НаборСхем);
    Возврат Истина;
КонецФункции
17 sda553
 
05.06.15
11:40
Ну и функция которая после того как фабрику получили и какие надо параметры сваяли, может вызывать сторонние ws функции


Функция ФормированиеЗапросаКСервису(ИмяФункции,СтруктураПараметров,ТипВозвращаемогоЗначенияXDTO)
    Док = Новый ДокументDOM("http://schemas.xmlsoap.org/soap/envelope/","soap:Envelope";);
    ЭлементТела = Док.СоздатьЭлемент("soap:Body");
    ЭлементТела = Док.ЭлементДокумента.ДобавитьДочерний(ЭлементТела);
    ЭлементФункция = Док.СоздатьЭлемент(WSПространствоИмен(),"m:"+ИмяФункции);
    ЭлементФункция = ЭлементТела.ДобавитьДочерний(ЭлементФункция);
    ЗаписьУзлов = Новый ЗаписьУзловDOM;
    ЗаписьУзлов.Открыть(Док);
    Сериалаз = Новый СериализаторXDTO(ТекФабрикаXDTO);
    Для каждого элСтрукт Из СтруктураПараметров Цикл
        Если ТипЗнч(элСтрукт.Значение) = Тип("ОбъектXDTO") Тогда
            ТекФабрикаXDTO.ЗаписатьXML(ЗаписьУзлов,элСтрукт.Значение,"m:"+элСтрукт.Ключ,WSПространствоИмен());
        Иначе
            Сериалаз.ЗаписатьXML(ЗаписьУзлов,элСтрукт.Значение,"m:"+элСтрукт.Ключ,WSПространствоИмен());
        КонецЕсли;        
    КонецЦикла;    
    ЭлементФункция.ДобавитьДочерний(ЗаписьУзлов.УзелDOM);
    ЗаписьУзлов.Закрыть();
    ЗаписьДом = Новый ЗаписьDOM;
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьДом.Записать(Док,ЗаписьXML);
    СтрокаXML = ЗаписьXML.Закрыть();        
    активком = Новый ComОбъект("Microsoft.XMLHTTP");
    активком.open("POST", WSPORT(), false);
    активком.send(СтрокаXML);
    Пока активком.ReadyState<>4 Цикл
        ОбработкаПрерыванияПользователя();
    КонецЦикла;
    Если активком.Status<>200 Тогда
        ТекстОшибки = "Не удалось установить соединение с внешним WS. Описание ошибки:"+активком.ResponseText;
        ВызватьИсключение ТекстОшибки;
    КонецЕсли;    
    ОтветСервиса = активком.ResponseText;        
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ОтветСервиса);
    НовыйПостроительДом = Новый ПостроительDOM;
    НовыйДокументДом = НовыйПостроительДом.Прочитать(ЧтениеXML);
    ЭлементНаш = НовыйДокументДом.ПолучитьЭлементыПоИмени("m:return").Элемент(0);
    ДокументДомНужный = Новый ДокументDOM(WSПространствоИмен(),"return");
    ЭлементНовый =   ДокументДомНужный.ЭлементДокумента;
    ЭлементДочерний = ЭлементНаш.ПервыйДочерний;
    Пока Истина Цикл
        ЭлементНовыйДочерний = ДокументДомНужный.ИмпортироватьУзел(ЭлементДочерний,Истина);
        ЭлементНовый.ДобавитьДочерний(ЭлементНовыйДочерний);
        Если ЭлементДочерний.СледующийСоседний = Неопределено Тогда
            прервать;            
        КонецЕсли;
        ЭлементДочерний = ЭлементДочерний.СледующийСоседний;
    КонецЦикла;        
    ЧтениеУзловDOM = Новый ЧтениеУзловDOM;
    ЧтениеУзловDOM.Открыть(ДокументДомНужный.ПолучитьЭлементыПоИмени("return").Элемент(0));
    ВозвратОбъект = ТекФабрикаXDTO.ПрочитатьXML(ЧтениеУзловDOM,ТипВозвращаемогоЗначенияXDTO);    
    Возврат ВозвратОбъект;
КонецФункции
18 TanjaWing
 
05.06.15
11:57
sda553, спасибо. Буду пробовать.
19 TanjaWing
 
05.06.15
15:23
через ComОбъект("Microsoft.XMLHTTP") послала свое сообщение на WDSL, авторизация в самом сообщении. К сожалению не взлетело:
User PLATINIUM not authorized to invoke Service Operation GETWSDL.
Через SoapUI это же сообщение отправляется. Через HTTP соединение тоже ошибка, параметры посмотрела в SoapUI. Ошибка "Server returned nothing (no headers, no data)". Какая-то засада. Чтобы установить Fiddler нужны права администратора на компьютер, оставила заявку, если ее согласуют, то когда -нибудь эту программу мне установят.
20 TanjaWing
 
05.06.15
15:36
Fiddler не согласовали и не согласуют. Придется без него.
21 oleg_km
 
06.06.15
21:18
(20) Если нет нормальной документации и контакта с поддержкой веб-сервиса, то на нет и суда нет: нет фиддлера - нет результата.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.