|
Подключение к стороннему веб-сервису из 1С | ☑ | ||
---|---|---|---|---|
0
Dididi
28.01.15
✎
12:20
|
Здравствуйте, помогите подключиться и записать данные в справочник 1С. Есть адреса http://www.enstru.skc.kz/wsdl_server/enstru.wsdl и enstru.skc.kz/wsdl_server/php-wsdl.php. Раньше с веб-сервисами не работала. Нашла в инете, что надо создать объект WSссылка. Создала. Далее создала обработку. Добавила реквизиты форм для заполнения входных данных. http://www.gliffy.com/go/publish/4021875 - ссылка на схему веб-сервиса. И написала следующее:
&НаСервере Процедура Подключение() Прокси = WSСсылки.WSСсылка2.СоздатьWSПрокси("urn:enstru","enstruService","enstruServicePort"); ДатаСЮникс = Формат(ДатаС - дата(1970,1,1,1,0,0), "ЧГ=0"); ДатаПоЮникс = Формат(ДатаПо - дата(1970,1,1,1,0,0), "ЧГ=0"); Данные = Прокси.getByTime(ДатаСЮникс,ДатаПоЮникс,Метод,КоличествоПозиции1); Для каждого стр из Данные Цикл МассивСтр = Прокси.getByID(стр); КонецЦикла; КонецПроцедуры Выдает следующую ошибку: {Форма.Форма.Форма(17)}: Ошибка при вызове метода контекста (getByTime) Данные = Прокси.getByTime(ДатаСЮникс,ДатаПоЮникс,Метод,КоличествоПозиции1); по причине: Ошибка вызова операции сервиса: {urn:enstru}:enstruService:getByTime() по причине: Неизвестная ошибка. Ошибка при вызове метода объекта модели XDTO. Неверный параметр. по причине: Ошибка при вызове метода объекта модели XDTO. Неверный параметр. Как заполнить параметры функции правильно? |
|||
1
DirecTwiX
28.01.15
✎
12:26
|
Судя по всему, 1Ска ругается на третий параметр. Нужно посмотреть его тип, создать с помощью фабрикиXDTO, заполнить и передать в метод.
ФабрикаXDTO = ВебСервис.ФабрикаXDTO; Метод = ФабрикаXDTO.Создать(Фабрика.Тип("URI", "ИмяТипа")); Данные = Прокси.getByTime(ДатаСЮникс,ДатаПоЮникс,Метод,КоличествоПозиции1); |
|||
2
Dididi
28.01.15
✎
12:33
|
(1) Метод - это string, ("C" or "M").
Тогда мой код должен быть таким?: ФабрикаXDTO = Прокси.ФабрикаXDTO; Метод = ФабрикаXDTO.Создать(Фабрика.Тип("URI", "string")); |
|||
3
DirecTwiX
28.01.15
✎
12:39
|
(2) В 1Ске посмотри схему ссылки
"URI" - это пространство имён, в котором находится тип (что-то похожее на "enstruService" в твоём случае, скорее всего) - в схеме всё наглядно видно. |
|||
4
DirecTwiX
28.01.15
✎
12:41
|
Посмотрел схему.. ДатаСЮникс и ДатаПоЮникс - это числа, а не строки.
|
|||
5
Jaap Vduul
28.01.15
✎
12:43
|
Если судить по wsdl описанию, то первые три параметра - строковые, последний - целочисленный.
|
|||
6
Dididi
28.01.15
✎
12:53
|
(4) А как задать дату в int UnixTimeStamp?
|
|||
7
DirecTwiX
28.01.15
✎
12:56
|
(6) unixtime = Формат(ТекущаяДата() - дата(1970,1,1,1,0,0), "ЧГ=0");
Дата1С = дата(1970,1,1,1,0,0) + unixtime; Но судя по описанию схемы, а не по рисунку, там и правда первые три параметра - строковые |
|||
8
Dididi
28.01.15
✎
14:40
|
(7) ДатаСЮникс = Формат(ДатаС - дата(1970,1,1,1,0,0), "ЧГ=0");
тут ДатаСЮникс - строка. А в wsСсылке from - string (http://www.w3.org/2001/XMLSchema) Вопрос: из Строки в string надо преобразовывать? если да, то как? Я попробовала вот так: ТипМетода = Прокси.ФабрикаXDTO.Тип("urn:enstru", "string (http://www.w3.org/2001/XMLSchema)"); МетодПолучения = Прокси.ФабрикаXDTO.Создать(ТипМетода,Метод); ДатаСЮникс1 = Прокси.ФабрикаXDTO.Создать(ТипМетода,ДатаСЮникс); ДатаПоЮникс1 = Прокси.ФабрикаXDTO.Создать(ТипМетода,ДатаПоЮникс); Но ошибка выходит: Форма.Форма.Форма(21)}: Ошибка при вызове метода контекста (Создать) МетодПолучения = Прокси.ФабрикаXDTO.Создать(ТипМетода,Метод); по причине: Несоответствие типов (параметр номер '1') |
|||
9
sapphire
28.01.15
✎
14:47
|
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enstru">
<soapenv:Header/> <soapenv:Body> <urn:getByTime soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <from xsi:type="xsd:string">?</from> <to xsi:type="xsd:string">?</to> <method xsi:type="xsd:string">?</method> <limit xsi:type="xsd:integer">?</limit> </urn:getByTime> </soapenv:Body> </soapenv:Envelope> |
|||
10
sapphire
28.01.15
✎
15:07
|
(4) Это где же?
|
|||
11
Dididi
28.01.15
✎
15:21
|
(10) А как туда параметры правильно передать?
|
|||
12
Jaap Vduul
28.01.15
✎
15:27
|
Скорее всего, проблема не во входных параметрах (ибо там только примитивные типы), а в возвращаемом значении, которое объявлено как anyType и в результате 1цэ не может корректно распарсить getByTimeResponse.
|
|||
13
sapphire
28.01.15
✎
15:32
|
(11) Ща шлянем, вот правильный wsdl:
http://enstru.skc.kz/wsdl_server/class.enstru_service.php?wsdl |
|||
14
sapphire
28.01.15
✎
15:54
|
(12) ну да, так и есть.
Как вариант, по http отправлять мессагу из (9) и парсить ответ |
|||
15
KirWas
28.01.15
✎
17:11
|
Должно быть что-то похожее на следующее:
//Создаем ТИП ТипДата = Прокси.ФабрикаXDTO.Пакеты.Получить("http://www.w3.org/2001/XMLSchema"); //Создаем параметр на основе типа ДатаСЮникс = рСервисИНН.ФабрикаXDTO.Создать(ТипДата); //и заполняем значение параметра ДатаСЮникс= Формат(ДатаС, "ДЛФ=Д"); И только после этого ... И только если &НаСервере есть доступ к http: ... И если на нем правильно настройки проксисервера прописаны (это в настройках браузера или в 1С../Conf/inetcfg.xml)... |
|||
16
SUA
28.01.15
✎
17:42
|
(15) там тупо строки и число в исходящих параметрах
|
|||
17
Dididi
29.01.15
✎
08:31
|
а зачем нужен этот адрес?
enstru.skc.kz/wsdl_server/php-wsdl.php |
|||
18
Dididi
29.01.15
✎
14:15
|
Еще раз попробовала вот так:
Прокси = WSСсылки.WSСсылка2.СоздатьWSПрокси("urn:enstru","enstruService","enstruServicePort"); ПроксиФабрикаXDTO = Прокси.ФабрикаXDTO; ДатаСЮникс = Формат(ДатаС - дата(1970,1,1,1,0,0), "ЧГ=0"); ДатаПоЮникс = Формат(ДатаПо - дата(1970,1,1,1,0,0), "ЧГ=0"); целыйТип = ПроксиФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "int"); ТипСтрока = ПроксиФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"); Лимит = ПроксиФабрикаXDTO.Создать(целыйТип, КоличествоПозиции).Значение; ДатаСЮниксСтр = ПроксиФабрикаXDTO.Создать(ТипСтрока, ДатаСЮникс).Значение; ДатаПоЮниксСтр = ПроксиФабрикаXDTO.Создать(ТипСтрока, ДатаПоЮникс).Значение; МетодСтр = ПроксиФабрикаXDTO.Создать(ТипСтрока, Метод).Значение; Данные = Прокси.getByTime(ДатаСЮниксСтр,ДатаПоЮниксСтр,МетодСтр,Лимит); Ошибка: {Форма.Форма.Форма(27)}: Ошибка при вызове метода контекста (getByTime) Данные = Прокси.getByTime(ДатаСЮниксСтр,ДатаПоЮниксСтр,МетодСтр,Лимит); по причине: Ошибка вызова операции сервиса: {urn:enstru}:enstruService:getByTime() по причине: Неизвестная ошибка. Ошибка при вызове метода объекта модели XDTO. Неверный параметр. по причине: Ошибка при вызове метода объекта модели XDTO. Неверный параметр. |
|||
19
KirWas
03.02.15
✎
17:46
|
Если ещё актуально
Танцевал с бубном вокруг аналогичного. ...Яндекс выдал "не каждый .wsdl работает с 1С" У себя проблему решил переписыванием .wsdl В Вашем случае если брать: <?xml version='1.0' encoding='UTF-8'?> <!-- WSDL file generated by Zend Studio. --> <definitions name="enstru" targetNamespace="urn:enstru" xmlns:typens="urn:enstru" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <schema targetNamespace="urn:enstru" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="getByID"> <complexType> <all> <element name="id" type="integer"/> </all> </complexType> </element> </schema> </types> <message name="getByID"> <part name="id" type="xsd:integer"/> </message> <message name="getByIDResponse"> <part name="getByIDReturn" type="xsd:anyType"/> </message> <portType name="enstruServicePortType"> <operation name="getByID"> <documentation> Return by id </documentation> <input message="typens:getByID"/> <output message="typens:getByIDResponse"/> </operation> </portType> <binding name="enstruServiceBinding" type="typens:enstruServicePortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getByID"> <soap:operation soapAction="urn:enstruServiceAction"/> <input> <soap:body namespace="urn:enstru" /> </input> <output> <soap:body namespace="urn:enstru" /> </output> </operation> </binding> <service name="enstruService"> <port name="enstruServicePort" binding="typens:enstruServiceBinding"> <soap:address location="http://enstru.skc.kz/wsdl_server/class.enstru_service.php"/> </port> </service> </definitions> И запустить: Прокси = WSСсылки.WSСсылка1.СоздатьWSПрокси("urn:enstru","enstruService","enstruServicePort"); ТипО = Прокси.ФабрикаXDTO.Пакеты.Получить("urn:enstru"); ТипID = ТипО.Получить("getByID"); ID = Прокси.ФабрикаXDTO.Создать(ТипID); ID.id = 111; Данные = Прокси.getByID(ID); То получаем уже: Ошибка вызова операции сервиса: {urn:enstru}:enstruService:getByID() по причине: Ошибка SOAP сервера: SOAP-ERROR: Encoding: Violation of encoding rules Подозреваю, что из-за этого: use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding |
|||
21
Serginio1
03.02.15
✎
18:38
|
||||
22
sapphire
03.02.15
✎
18:41
|
(21) Зачем такие сложности?
|
|||
23
Serginio1
03.02.15
✎
18:55
|
(22) Разве это сложности? Все элементарно. Но вот интересно, есть возможность в Net неопубликованные типы. Для этих целей конечно есть ExpandoObject
|
|||
24
SUA
03.02.15
✎
18:56
|
самое простое
берем эту хрень загоняем в HTTP запрос типовым образом парсим XML времязатраты час |
|||
25
sapphire
03.02.15
✎
18:59
|
(24) Я о том же
|
|||
26
Serginio1
04.02.15
✎
10:26
|
(25) Ну по сравнению с 21 трудозатраты во много раз выше. Там 5 минут выше крыши.
Но есть еще вариант это изменить WSDL дать описание возвращаемых типов и прописать их в описании методов. И использовать уже этот файл. Можно статически, а можно и динамически ОпределениеТ=Новый WSОпределения(Файл_wsdl); WSСервис=ОпределениеТ.Сервисы[0]; прокси=Новый WSПрокси(ОпределениеТ, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя); |
|||
27
SUA
04.02.15
✎
10:50
|
(26) поставить .Net и следить за соответствием версий
пилить конфиги, знать объекты .net что еще в 21 надо для 5 минут? |
|||
28
Serginio1
04.02.15
✎
11:01
|
(27) Следить за версиями не надо. А вот знать классы Net нужно. Но это не сложно. Можно и без конфигов обходиться, все прописывая в коде. Но с конфигами гибче.
Кроме того существует масса ws протоколов где простого HTTP запроса будет просто недостаточно https://msdn.microsoft.com/ru-ru/library/ms734776(v=vs.110).aspx |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |