Имя: Пароль:
1C
1С v8
Подключение к Web-сервису стороннего разработчика (не 1С)
0 yurii-syrkin
 
11.10.13
08:19
Всем здравствуйте. В общем немного прояснилось, оказывается стандартный механизм платформы (WS ссылка) на данный момент как я понимаю имеют ограниченный функционал для работы с soap. Далеко не каждый wsdl способен определиться, пусть даже в soap ui проблем с ним не возникает. У 1С на этот счет свои требования, о которых мне в результате двухнедельных боев так и не посчастливилось узнать. Теперь вопрос в следующем: как мне подключиться через COM к web-сервису. Операционная система windows 2008 r2 поэтому MSSOAP.SoapClient30 никак не получается воспользоваться, может что не так делаю, вылетает с ошибкой "класс не зарегистрирован"
1 Asmody
 
11.10.13
08:26
(0) веб-сервис, видимо, на java?
Можно взять wsdl, допилить до вида, который прожует 1С, но это долго и муторно.
Можно написать "прослойку" на чем-то, что понимает ws с той стороны и устроит 1С
2 shuhard
 
11.10.13
08:33
3 yurii-syrkin
 
11.10.13
08:34
wsdl я допиливал, только пришлось убирать теги, которые отвечают за авторизацию. Видимо именно со способами авторизации у 1С не все хорошо. А вот с прослойкой это интересно. Под силу ли это 1С программисту?)
4 yurii-syrkin
 
11.10.13
10:07
(2) А вы сами пробовали этим пользоваться? Может чего не понимаю, но я скачал, поставил, посмотрел мануал, эти два общих модуля ни слова про soap, ни слова про wsdl. Что это такое не пойму. http get и post они и без этого работают. Кому интересно это пригодится. Сейчас еще посмотрю, конечно
5 Смотрящий от 1С
 
11.10.13
10:10
(0) если не секрет с каким внешним сервисом возитесь? Я сам бодаюсь с одним уже недели три
6 yurii-syrkin
 
11.10.13
10:18
(5)Заказчики говорили это конфиденциально, хотя ничего такого в принципе, но вы бы все равно не смогли его открыть в браузере, там ограничение по ip-адресам установлено. На всякий случай писать не буду, вдруг в поиск зададут) На сколько сильно продвинулись? Что перепробовали?
7 yurii-syrkin
 
11.10.13
10:24
Вот концовка wsdl, без которой все определяется:
</wsdl:binding>
- <wsdl:service name="GarbageRouteService">
- <wsdl:port binding="tns:GarbageRouteServiceSoapBinding" name="GarbageRouteServiceImplPort">
  <soap:address location="http://ods.fors.ru:80/garbageRoute/garbageRouteWebService"; />
  </wsdl:port>
  </wsdl:service>
- <wsp:Policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"; xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"; xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"; wsu:Id="UsernameToken" xsi:schemaLocation="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702 http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/ws-securitypolicy-1.2.xsd">;
- <wsp:ExactlyOne>
- <wsp:All>
- <sp:SupportingTokens>
- <wsp:Policy>
- <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">;
  <wsp:Policy />
  </sp:UsernameToken>
  </wsp:Policy>
  </sp:SupportingTokens>
  </wsp:All>
  </wsp:ExactlyOne>
  </wsp:Policy>
  </wsdl:definitions>
8 yurii-syrkin
 
11.10.13
11:15
Хорошо. К примеру  я убрал эти теги, у меня ws ссылка нормально определилась в конфигураторе. Почему у меня вылетает ошибка на строке WSСсылки.WS_АСУ_ОДС.СоздатьWSПрокси("
Ошибка по причине:
Сервис не найден.
9 Смотрящий от 1С
 
11.10.13
11:16
(7) не мой, вижу)). Где то встречал статью Гения1С, он там писал, про то, что 1С не любит Policy в WSDL
10 yurii-syrkin
 
11.10.13
11:28
Да, я тоже читал, благодаря этому и смог хоть как-то загрузить этот wsdl. Только теперь при создании ошибка лезет. Вообще, конечно, не понятно, возможно ли такое, что в 1С один wsdl, а там на web-сервисе другой, пусть не на много, но отличный. Будет это работать или нет?
11 Balonbl4
 
11.10.13
12:07
Будь мужиком!
Сформируй xml "руками" и скорми его сервису POST запросом
12 Serginio1
 
11.10.13
12:12
13 Leksus
 
11.10.13
12:16
(11) плюсану
14 Serginio1
 
11.10.13
13:54
(8) Ты секцию service то оставь
Удали только то, что после нё.
15 yurii-syrkin
 
11.10.13
15:18
Выдает: "Internal Server Error" на строке: Сообщить("" + xmlHttp.statusText);
16 yurii-syrkin
 
11.10.13
15:20
hostName ставлю ip адрес сервера, а urlAddress - значение soap:address location из WSDL. Правильно?
17 Serginio1
 
11.10.13
15:27
(16) да
18 Serginio1
 
11.10.13
15:30
У меня был один сайт так я его через сборку .Net использовал
v8: Вопрос по NetObjectToIDispatch

Сейчас с 7.7 буду использовать.
19 yurii-syrkin
 
11.10.13
17:07
Вообще, конечно MSXML2.xmlHttp это то что нужно в моем случае, но что я похоже не так делаю:

DOC=New COMОбъект("MSXML2.DOMDocument");
    DOC.loadXML(ТекстЗапроса);
    
    If DOC.parseError.errorCode <> 0 Then
        Сообщить("Ошибка разбора XML " + DOC.parseError.reason);
        Возврат;
    EndIf;
    DOC.save(КаталогФайловОбмена + "\2.xml");
    
    hostName="212.5.79.138";
    urlAddress="http://ods.fors.ru:80/garbageRoute/garbageRouteWebService/";;
    Состояние("Выполнение запроса..." + hostName);
    xmlHttp = New COMОбъект("MSXML2.xmlHttp");
    xmlHttp.OPEN("GET", urlAddress, False);
    // False- отвечает за то, что запррос асинхронный и ожидаем ответа

    
    xmlHttp.setRequestHeader("Host", hostName);
    xmlHttp.setRequestHeader("Content-type", "application/soap+xml; charset=""utf-8""");
    xmlHttp.SEND(DOC);
    Сообщить("" + xmlHttp.statusText);
    DOCToSave=New COMОбъект("MSXML2.DOMDocument");
    DOCToSave.loadXML(xmlHttp.responseText);
    If DOCToSave.parseError.errorCode <> 0 Then
        Сообщить("Ошибка разбора XML результата: " + DOC.parseError.reason);
        //Возврат;
    EndIf;
    DOCToSave.save(КаталогФайловОбмена + "\GetData.xml");

на строке Сообщить("" + xmlHttp.statusText); ошибка 500, текст ошибки Internal Server Error и xmlHttp.responseText = <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>No binding operation info while invoking unknown method with params unknown.</faultstring></soap:Fault></soap:Body></soap:Envelope>. Что не так?
20 Serginio1
 
11.10.13
17:16
21 yurii-syrkin
 
11.10.13
22:13
(20) Это безусловно очень важная и интересная информация и я её себе сохранил на всякий случай, но как мне воспользоваться этим для решения своих проблем?
22 Serginio1
 
12.10.13
00:46
Попробуй воспользоваться C#. А прочитать стоит, что бы понять, что напрямую соединиться не получится
23 yurii-syrkin
 
12.10.13
00:56
Да вот я уже тоже сейчас в этом направлении работаю. Никогда не приходилось сталкиваться, а тут на тебе. Учитывая мой исключительно 1С-овский уклад, мне похоже непросто придется, да?) Я так понял надо написать внешнюю компоненту и обращаться к ней из 1С?
24 Serginio1
 
12.10.13
11:45
(23) Нет не надо. Нужно сделать сборку с подключением к Вэб сервису. А затем через  v8: Вопрос по NetObjectToIDispatch через COM использовать её обернув объекты через AutoWrap.

Заходишь в Вижуал студию,Создаешь библиотеку, добавляешь ссылку на службу (совместимость с 2.0) Добавляешь класс который возвращает объект соединения обернутый в AutoWrap

[ComVisible(true)]
    [ProgId("ИмяТвоегоПрогИД")]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    [Guid("Создаешь свой ГУИД")]
    public class ИмяТвоегоКласс//    {


        public object Подключиться()
        {
            return new AutoWrap(new   ПодключениеКТвоемуВэбСервису);
        }


А с этим объектом работаешь из 1С как с COM объектом
25 Serginio1
 
12.10.13
11:56
Можно и без совместимости
26 yurii-syrkin
 
23.10.13
16:17
В общем, ребят, удалось все таки повлиять на разработчиков веб сервиса, чтобы они изменили способ аутентификации. 1С принимает только базовый способ.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший