SOAP запрос 1С 7.7

1. sofron 11.10.17 07:38 Сейчас в теме
Здравствуйте.
Есть сервис с API, необходимо получать данные через SOAP. Есть рабочий код на php, нужен аналог для 1С 7.7.

Есть WSDL https://api.treolan.ru/webservices/treolan-1c.wsdl

Есть описание метода,
Метод :GenCatalogV2

string GenCatalogV2(string login, string password, string category, string vendorid, string keywords, int criterion, bool inArticul, bool inName, bool inMark, int showNc);

login - логин пользователя системы B2B.
password - пароль пользователя системы B2B.
category - фильтр по разделу каталога. Указывается идентификатор раздела, “” - весь склад. Идентификатор раздела можно получить из полного склада в формате xml.
vendorid - идентификатор производителя. Для поиска по всем вендорам укажите "0".
keywords - ключевые слова для поиска. Если несколько, то используется "или". Если пустая строка - нет фильтра по наименованию или артикулу.
criterion - критерий поиска. 0 - начинается с, 1 – содержит, 2 - заканчивается на.
inArticul – поиск по артикулу. 0 - не искать в артикуле, 1 - искать в артикуле.
inName – поиск по наименованию. 0 - не искать в наименовании, 1 - искать в наименовании.
inMark – фильтр по участию в маркетинговых программах. 0 - нет фильтра по участию в маркетинговых программах, 1 участвует в маркетинговых программах. ShowNc – фильтр по некондиции. 0 –показывать некондицию, 1 – не показывать некондицию, 2 – показывать только некондицию.



Есть пример вызова на языке PHP
<?php
$soapClientParams = array('connection_timeout' => 300);
$soapClient = new
SoapClient("https://api.treolan.ru/webservices/treolan.wsdl",
$soapClientParams);

try {
$param = array(
'Login' => 'your_login',
'password' => 'your_password',
'category' => '',
'vendorid' => 0,
'keywords' => 'pro',
'criterion' => 1,
'inArticul' => 1,
'inName' => 0,
'inMark' => 0,
'ShowNc' => 1);
$info = $soapClient->__call("GenCatalogV2", $param);
$arResult = ($info['Result']);
var_dump($arResult);
}
catch (SoapFault $fault) {
print("Sorry, WS returned the following ERROR:
".$fault->faultcode."-".$fault->faultstring);
}
?>


Установил SoapUI, такой запрос возвращает корректный ответ.

<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:mes="http://tempuri.org/treolan/message/">
<soapenv:Header/>
<soapenv:Body>
<mes:GenCatalogV2 soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<login xsi:type="xsd:string">XXXXXXXXXX</login>
<password xsi:type="xsd:string">XXXXXXX</password>
<category xsi:type="xsd:string"></category>
<vendorid xsi:type="xsd:string">0</vendorid>
<keywords xsi:type="xsd:string"></keywords>
<criterion xsi:type="xsd:int">1</criterion>
<inArticul xsi:type="xsd:boolean">true</inArticul>
<inName xsi:type="xsd:boolean">false</inName>
<inMark xsi:type="xsd:boolean">false</inMark>
<showNc xsi:type="xsd:int">0</showNc>
</mes:GenCatalogV2>
</soapenv:Body>
</soapenv:Envelope>

Пробую перенести в 1с:

СервисСОАП = CreateObject("MSSOAP.SoapClient30");
СервисСОАП.MSSoapInit("https://XXXXXXXXX:XXXXXX@api.treolan.ru/webservices/treolan-1c.wsdl");
СервисСОАП.ConnectorProperty("WinHTTPAuthScheme",1);
НашОтвет = СервисСОАП.GenCatalogV2();
Сообщить(НашОтвет);

Получаю ошибку:
Client: Client:Incorrect number of parameters supplied for SOAP request HRESULT=0x80070057: Параметр задан неверно.
- Client:Unspecified client error. HRESULT=0x80070057: Параметр задан неверно.


Пробовал реализовать через GET запрос:

Адрес = "https://api.treolan.ru/webservices/treolan-1c.wsdl";
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "utf-8");
WinHttp.Open("GET", Адрес, 0);
WinHttp.Send();
ТекстXML = WinHttp.ResponseText();
Сообщить(ТекстXML);

В ответ получаю всю структуру WSDL...

Что делать с этим, как правильно передать метод и параметры запроса не могу разобраться.
Заранее благодарен за помощь.
По теме из базы знаний
Найденные решения
9. sofron 11.10.17 11:38 Сейчас в теме
(8)
WinHttp.SetRequestHeader("Accept-Encoding", "gzip,deflate");
WinHttp.SetRequestHeader("Content-Type", "text/xml;charset=UTF-8");
WinHttp.SetRequestHeader("SOAPAction", "http://tempuri.org/treolan/action/WebService.GenCatalogV2");
WinHttp.SetRequestHeader("Content-Length", "1003");
WinHttp.SetRequestHeader("Host", "api.treolan.ru");
WinHttp.SetRequestHeader("Connection", "Keep-Alive");
WinHttp.SetRequestHeader("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)");

Не понимаю, к чему относится первая строка :
POST https://api.treolan.ru/webservices/treolan.ASP HTTP/1.1
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. ditp 91 11.10.17 09:13 Сейчас в теме
WinHttp.Open("POST", Адрес, 0); 
WinHttp.Send(ТекстЗапросаПоАналогии_c_SoapUI); 
3. sofron 11.10.17 10:39 Сейчас в теме
(2)
WinHttp.Open("POST", Адрес, 0);

