Имя: Пароль:
IT
Веб-мастеринг
WEB сервисы 1С из браузера
0 abtat
 
14.02.13
17:29
Я собрал два WEB-Сервиса в 1С v.8.2.1.540 – Сотрудники(Workers) по варианту из http://infostart.ru/public/86791/ и более простой  Привет(PrivetBoys1) с использованием текстов privet.htm и privet.js, по образу приведенных в статье http://infostart.ru/public/16001/ с некоторыми заменами имен, и благополучно вызываю их из другого экземпляра 1С на той же машине. Сервер Apache 2.2. на ней же. В WEB-сервисах экземпляра 1С-сервера имеются функции «Получить список сотрудников(ФИО)» и «SalutBoys()» возвращающие результат оператором Return.

Строки обращения к 1С-серверу для этих Сервисов в 1С-клиенте имеют вид:

           Определения = Новый WSОпределения("http://localhost/WebServicesDemo/ws/Workers.1cws?wsdl");

           Прокси      = Новый WSПрокси(Определения, "http://www.sample-package.org", "Workers", "WorkersSoap");

           Ответ       = Прокси.ПолучитьСписокСотрудников(ФИО);

И
           Определения = Новый WSОпределения("http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws?wsdl");

           Прокси      = Новый WSПрокси(Определения, "http://www.sample-package.org", "PrivetBoys1", "PrivetBoys1Soap");

           ОтветWS       = Прокси.SalutBoys();

На форме в 1С-клиенте после выполнения этих обращений распечатываются данные одного или списка сотрудников и приветственное обращение.

Отладку вызовов из браузера начал с более простого «PrivetBoys1» (пробовал на IE и Opera) с учетом замены имени preved  на privet в вызове скрипта, на PrivetBoys1 в имени файла публикации ( PrivetBoys1.csv) и ссылке на него в операторе POST:

           xmlhttp.open('POST', 'http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws?wsdl', true);

а также имени функции ПриветХлопцы на SalutBoys в строке soap:Body оператора SEND:

           '<soap:Body> <m:SalutBoys xmlns:m="http://www.sample-package.org"/> </soap:Body>' +.

Все остальные элементы текстов, приведенных в этой статье, остались неизменными, но в результате за несколько секунд после выполнения оператора SEND происходят несколько последовательных вызова функции ПриОтветеСервера с изменением значения readyState c 0 до 4, в последнем случае status = 200, т.е. все прошло благополучно, но ДомОтвет = NULL и ДанныеОтвета = undefined. И в конфигураторе 1С-сервера остановки в операторе return «Привет» функции SalutBoys получить не удается.

Я распечатал файл публикации …PrivetBoys.1cws?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.sample-package.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd1="http://www.sample-package.org" name="PrivetBoys1" targetNamespace="http://www.sample-package.org">
- <types>
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xs1="http://www.sample-package.org" targetNamespace="http://www.sample-package.org" elementFormDefault="qualified">
- <xs:element name="SalutBoys">
- <xs:complexType>
 <xs:sequence />
 </xs:complexType>
 </xs:element>
- <xs:element name="SalutBoysResponse">
- <xs:complexType>
- <xs:sequence>
 <xs:element name="return" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
 </xs:element>
 </xs:schema>
 </types>
- <message name="SalutBoysRequestMessage">
 <part name="parameters" element="tns:SalutBoys" />
 </message>
- <message name="SalutBoysResponseMessage">
 <part name="parameters" element="tns:SalutBoysResponse" />
 </message>
- <portType name="PrivetBoys1PortType">
- <operation name="SalutBoys">
 Файл публикации WEB-сервиса PrivetBoys1.1ces?wsdl



 <input message="tns:SalutBoysRequestMessage" />
 <output message="tns:SalutBoysResponseMessage" />
 </operation>
 </portType>
- <binding name="PrivetBoys1SoapBinding" type="tns:PrivetBoys1PortType">
 <soapbind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
- <operation name="SalutBoys">
 <soapbind:operation style="document" soapAction="http://www.sample-package.org#PrivetBoys1:SalutBoys" />
- <input>
 <soapbind:body use="literal" />
 </input>
- <output>
 <soapbind:body use="literal" />
 </output>
 </operation>
 </binding>
- <binding name="PrivetBoys1Soap12Binding" type="tns:PrivetBoys1PortType">
 <soap12bind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
- <operation name="SalutBoys">
 <soap12bind:operation style="document" soapAction="http://www.sample-package.org#PrivetBoys1:SalutBoys" />
- <input>
 <soap12bind:body use="literal" />
 </input>
- <output>
 <soap12bind:body use="literal" />
 </output>
 </operation>
 </binding>
- <service name="PrivetBoys1">
- <port name="PrivetBoys1Soap" binding="tns:PrivetBoys1SoapBinding">
- <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://localhost/WebServicesDemo/ws/PrivetBoys1.1cws" />
 </port>
- <port name="PrivetBoys1Soap12" binding="tns:PrivetBoys1Soap12Binding">
 <soap12bind:address location="http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws" />
 </port>
 </service>
 </definitions>

Текст файла Privet.htm:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Здоровеньки булы</title>
<script type="text/javascript" src='privet.js'> </script>
<body>
<p>
 <input id="MyButton" type="button" onclick="ПриветствоватьВебСервис()" value="Поприветствовать web сервис"/>
</p>
<p id="ОтветСервера"></p>
</body>
</html>

Текст файла Privet.js:

/*
* Демо скрипт по доступу к web севису 1С из браузера
* Copyright (c) 2008, Юрий Ляшко, [email protected]
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
* Date: 2008-06-29
*/
// функция определяет тип браузера и устанавливает одно из свойств переменной browser в Истина
function определитьБраузер(){
   var userAgent = navigator.userAgent.toLowerCase();
   // Определим используемый браузер
   browser = {
       version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
       safari: /webkit/.test( userAgent ),
       opera: /opera/.test( userAgent ),
       msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
       firefox3: /firefox\/3/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ),
       firefox2: /firefox\/2/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ),
       firefox1: /firefox\/1/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
   }
}

// Для разных браузеров пользуются разные пути получения таких объектов, поэтому пользуем попытку/исключение.
// возвращает объект, который может соединяться с сервером.
function getXmlHttp(){
   var xmlhttp;
   try {
       xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
   } catch (e) {
       try {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
       } catch (E) {
           xmlhttp = false;
       }
   }
   if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
       xmlhttp = new XMLHttpRequest();
   }
 return xmlhttp;
}

// функция возвращает строку в неизменном виде для всех браузеров, кроме ИЕ. Для ИЕ FF версии 3.0 добавляет "m:".
function ИЕ(стр){
   if (browser.msie || browser.firefox3) return  "m:" + стр
   else return стр
}

// Функция вызывается по мере готовности ответа от сервера
function ПриОтветеВебСервиса(xmlhttp){
   if (xmlhttp.readyState == 4) {// когда ответ готов.
       if(xmlhttp.status != 200) {// Если всё плохо - скажем об этом
           alert("Запрос завершился неудачно. Ответ сервера: " + xmlhttp.responseText)
       }
       else{/*собственно за следующие три строки мы и боролись. Получили ответ сервера и выводим его, ответ, на страницу.
           Работа с javaScript описана в соответствующих учебниках. Напрмер в http://javaScript.ru
           Нам интересно только то что ответ сервера находится в свойстве responseXML объекта xmlhttp
           responseXML - объект типа DOM*/
           var ДомОтвет = xmlhttp.responseXML.getElementsByTagName(ИЕ("return"))[0] // "m:return" - для IE, "return" - для FF
           var ДанныеОтвета = ДомОтвет.childNodes[0].data
           document.getElementById("ОтветСервера").appendChild(document.createTextNode(ДанныеОтвета))
       }

       // Когда сервер ответил можно включить кнопочку.
       document.getElementById("MyButton").value = "Поприветствовать web сервис"
       document.getElementById("MyButton").disabled = false
   }
}

// функция вызывается по нажатию кнопки на страничке. С неё всё и начинается
function ПриветствоватьВебСервис(){
   определитьБраузер()
   var xmlhttp = getXmlHttp()

   // создаём соединение типа POST, второй параметр - адрес, параметр true значит асинхронное, то есть браузер не бедет ждать ответа сервера, а продолжит работу
   xmlhttp.open('POST', 'http://localhost/WebServicesDemo/ws/PrivetBoys1.1cws?wsdl', true);
//    xmlhttp.open('POST', 'http://gsi12/gsi2000.ru:80/WebServicesDemo/ws/salut.1cws?wsdl', true)
   // Скажем что делать когда придёт ответ - вызвать функцию ПриОтветеВебСервиса()
   xmlhttp.onreadystatechange = function() {ПриОтветеВебСервиса(xmlhttp)}

   // Отправим своё приветствие веб сервису в виде XML.
   xmlhttp.send('<?xml version="1.0" encoding="UTF-8"?>' +
       '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+ // <soap:Header/>' +
//        '<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope/"> <soap:Header/>' +
//        '<soap:Envelope xmlns:soap="http://www.sample-package.org/soap-envelope/"> <soap:Header/>' +
       '<soap:Body> <m:SalutBoys xmlns:m="http://www.sample-package.org"/> </soap:Body>' +
       '</soap:Envelope>')
   // Напишем на кнопке чего мы ждём, а то пользователи они такие. Понатыкают на кнопку а потом удивляются.
   document.getElementById("MyButton").value = "Ждём ответа..."
   document.getElementById("MyButton").disabled = true
}

Хотелось бы понять, почему обращение из Браузера не проходит, тогда как из другого экземпляра 1С все ОК.
1 Лефмихалыч
 
14.02.13
17:32
(0) удачи в поисках того, кто станет это читать и искать, где у тебя там вопрос написан
2 Stim
 
14.02.13
17:38
Ошибка в третьей строке
3 tan76
 
14.02.13
17:41
(0) вот программа, которая, надеюсь, поможет отладить....
http://www.fiddler2.com/fiddler2/
4 Evpatiy
 
14.02.13
17:43
(0) Опишите проблему подробнее, пожалуйста. Желательно со скриншотами.