Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Помогите разобраться с WS-ссылками (http://forums.kuban.ru/f1040/pomogite_razobrat-sya_s_ws-ssylkami-6043758.html)

lex81 29.08.2014 14:41

Помогите разобраться с WS-ссылками
 
Доброго времени суток.
Есть некий сервис с API, данные с которого надо получать через SOAP. Есть рабочий код на php, нужен "аналог" для 1С.

Есть описание:

Метод "getTicketsByDate"

Входные параметры:
На вход метод принимает объект класса stdClass со следующими свойствами:

$object->login – Ваш логин в системе.
$object->password – Ваш пароль в системе.
$object->from – Начало периода в формате timestamp, по умолчанию с самого начала UNIX-time.
$object->to – Конец периода в формате timestamp, по умолчанию текущая дата.

Есть пример кода на php, который работает как надо:

<?php
$client = new Soapclient('89.20.149.116/pcsupport/tm/soap?wsdl');
$data = new stdClass();
$data->login = "login";
$data->password = "password";
$data->from = "1370894743";
$data->to = "1371729943";

$result = $client->getTicketsByDate($data);
?>

Поставил SoapUI чтобы протестировать, проверка прошла удачно, все возвращается как надо.

Пытаюсь сделать в 1С.
В конфигурацию добавил новую WS-ссылку - SOAP.

Написал такой код:

WSОпределения = WSСсылки.SOAP.ПолучитьWSОпределения();
Пакеты = WSОпределения.ФабрикаXDTO.Пакеты.Получить("http://89.20.149.116/pcsupport/tm/soap");

ТипОбъекта = Неопределено;

Для i = 0 По Пакеты.Количество() - 1 Цикл
Если СокрЛП(Пакеты.Получить(i).Имя) = "get_tickets_by_date_data" Тогда
ТипОбъекта = Пакеты.Получить(i);
КонецЕсли;
КонецЦикла;

Если ТипОбъекта <> Неопределено Тогда

Тип_dateTime = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime");
Тип_string = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string");

ВебСервис = WSСсылки.SOAP.СоздатьWSПрокси("http://89.20.149.116/pcsupport/tm/soap", "getTicketsByDatewsdl", "getTicketsByDatewsdlPort");

getTicketsByDateData = ВебСервис.ФабрикаXDTO.Создать(ТипОбъекта);

getTicketsByDateData.login = ФабрикаXDTO.Создать(Тип_string, "НашЛогин");
getTicketsByDateData.password = ФабрикаXDTO.Создать(Тип_string, "НашПароль");
getTicketsByDateData.from = ФабрикаXDTO.Создать(Тип_dateTime, НачалоГода(ТекущаяДата()));
getTicketsByDateData.to = ФабрикаXDTO.Создать(Тип_dateTime, ТекущаяДата());

Результат = ВебСервис.getTicketsByDate(getTicketsByDateData);

КонецЕсли;

Ошибка при вызове метода контекста (getTicketsByDate)
Результат = ВебСервис.getTicketsByDate(getTicketsByDateData);
по причине:
Ошибка вызова операции сервиса: {http://89.20.149.116/pcsupport/tm/soap**:getTicketsByDatewsdl:getTicketsByDate()
по причине:
Неверный формат

Не могу понять из-за чего.
Заранее благодарен за помощь.

Uho 29.08.2014 15:37

эээ... как минимум вот это лишнее:
ФабрикаXDTO.Создать(Тип_string, "НашЛогин");

здесь просто надо присваивать
getTicketsByDateData.login = "НашЛогин";

и т.д.

Uho 29.08.2014 15:40

и вообще куча лишнего:

ТипОбъекта = Неопределено;

Для i = 0 По Пакеты.Количество() - 1 Цикл
Если СокрЛП(Пакеты.Получить(i).Имя) = "get_tickets_by_date_data" Тогда
ТипОбъекта = Пакеты.Получить(i);
КонецЕсли;
КонецЦикла;

можно заменить на

Пакеты.Получить("get_tickets_by_date_data");

Uho 29.08.2014 15:45

вообщем все это заменить на:

[code]

Прокси = WSСсылки.ТвояСсылка.СоздатьWSПрокси(ТвоиПараметры);
ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить(ТвоиПараметры).Получить("get_tickets_by_date_data");

WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
WSПараметр.Login = Пользователь;
WSПараметр.Password = Пароль;
WSПараметр.from = НачалоГода(ТекущаяДата();
WSПараметр.to = ТекущаяДата();

Результат = Прокси.getTicketsByDate(WSПараметр);


[/code]

lex81 29.08.2014 15:59

Согласен, код далек от идеала. В первый раз работаю с ws-ссылками, поэтому не все до конца понимаю.

1-Uho >и так пробовал, ошибка все равно прежняя.

3-Uho >переделал код согласно примера, ничего не изменилось:


Прокси = WSСсылки.SOAP.СоздатьWSПрокси("http://89.20.149.116/pcsupport/tm/soap" , "getTicketsByDatewsdl", "getTicketsByDatewsdlPort");

ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить("http://89.20.149.116/pcsupport/tm/soap").Получить("get_tickets_by_date_data");

WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);

WSПараметр.Login = Пользователь;
WSПараметр.Password = Пароль;
WSПараметр.from = НачалоГода(ТекущаяДата());
WSПараметр.to = ТекущаяДата();

Результат = Прокси.getTicketsByDate(WSПараметр);

ошибка:

Ошибка при вызове метода контекста (getTicketsByDate)
Результат = Прокси.getTicketsByDate(WSПараметр);
по причине:
Ошибка вызова операции сервиса: {http://89.20.149.116/pcsupport/tm/soap**:getTicketsByDatewsdl:getTicketsByDate()
по причине:
Неверный формат.

Uho 29.08.2014 16:04

возможно ошибка в этих параметрах: "getTicketsByDatewsdl", "getTicketsByDatewsdlPort"

lex81 29.08.2014 16:10

Копировал из структуры (хотя возможно не то, повторюсь в первый раз с подобным сталкиваюсь)

[url]http://prntscr.com/4hmqkd[/url]

Uho 29.08.2014 16:50

6-lex81 > тогда вроде правильно


Текущее время: 13:41. Часовой пояс GMT +3.