Если использовать POST Возвращается ошибка 405: Метод не поддерживается


ТекстЗапроса = "<?xml version=""1.0"" encoding=""UTF-8"">
|<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:mes=""http://tempuri.org/treolan/message/"">
| <soapenv:Header/>
| <soapenv:Body>
| <mes:GenCatalogV2 soapenv:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">
| <login xsi:type=""xsd:string"">xxxxxxxxxxxx</login>
| <password xsi:type=""xsd:string"">xxxxxxxx</password>
| <category xsi:type=""xsd:string""></category>
| <vendorid xsi:type=""xsd:string"">0</vendorid>
| <keywords xsi:type=""xsd:string""></keywords>
| <criterion xsi:type=""xsd:int"">1</criterion>
| <inArticul xsi:type=""xsd:boolean"">true</inArticul>
| <inName xsi:type=""xsd:boolean"">false</inName>
| <inMark xsi:type=""xsd:boolean"">false</inMark>
| <showNc xsi:type=""xsd:int"">0</showNc>
| </mes:GenCatalogV2>
| </soapenv:Body>
|</soapenv:Envelope>";

WinHttp.Open("POST", Адрес, 0);
WinHttp.Send(ТекстЗапроса);
4. ditp 91 11.10.17 10:47 Сейчас в теме
В SoapUI выполните запрос, на вкладке raw посмотрите, что как и куда шлет.
Возможно, нужно будет что-то поменять в адресе/тексте запроса/заголовках.
5. sofron 11.10.17 11:02 Сейчас в теме
(4) HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/xml; charset="UTF-8"
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/8.5
Set-Cookie: ASPSESSIONIDQGDAARQR=OHHJCEDCLGCONDLMFJKJBKEC; secure; path=/
X-Powered-By: ASP.NET
Date: Tue, 10 Oct 2017 06:55:58 GMT
Content-Length: 1727

Скрытый текст
6. ditp 91 11.10.17 11:16 Сейчас в теме
Это ответ, я предлагал тоже самое для запроса посмотреть.
7. sofron 11.10.17 11:22 Сейчас в теме
(6)
POST https://api.treolan.ru/webservices/treolan.ASP HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://tempuri.org/treolan/action/WebService.GenCatalogV2"
Content-Length: 1003
Host: api.treolan.ru
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
8. ditp 91 11.10.17 11:30 Сейчас в теме
Ну дык попробуйте заголовки в WinHttp добавить.
9. sofron 11.10.17 11:38 Сейчас в теме
(8)
WinHttp.SetRequestHeader("Accept-Encoding", "gzip,deflate");
WinHttp.SetRequestHeader("Content-Type", "text/xml;charset=UTF-8");
WinHttp.SetRequestHeader("SOAPAction", "http://tempuri.org/treolan/action/WebService.GenCatalogV2");
WinHttp.SetRequestHeader("Content-Length", "1003");
WinHttp.SetRequestHeader("Host", "api.treolan.ru");
WinHttp.SetRequestHeader("Connection", "Keep-Alive");
WinHttp.SetRequestHeader("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)");

Не понимаю, к чему относится первая строка :
POST https://api.treolan.ru/webservices/treolan.ASP HTTP/1.1
10. brus 05.06.18 17:59 Сейчас в теме
Доброго всем.
Решили проблему с получением ответа? Или все-таки получаете всю структуру WSDL?
У меня та же проблема - получаю все структуру.
Что делаю: формирую запрос в SoapUI, сохраняю его в request.xml, устанавливаю заголовки (RAW), делаю POST запрос, в ответ - все структура.
В SoapUI - все норм, вижу тот ответ, который мне нужен.

xmlParser = СоздатьОбъект("Msxml2.DOMDocument");
xmlParser.load("d:\request.xml");

URL="https://client.grandline.ru/soap/wsdl.php";

MSXML2 = СоздатьОбъект("MSXML2.XMLHTTP");
MSXML2.open("POST", URL, 0, "_________", "_______________");

MSXML2.setRequestHeader("Accept-Encoding", "gzip,deflate");
MSXML2.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
MSXML2.setRequestHeader("SOAPAction", "https://client.grandline.ru#Api:getAgreements");
MSXML2.setRequestHeader("Host", "client.grandline.ru");
MSXML2.setRequestHeader("Connection", "Keep-Alive");
MSXML2.setRequestHeader("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)");
MSXML2.send(xmlParser.xml);

Если MSXML2.Status <> 200 Тогда
Сообщить("Ответ сервера не ""Ок""!");
Возврат;
КонецЕсли;

xmlParser.loadXML(MSXML2.responseXML.xml);
xmlParser.Save("d:\gr.xml");

Файл request.xml
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cli="https://client.grandline.ru">
<soapenv:Header/>
<soapenv:Body>
<cli:getAgreements>
<cli:api_key>___________________________</cli:api_key>
</cli:getAgreements>
</soapenv:Body>
</soapenv:Envelope>
11. EvgeniuXP 07.10.18 20:40 Сейчас в теме
Вот, рабочий вариант. AArticle2 - это параметр, который передаем в функцию, на втором скрине функция без параметров. Имя параметра в xml можно указывать любое, специально двойку к имени добавил, чтоб проверить. Возвращает xml, который содержит результат функции "Привет 1с".
Прикрепленные файлы:
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)