Имя: Пароль:
1C
 
Подключение к стороннему веб-сервису из 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