Имя: Пароль:
1C
1С v8
Помогите разобраться с WS-ссылками
,
0 kan81
 
29.08.14
11:35
Доброго времени суток.
Заранее прошу не ругать, если что-то спрошу "глупое" или очевидное, в первый раз сталкиваюсь с 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);
?>

В 1С такой код (может и корявый, но пока какой есть):

URL = "http://89.20.149.116/pcsupport/tm/soap";;
Login = "......";
Password = "......";

Определения = Новый WSОпределения(Строка(URL) + "?wsdl", Login, Password);
СервисWS = Новый WSПрокси(Определения , URL , "getTicketsByDatewsdl" , "getTicketsByDatewsdlPort");

Пакет = Определения.ФабрикаXDTO.Пакеты.Получить(URL);

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

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

      НовыйОбъектXDTO = СервисWS.ФабрикаXDTO.Создать(ТипОбъекта,);
      НовыйОбъектXDTO.login = Login;
      НовыйОбъектXDTO.password = Password;
      НовыйОбъектXDTO.from = "1388520000";
      НовыйОбъектXDTO.to = "1409227799";

      Ответ = СервисWS.getNewTickets(НовыйОбъектXDTO);
      
КонецЕсли;

После выполнения получаю ошибку:

Ошибка проверки данных XDTO:Значение: '1388520000' не соответствует простому типу: { http://www.w3.org/2001/XMLSchema}dateTime

Изменяю код на следующий:

URL = "http://89.20.149.116/pcsupport/tm/soap";;
Login    = "......";
Password = "......";

Определения = Новый WSОпределения(Строка(URL) + "?wsdl", Login, Password);

СервисWS = Новый WSПрокси(Определения , URL , "getTicketsByDatewsdl" , "getTicketsByDatewsdlPort");
Пакет = Определения.ФабрикаXDTO.Пакеты.Получить(URL);

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

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

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

      XDTO_ТипДата = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "dateTime");
      НовыйОбъектXDTO = СервисWS.ФабрикаXDTO.Создать(ТипОбъекта,);
      НовыйОбъектXDTO.login = Login;
      НовыйОбъектXDTO.password = Password;
      НовыйОбъектXDTO.from = ФабрикаXDTO.Создать(XDTO_ТипДата, НачалоГода(ТекущаяДата()));
      НовыйОбъектXDTO.to = ФабрикаXDTO.Создать(XDTO_ТипДата, ТекущаяДата());

      Ответ = СервисWS.getNewTickets(НовыйОбъектXDTO);
      
КонецЕсли;

После выполнения получаю такую ошибку:

Метод объекта не обнаружен (getNewTickets)
Ответ = СервисWS.getNewTickets(НовыйОбъектXDTO);

Подскажите где и что делаю не так, или совсем иду не в том направлении
Заранее благодарен за ответ.
1 kan81
 
29.08.14
12:01
В конфигурацию добавил новую 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()
по причине:
Неверный формат.


Не могу понять из-за чего.
2 Apokalipsec
 
29.08.14
12:08
w3c формат DateTime неправильно его передаешь.
3 Apokalipsec
 
29.08.14
12:10
4 kan81
 
29.08.14
12:20
сделал согласно описания - http://prntscr.com/4hkqvn
или это не то?
5 Apokalipsec
 
29.08.14
12:23
(4) но передаешь-то ты туда дату криво. Посмотри как должна дата передаваться в (3).
6 kan81
 
29.08.14
12:48
getTicketsByDateData.from = ФабрикаXDTO.Создать(Тип_dateTime, "2014-01-01");
getTicketsByDateData.to = ФабрикаXDTO.Создать(Тип_dateTime, "2014-08-01");

все равно прежняя ошибка:

Ошибка при вызове метода контекста (getTicketsByDate)
        Результат = ВебСервис.getTicketsByDate(getTicketsByDateData);
по причине:
Ошибка вызова операции сервиса:  {http://89.20.149.116/pcsupport/tm/soap}:getTicketsByDatewsdl:getTicketsByDate()
по причине:
Неверный формат.
7 Apokalipsec
 
29.08.14
13:21
(5) В твоем первом сообщении: timestamp, по умолчанию с самого начала UNIX-time.  Попробуй передавать туда в таком формате строку: http://www.unixtimestamp.com/index.php
8 kan81
 
29.08.14
14:13
(7) Пробовал. Перепробовал все возможные варианты, ошибка все равно одна и та же выходит.
9 yukon
 
29.08.14
15:10
(6) А так пробовал:
getTicketsByDateData.from = Дата(2014,01,01);
getTicketsByDateData.to = Дата(2014,08,01);

Дата (Date)
Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен {http://www.w3.org/2001/XMLSchema}. Имя типа XDTO: может быть любым из перечисленных: dateTime, date, time.
10 kan81
 
29.08.14
15:33
(9) И так передавать пробовал, все равно одна и та же ошибка

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

Такое ощущение что 1С как-то не так передается параметр "getTicketsByDateData" или не в таком виде, хотя если смотреть через отладчик, типы совпадают.
11 yukon
 
29.08.14
15:39
(10) Попробуй передать переменные как параметры, а не как свойства объекта:

Результат = ВебСервис.getTicketsByDate("НашЛогин", "НашПароль", Дата(2014,01,01), Дата(2014,08,01));
12 kan81
 
29.08.14
15:45
так тоже пробовал, в этом случае ошибка "Слишком много фактических параметров".
13 hhhh
 
29.08.14
15:47
14 Эмбеддер
 
29.08.14
15:50
(13) зачем оно здесь?
15 Apokalipsec
 
29.08.14
15:51
Косяк не в дате, можешь и фром и ту выпилить, они необязательные, смотри, что ещё криво передаешь.)
16 Эмбеддер
 
29.08.14
15:55
(11) там 1 параметр по схеме
17 kan81
 
29.08.14
16:13
(15) Да вроде отладчиком все проверял ( http://prntscr.com/4hm7at ) или не совсем то смотрю?
18 Serginio1
 
29.08.14
16:18
(10) Посмотри фиддлером что сервис возвращает
19 hhhh
 
29.08.14
16:20
(14) урок 2, полностью посвящен этой теме.
20 kan81
 
29.08.14
17:12
(18) Пробовал делать подобный запрос в SoupUI

stdClass Object
(
   [code] => 200
   [message] => Новые заявки получены
   [tickets] => Array
       (
           [0] => stdClass Object
               (
                   [ticket_id] => RKO11817
                   [price] =>
                   [status] =>
                   [status_info] =>
                   [execution_date] =>
                   [name] => test
                   [phone] => 11111111111
                   [address] => 11111111111
                   [services] =>
                   [comment] => Настройка
                   [created_at] => 2014-08-28T11:36:29+04:00
               )

           [1] => stdClass Object
               (
                   [ticket_id] => RKO11818
                   [price] =>
                   [status] =>
                   [status_info] =>
                   [execution_date] =>
                   [name] => тест
                   [phone] => +7(111) 111-11-11
                   [address] => тестовая
                   [services] =>
                   [comment] => тест
                   [created_at] => 2014-08-28T11:38:19+04:00
               )

       )

)
21 Serginio1
 
29.08.14
17:42
Ну а судя по тому, что в 1С в get_tickets_response проблема с tickets  tickets_list

Попробуй Помогите разобраться с web-сервисом
22 Эмбеддер
 
29.08.14
18:07
(19) понятно. спасибо)))
23 Эмбеддер
 
29.08.14
19:47
у себя запустил то же самое. немного код переделал, чтобы запустилось во внешней обработке. судя по всему, 1С как обычно не может распарсить принимаемые данные штатными средствами

код был такой

    WSОпределения = Новый WSОпределения("http://89.20.149.116/pcsupport/tm/soap?wsdl";);
    Пакеты = WSОпределения.ФабрикаXDTO.Пакеты.Получить("http://89.20.149.116/pcsupport/tm/soap");//"; target=""_blank"" rel=""nofollow"" class=""extralink"">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Определения.Сервисы.Получить("http://89.20.149.116/pcsupport/tm/soap";, "getTicketsByDatewsdl");
          
          getTicketsByDateData = WSОпределения.ФабрикаXDTO.Создать(ТипОбъекта);

          getTicketsByDateData.login = ФабрикаXDTO.Создать(Тип_string, "НашЛогин");
          getTicketsByDateData.password = ФабрикаXDTO.Создать(Тип_string, "НашПароль");
          getTicketsByDateData.from = ФабрикаXDTO.Создать(Тип_dateTime, НачалоГода(ТекущаяДата()));
          getTicketsByDateData.to = ФабрикаXDTO.Создать(Тип_dateTime, ТекущаяДата());
          
          getTicketsByDateData.Проверить();
          
          ВСПрокси = Новый WSПрокси(WSОпределения, "http://89.20.149.116/pcsupport/tm/soap","getTicketsByDatewsdl","getTicketsByDatewsdlPort";);

          Результат = ВСПрокси.getTicketsByDate(getTicketsByDateData);
          
    КонецЕсли;
24 Эмбеддер
 
29.08.14
19:48
опс, а я думал что такое target="_blank" и т.д- оказывается, движок мисты добавляет
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn