Имя: Пароль:
1C
1С v8
Помощь с Web сервисом
0 Bloood
 
11.12.13
14:52
Всем доброго времени суток.
Помогите, пожалуйста, найти ошибку в wsdl файле.
Есть веб сервис https://api-iz.merlion.ru/v2/mlservice.php?wsdl=dl
При создании ws ссылки. 1С ка падает с ошибкой "Неверный формат"
Через soapui все работает нормально. Все методы определяются.
Заранее спасибо.
1 kiruha
 
11.12.13
14:59
2 Bloood
 
11.12.13
15:07
Если написать
https://api-iz.merlion.ru/v2/mlservice.php?wsdl
То будет формат wsdl -  rpc/encoded. И в нем вообще
не описаны входные и выходные схемы методов.
https://api-iz.merlion.ru/v2/mlservice.php?wsdl=dl  используется формат document/literal. Все веб серверы созданные на 1С используют именно этот формат.
Возникает вопрос. Что именно не нравиться 1Ске в первой wsdlке?
3 kiruha
 
11.12.13
15:09
Вообще у 1С много ограничений по работе с внешними веб сервисами - например авторизация только Basic и т.п.

Я в таких случаях использую
HTTP = Новый COMОбъект("MSXML2.XMLHTTP")
4 Bloood
 
11.12.13
15:15
Используя COM обьект и MSSOAPtolkit удалось получить данные с веб сервиса. Хочется использовать стандартные средства 1С.
Может быть есть у кого нибудь документация по созданию WSDL именно для 1С?
5 Serginio1
 
11.12.13
15:29
v8: HTTPS соединение (сертификаты) - порядок конвертации

Можешь сохранить файл WSDL и попробовать подключиться через

ОпределениеТ=Новый WSОпределения(Файл_wsdl);
    WSСервис=ОпределениеТ.Сервисы[0];
    прокси=Новый WSПрокси(ОпределениеТ, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя);
6 Serginio1
 
11.12.13
15:33
7 kiruha
 
11.12.13
15:34
Он не признает wsdl ))
8 Bloood
 
11.12.13
15:41
Так подключался.
Определение = Новый WSОпределения("C:\WSDL\dl.wsdl");
Сервис = Определение.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];
Прокси = Новый WSПрокси(Определение, Сервис.URIПространстваИмен, Сервис.имя, ТочкаПодключения.Имя);
Прокси.Пользователь ="xxx";
Прокси.Пароль ="xxx";
Самое интересное, что данным методом подгружается фабрика XDTO в которой описаны все комплексные типы данных и описаны вход и исход. сообщения. Но при вызове. Прокси.getCatalog("ALL") выскакивает ошибка "Метод не обнаружен".
Тут проблема не в сертификатах. Это 100%. Тут проблема в что 1ска некорректно считывает методы, описанные в WSDL.
9 Apokalipsec
 
11.12.13
15:43
а отладчик что говорит?
10 SUA
 
11.12.13
15:47
POST запросом еще можно, типовым методом если хоть и через ж
11 Bloood
 
11.12.13
15:49
Отладчик пишет "Метод объекта не обнаружен (getCatalog)"
12 Bloood
 
11.12.13
16:07
Создал свой веб сервис в 1С. Метод возвращает комплексный тип данных(массив), который состоит из простых типов.  
На первый взгляд структура wsdl одинакова. Но почему одну wsdl ку 1с ка открывает, а другую нет.
Ниже wsdl ка созданная в 1с.

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/";
        xmlns:soap12bind="http://schemas.xmlsoap.org/wsdl/soap12/";
        xmlns:soapbind="http://schemas.xmlsoap.org/wsdl/soap/";
        xmlns:tns="http://www.URI.com";
        xmlns:xsd="http://www.w3.org/2001/XMLSchema";
        xmlns:xsd1="http://www.URI.com";
        xmlns:xsd2="https://api-iz.merlion.ru/v2/mlservice.php";
        name="Web"
        targetNamespace="http://www.URI.com">;
    <types>
        <xs:schema xmlns:tns="https://api-iz.merlion.ru/v2/mlservice.php";
                xmlns:xs="http://www.w3.org/2001/XMLSchema";
                targetNamespace="https://api-iz.merlion.ru/v2/mlservice.php";
                attributeFormDefault="unqualified"
                elementFormDefault="qualified">
            <xs:complexType name="ArrayOfCatalogResult">
                <xs:sequence>
                    <xs:element name="item"
                            type="tns:CatalogResult"
                            maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="CatalogResult">
                <xs:sequence>
                    <xs:element name="Код"/>
                    <xs:element name="Наименование"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
                xmlns:xs1="https://api-iz.merlion.ru/v2/mlservice.php";
                xmlns:xs2="http://www.URI.com";
                targetNamespace="http://www.URI.com";
                elementFormDefault="qualified">
            <xs:import namespace="https://api-iz.merlion.ru/v2/mlservice.php"/>;
            <xs:element name="Obmen">
                <xs:complexType>
                    <xs:sequence/>
                </xs:complexType>
            </xs:element>
            <xs:element name="ObmenResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="return" type="xsd2:ArrayOfCatalogResult"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </types>
    <message name="ObmenRequestMessage">
        <part name="parameters"
                element="tns:Obmen"/>
    </message>
    <message name="ObmenResponseMessage">
        <part name="parameters"
                element="tns:ObmenResponse"/>
    </message>
    <portType name="WebPortType">
        <operation name="Obmen">
            <input message="tns:ObmenRequestMessage"/>
            <output message="tns:ObmenResponseMessage"/>
        </operation>
    </portType>
    <binding name="WebSoapBinding"
            type="tns:WebPortType">
        <soapbind:binding style="document"
                transport="http://schemas.xmlsoap.org/soap/http"/>;
        <operation name="Obmen">
            <soapbind:operation style="document"
                    soapAction="http://www.URI.com#Web:Obmen"/>;
            <input>
                <soapbind:body use="literal"/>
            </input>
            <output>
                <soapbind:body use="literal"/>
            </output>
        </operation>
    </binding>
    <binding name="WebSoap12Binding"
            type="tns:WebPortType">
        <soap12bind:binding style="document"
                transport="http://schemas.xmlsoap.org/soap/http"/>;
        <operation name="Obmen">
            <soap12bind:operation style="document"
                    soapAction="http://www.URI.com#Web:Obmen"/>;
            <input>
                <soap12bind:body use="literal"/>
            </input>
            <output>
                <soap12bind:body use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="Web">
        <port name="WebSoap"
                binding="tns:WebSoapBinding">
            <documentation>
                <wsi:Claim xmlns:wsi="http://ws-i.org/schemas/conformanceClaim/";
                        conformsTo="http://ws-i.org/profiles/basic/1.1"/>;
            </documentation>
            <soapbind:address location="http://192.168.31.170/API/ws/Web"/>;
        </port>
        <port name="WebSoap12"
                binding="tns:WebSoap12Binding">
            <soap12bind:address location="http://192.168.31.170/API/ws/Web"/>;
        </port>
    </service>
</definitions>
13 Serginio1
 
11.12.13
16:17
А к
https://api-iz.merlion.ru/v2/mlservice.php?style=dl
можешь подключиться?
14 Bloood
 
11.12.13
16:27
(13) Как именно проверить подключение? Если просто вставить в браузер, эту адскую ссылку)). То все норм. Авторизацию прохожу.
15 Serginio1
 
11.12.13
16:38
Не разобрал он wsdl
прокси.ТочкаПодключения.Интерфейс.Операции

пустой
16 Serginio1
 
11.12.13
16:40
Попрбуй подсунуть свой WSDL только в секции
-<service name="MLService">-<port name="MLPort" binding="tns:MLBinding"><soap:address location="https://api-iz.merlion.ru/v2/mlservice.php?style=dl"/></port></service>;
укжи этот адрес
17 Serginio1
 
11.12.13
16:44
Можешь записать Пакеты из фабрики
Процедура ЗпаисатьПакетыПоФабрике(Фабрика,ИмяФайла) Экспорт

    Для Каждого Пакет из Фабрика.Пакеты Цикл
        Если Пакет.URIПространстваИмен = "http://www.w3.org/2001/XMLSchema"; Тогда
            Продолжить;
        КонецЕсли;    
        НаборСхем = Фабрика.ЭкспортСхемыXML(Пакет.URIПространстваИмен);
        Для Счетчик = 0 по НаборСхем.Количество() - 1 Цикл
            Схема = НаборСхем.Получить(Счетчик);
            Схема.ОбновитьЭлементDOM();
            ЗаписьDOM = Новый ЗаписьDOM;
            ЗаписьXMLСтрока = Новый ЗаписьXML;
            ЗаписьXMLСтрока.УстановитьСтроку();
            ЗаписьXMLФайл = Новый ЗаписьXML;
            ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXMLСтрока);
            ЗаписьXMLФайл.ОткрытьФайл(ИмяФайла + "[" + Формат(Счетчик,"ЧЦ=10;ЧГ=0;ЧН=") + "].xsd");
            ЗаписьXMLФайл.ЗаписатьБезОбработки(ЗаписьXMLСтрока.Закрыть());
            ЗаписьXMLФайл.Закрыть()
        КонецЦикла;    
    КонецЦикла;

КонецПроцедуры
18 Serginio1
 
11.12.13
16:45
А потом в свой вэб сервис добавляй нужные тебе методы
19 Bloood
 
11.12.13
17:28
(16) Адрес поменял. Возникает ошибка при считывании WSDL неверный формат. У меня такое ощущение что ошибка в пространстве имен. Из за этого 1ска и не видит методы.
Кстати, почему то сообщение на форуме перекодировалось в вид
http://192.168.31.170/API/ws/Web"/>"; target="_blank" rel="nofollow" class="extralink">http://192.168.31.170/API/ws/Web"/>;;

На самом деле там

<service name="Web">
<port name="WebSoap" binding="tns:WebSoapBinding">
<documentation>
<wsi:Claim xmlns:wsi="http://ws-i.org/schemas/conformanceClaim/"; conformsTo="http://ws-i.org/profiles/basic/1.1"/>;
</documentation>
<soapbind:address location="http://192.168.31.170/API/ws/Web"/>;
</port>
<port name="WebSoap12" binding="tns:WebSoap12Binding">
<soap12bind:address location="http://192.168.31.170/API/ws/Web"/>;
</port>
</service>
Никаких extralink нет.
20 Bloood
 
11.12.13
17:29
Опять extralinkи отображаются...
Там просто адрес http://192.168.31.170/API/ws/Web"/>;
21 Serginio1
 
11.12.13
17:39
(19) Это беда этого форума. Но Фабрику то она считывает.
А методы нет.
22 Serginio1
 
11.12.13
17:41
Попробуй импортировать Пакет выгруженный через 17. А потом дописывать методы и править WSDL на реальный адрес как в 16
так и поймешь в чем проблема
23 Bloood
 
11.12.13
17:49
(22) Спасибо) Попробую.
Самое интересное если использовать другую WSDL(стиль  rpc/encoded)
https://api-iz.merlion.ru/v2/mlservice.php?wsdl
То методы все подгружаются.... Но в этой wsdl ке нет схем входящих и исходящих запросов....
24 Bloood
 
11.12.13
18:32
Ребят, а из за чего может возникать ошибка.
Несоответствие типов XDTO:
Свойство является списковым
В wsdl ке описан этот тип вот так:
<xsd:complexType name="CatalogResult">
<xsd:all>
<xsd:element name="ID" type="xsd:string" nillable="true"/>
<xsd:element name="ID_PARENT" type="xsd:string" nillable="true"/>
<xsd:element name="Description" type="xsd:string" nillable="true"/>
</xsd:all>
</xsd:complexType>

Поменял </xsd:all> на </xs:sequence> ситуация не изменилась((( Заранее всем спасибо.
25 Bloood
 
11.12.13
18:34
Вот такую xml возвращает сервер

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:ns1="https://api-iz.merlion.ru/v2/mlservice.php?style%3Ddl">;
   <SOAP-ENV:Body>
      <ns1:getCatalogResponse>
         <getCatalogResult>
            <item>
               <ID>N10100</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Адаптеры и блоки питания</Description>
            </item>
            <item>
               <ID>N10106</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Батареи</Description>
            </item>
            <item>
               <ID>N10107</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Внешние носители информации</Description>
            </item>
            <item>
               <ID>N10108</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Док-станции, порт-репликаторы, стенды</Description>
            </item>
            <item>
               <ID>N10109</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Клавиатуры и мыши</Description>
            </item>
            <item>
               <ID>N10110</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Комплектующие</Description>
            </item>
            <item>
               <ID>N10111</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>ПО, лицензии и пакеты расширенной гарантии</Description>
            </item>
            <item>
               <ID>N10115</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Подставки</Description>
            </item>
            <item>
               <ID>N10114</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Прочее</Description>
            </item>
            <item>
               <ID>N10101</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Сумки</Description>
            </item>
            <item>
               <ID>N10112</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Устройства безопасности</Description>
            </item>
            <item>
               <ID>N10113</ID>
               <ID_PARENT>N101</ID_PARENT>
               <Description>Шнуры, кабели</Description>
            </item>
         </getCatalogResult>
      </ns1:getCatalogResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
26 Bloood
 
11.12.13
18:37
А вот такую xml 1с ка нормально воспринимает

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">;
   <soap:Header/>
   <soap:Body>
      <m:ObmenResponse xmlns:m="http://www.URI.com">;
         <m:return xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
            <item xmlns="https://api-iz.merlion.ru/v2/mlservice.php">;
               <Код xsi:type="xs:string">000000001</Код>
               <Наименование xsi:type="xs:string">Тест1</Наименование>
            </item>
            <item xmlns="https://api-iz.merlion.ru/v2/mlservice.php">;
               <Код xsi:type="xs:string">000000002</Код>
               <Наименование xsi:type="xs:string">Тест2</Наименование>
            </item>
         </m:return>
      </m:ObmenResponse>
   </soap:Body>
</soap:Envelope>

Может быть в 1с ке перед каждым типом нужно обязательно проставлять пространства имен??
27 Bloood
 
12.12.13
11:26
У кого нибудь есть идеи, по поводу обязательной простановки пространства имен у типов данных??
28 Bloood
 
12.12.13
14:02
Если кому интересно, то wsdl ку удалось исправить.
1с ка падала на строке
<operation name="HelloWorld">
<soap:operation soapAction="https://api-iz.merlion.ru/v2/mlservice.php?style=dl#HelloWorld"/>;
<input>
<soap:body use="literal" namespace="https://api-iz.merlion.ru/v2/mlservice.php"/>;

namespace="https://api-iz.merlion.ru/v2/mlservice.php"; удалил везде эту строку. Методы определяются.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший