Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) SOAP клиент на 7.7 (число прочтений - 24993 )
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
SOAP клиент на 7.7
04. Февраля 2009 :: 09:34
Печать  
Кто-нибудь озадачивалься подключением к веб-службам из семерки?
В общем нужен некий оле-объект который представляет из себя прокси для soap-клиента работающий в среде 7.7
Мои попытки пока свелись к использованию MSSoap.SoapClient30.
Две проблемы:
- клиент плохо понимает wsdl сформированный 1С 8.1, но это решается ручной правкой wsdl-схемы
- нет возможности получать массивы (ComSafeArray) возвращаемые SoapClient при вызове метода службы.

Если у кого есть опыт - буду рад выслушать.
  

1&&2&&3
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SOAP клиент на 7.7
Ответ #1 - 04. Февраля 2009 :: 13:12
Печать  
trad писал(а) 04. Февраля 2009 :: 09:34:
Кто-нибудь озадачивалься подключением к веб-службам из семерки?

Озадачивался.
И тоже уперся в ограниченность клиента.
Поскольку задача была простая и много времени на это тратить не хотелось, то выкрутился просто:
Код
Выбрать все
	Запрос=СоздатьОбъект("MSXML2.DOMDocument");
	ДатаНач=НачМесяца(ДатаДок);
	ДатаКон=КонМесяца(ДатаДок);
	Запрос.loadXML(Шаблон("<Envelope xmlns=""http://schemas.xmlsoap.org/soap/envelope/"">
	|<Header/>
	|<Body>
	|<ПолучитьЧивоНибудь xmlns=""http://myfirm/ws/at"">
	|<ДатаНачала>[ДатаГод(ДатаНач)]-[ДатаМесяц(ДатаНач)#Ч(0)2]-[ДатаЧисло(ДатаНач)#Ч(0)2]</ДатаНачала>
	|<ДатаКонца>[ДатаГод(ДатаКон)]-[ДатаМесяц(ДатаКон)#Ч(0)2]-[ДатаЧисло(ДатаКон)#Ч(0)2]</ДатаКонца>
	|</ПолучитьЧивоНибудь>
	|</Body>
	|</Envelope>"));
	Попытка
	    xmlHttp = СоздатьОбъект("MSXML2.xmlHttp");
	    xmlHttp.OPEN ("POST", "http://--SKIPPED--.1cws", 0);
	    xmlHttp.setRequestHeader ("Host", "--SKIPPED--");
	    xmlHttp.setRequestHeader ("Content-type", "text/xml");
	    xmlHttp.SEND (Запрос);
	    Ответ=xmlHttp.responseXML;
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	Строки=Ответ.SelectNodes("//m:Строки");
	Для Сч=0 По Строки.Length-1 Цикл
		Стр=Строки.Item(Сч);
		// ---SKIPPED---
	КонецЦикла;
 



т.е. запрос формирую сам и WSDL не читаю.
и ответ получаю не в виде объекта, а в виде MSXML.DOMDocument, который легко разбирать при помощи XPath или XQuery.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: SOAP клиент на 7.7
Ответ #2 - 04. Февраля 2009 :: 13:27
Печать  
Ясно.
Ты решил задачу опустившись в технологии  на уровень ниже.
  

1&&2&&3
Наверх
 
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: SOAP клиент на 7.7
Ответ #3 - 04. Февраля 2009 :: 14:17
Печать  
Пользовался MSSoap.SoapClient30, но только на уровне вызова методов, ответ разбирал анализируя XML.

DomXML.LoadXML(ответ.context.xml);

Для работы с объектами SAFEARRAY  можно попробовать использовать VBScript Array.
http://rsdn.ru/Forum/Message.aspx?mid=2257044
http://www.forum.mista.ru/topic.php?id=323264
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: SOAP клиент на 7.7
Ответ #4 - 04. Февраля 2009 :: 14:54
Печать  
Igor-bts писал(а) 04. Февраля 2009 :: 14:17:
Для работы с объектами SAFEARRAY  можно попробовать использовать VBScript Array.

В сторону ScriptControl я уже рыл. Там тоже засада.
Дело в том, что JScript и VBScript могут работать с массивами типа  VT_ARRAY|VT_VARIANT (подтверждение в твоей ссылке на rsdn).
А SoapClient30 мне возращает VT_ARRAY|VT_DISPATCH
Печаль
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: SOAP клиент на 7.7
Ответ #5 - 05. Февраля 2009 :: 06:06
Печать  
Igor-bts писал(а) 04. Февраля 2009 :: 14:17:
Пользовался MSSoap.SoapClient30, но только на уровне вызова методов, ответ разбирал анализируя XML.

DomXML.LoadXML(ответ.context.xml);
вот как раз "ответ" то я и не могу получить в переменную модуля
  

1&&2&&3
Наверх
 
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: SOAP клиент на 7.7
Ответ #6 - 05. Февраля 2009 :: 07:31
Печать  
Могу свой пример привести, писалось под 8.0, сервис предоставлял MSSQL Server.
  

soupclient.rar ( 6 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: SOAP клиент на 7.7
Ответ #7 - 06. Февраля 2009 :: 06:40
Печать  
Ну что удалось решить задачу с SOAP?
если да то каким способом?

В VB похоже возможно получать массивы из comsafearray
http://www.podgoretsky.com/ftp/Docs/VBScript/VBScript%20Language%20Reference/vbs...

http://www.forum.mista.ru/topic.php?id=319873&&bit=1
« Последняя редакция: 06. Февраля 2009 :: 07:58 - Igor-bts »  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: SOAP клиент на 7.7
Ответ #8 - 06. Февраля 2009 :: 07:09
Печать  
Нет, пока по-нормальному не удалось.
С 8.x понятно что работает. Там есть контейнер для приема/передачи COMSafeArray.

Пока в исследовательско-эксперементальных целях написал в ВК метод InvokeOLEMethod в котором VarResult после IDispatch::Invoke укладывается в CValue.
Причем если возвращен не VT_ARRAY, то преобразование выполняется штатным методом платформы CBLExportContext:Очень довольныйispParamToValue.
А если VT_ARRAY, то создается ТЗ с одной колонкой и в нее перекладывается содержимое массива.

Конечно лучше написать свой BLContext-ный контейнер и только связывать его с safearray ничего не перекладывая.
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: SOAP клиент на 7.7
Ответ #9 - 10. Февраля 2009 :: 16:20
Печать  
  

1&&2&&3
Наверх
 
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 123
Зарегистрирован: 26. Ноября 2008
Re: SOAP клиент на 7.7
Ответ #10 - 16. Января 2013 :: 12:39
Печать  
ВебСервис = СоздатьОбъект("MSSOAP.SoapClient");
ВебСервис.MSSOAPInit("http://region.4sides.ru:6612/PiligrimServises.svc?wsdl");

Пишет "Получаемая строка превысит допустимые размеры"
Что я делаю не так?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: SOAP клиент на 7.7
Ответ #11 - 16. Января 2013 :: 13:07
Печать  
возникает исключение с очень длинным описанием, которое не влазит в окно сообщений.
попробуй так:
Код
Выбрать все
	ВебСервис = СоздатьОбъект("MSSOAP.SoapClient");
	Попытка
		ВебСервис.MSSOAPInit("http://region.4sides.ru:6612/PiligrimServises.svc?wsdl");
	Исключение
		Стр = ОписаниеОшибки();
		Пока Стр > "" Цикл
			Сообщить(Лев(Стр,200));
			Стр = Сред(Стр,201);
		КонецЦикла;
		Возврат;
	КонецПопытки; 


и почему SoapClient, а не SoapClient30 ?
  

1&&2&&3
Наверх
 
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 123
Зарегистрирован: 26. Ноября 2008
Re: SOAP клиент на 7.7
Ответ #12 - 16. Января 2013 :: 14:01
Печать  
trad писал(а) 16. Января 2013 :: 13:07:
возникает исключение с очень длинным описанием, которое не влазит в окно сообщений.
попробуй так:
Код
Выбрать все
	ВебСервис = СоздатьОбъект("MSSOAP.SoapClient");
	Попытка
		ВебСервис.MSSOAPInit("http://region.4sides.ru:6612/PiligrimServises.svc?wsdl");
	Исключение
		Стр = ОписаниеОшибки();
		Пока Стр > "" Цикл
			Сообщить(Лев(Стр,200));
			Стр = Сред(Стр,201);
		КонецЦикла;
		Возврат;
	КонецПопытки; 


и почему SoapClient, а не SoapClient30 ?


А 30 валит с какой-то другой ошибкой Неудачная попытка создания объекта (MSSOAP.SoapClient30)
А что, есть разница?

Т.е., это строка ошибки длинная?
Но подключение не происходит?
Кстати, код реальный, его можно пробовать на любой машине, в любой базе

Дает вот такую ошибку
Client: WSDLReader:Analyzing the WSDL file failed HRESULT=0x80004005 - WSDLReader:Initialization of service failed HRESULT=0x80004005 - WSDLService:Initialization of the port for service PiligrimServi
ses failed HRESULT=0x80004005 - WSDLPort:Analyzing the binding information for port BasicHttpBinding_IPiligrimServises failed HRESULT=0x80004005 - WSDLPort:An operation for port BasicHttpBinding_IPili
grimServises could not be initialized HRESULT=0x80004005 - WSDLOperation:Initializing of the input message failed for operation UpdateBags HRESULT=0x80004005 - WSDLOperation:The parameters for element
parameters in operation UpdateBags could not be created. The parameters could not be expanded HRESULT=0x80004005 - WSDLOperation:The schema definition with a targetnamespace of http://tempuri.org/ fo
r SoapMapper UpdateBags could not be found HRESULT=0x80004005


Или, все-таки версия нужна 30?
Потому что на

ВебСервис = СоздатьОбъект("MSSOAP.SoapClient");
ВебСервис.MSSOAPInit("http://region.4sides.ru:6612/PiligrimServises.svc"); ;


пишет
Client: WSDLReader:Analyzing the WSDL file failed HRESULT=0x80070057 - WSDLReader:No valid schema specification was found. This version of the SOAP Toolkit only supports 1999 and 2000 XSD schema speci
fications HRESULT=0x80070057

  
Наверх
 
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 123
Зарегистрирован: 26. Ноября 2008
Re: SOAP клиент на 7.7
Ответ #13 - 16. Января 2013 :: 14:28
Печать  
Да. 30 надо.
Только он не так пишется (регедит тоже рулит)

Вот так отрабатывает без ошибок.
ВебСервис = СоздатьОбъект("MSOSOAP.SoapClient30");     //   MSSOAP.SoapClient
ВебСервис.MSSOAPInit("http://region.4sides.ru:6612/PiligrimServises.svc?wsdl");  

Как теперь у него метод использовать?
В описании написано:
Метод DepartureInfo(string BarCod) – справка по отправлению
Входной параметр номер оправления.
Возвращает набор данных класса PiligrimDataBase.InfoDepartureDB,
Состоящий из следующих таблиц.

TV_INFO_DEPARTURE – информация по самому отправлению
TV_INFO_BAG – информация по движению отправления
TV_INFO_DELIVERY – информация по доставке

И почему телепат алс не смог создать?

Вру. Создал для 30. Буду много читать


  
Наверх
 
IP записан
 
Кошки рулят
Full Member
***
Отсутствует



Сообщений: 123
Зарегистрирован: 26. Ноября 2008
Re: SOAP клиент на 7.7
Ответ #14 - 20. Февраля 2014 :: 14:26
Печать  
Надо бы вернуться и добить проблему
Данные получаю от веб-сервиса, но в каком формате и как их прочитать не знаю даже как понять
Код
Выбрать все
ВебСервис = СоздатьОбъект("MSOSOAP.SoapClient30");
Рез= ВебСервис.MSSOAPInit("http://region.4sides.ru:6612/PiligrimServises.svc?wsdl");
Данные = ВебСервис.DepartureInfo("FS014606254RU");    //   можно вот такой номер дать:  FS015729008RU
 


Собственно, отладчик говорит, что Данные = OLE.IXMLDOMSelection, но это как-то не очень помогает.
От чтения msdn.microsoft.com уже в мозгах  разряд сдвинулся, но понять как работать с этим объектом не могу.
Киньте хелпов, а то я уже на грани впасть в отчаяние ...

Код
Выбрать все
nodeBook = Данные.peekNode();
Стр=nodeBook.ownerDocument.text;
 


Какой-то текст получаю и слова мне нужные из него вижу, но ведь это не правильный путь получения результата. Это путь отчаяния. Не дайте впасть ...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать