powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
4 сообщений из 4, страница 1 из 1
Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
    #38349556
neural_cyst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема при передаче параметра строкового типа web-сервиса. Имеем:
Со стороны web-сервиса - GlassFish 3.1.2 + NetBeans 7.3 + Java EE 6.
Со стороны клиента web-сервиса - Платформа 1C Предприятие 8.2.18.61.

Код web-сервиса:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
package services.exchange;

import domain.entities.RequestForRepair;
import domain.facades.exchange.DownloadQueueFacade_RequestForRepair;
import domain.facades.exchange.NodeFacade;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jws.Oneway;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

@WebService(serviceName = "RequestsForRepairDownload")
@Stateless
public class RequestsForRepairDownload {

    @EJB
    DownloadQueueFacade_RequestForRepair dqf;
    @EJB
    NodeFacade nodeFacade;
    
    /**
     * This is a sample web service operation
     */
    @WebMethod(operationName = "download")
    public List<RequestForRepair> download(@WebParam(name = "nodename") String nodeName) {
        
        return dqf.findAndMarkDBOByNodeName(nodeName);        
           
    }
    
    @WebMethod(operationName = "downloaded")
    @Oneway
    public void downloaded(@WebParam(name = "nodename") String nodeName) {
        
        dqf.deleteDownloadedByNodeName(nodeName);
        
    }
        
    
}



Код клиента (здесь 2 опробованных варианта - ни один не работает):

Вариант 1
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Процедура ТестWebСервиса() Экспорт
	
        ИмяУзла = "1C Backend";

	WSПрокси = 
		WSСсылки.
		RequestsForRepairDownload.
		СоздатьWSПрокси("http://exchange.services/", 
						"RequestsForRepairDownload", 
						"RequestsForRepairDownloadPort");
	
	ТипWSПараметра = WSПрокси.ФабрикаXDTO.Пакеты.
		Получить("http://exchange.services/").
		Получить("download");
	
	WSПараметры = WSПрокси.ФабрикаXDTO.Создать(ТипWSПараметра);
	WSПараметры.nodename = WSПрокси.ФабрикаXDTO.Создать(
		WSПрокси.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"), 
		ИмяУзла);
		
	Данные = WSПрокси.download(WSПараметры);	
        
        Если Данные <> Неопределено Тогда
		ДанныеЗагрузки = Данные.ПолучитьСписок("return");
                // прохождение списка и пр.
	КонецЕсли;	

КонецПроцедуры



Вариант 2
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Процедура ТестWebСервиса() Экспорт
	
        ИмяУзла = "1C Backend";

	WSПрокси = 
		WSСсылки.
		RequestsForRepairDownload.
		СоздатьWSПрокси("http://exchange.services/", 
						"RequestsForRepairDownload", 
						"RequestsForRepairDownloadPort");
	
	ТипWSПараметра = WSПрокси.ФабрикаXDTO.Пакеты.
		Получить("http://exchange.services/").
		Получить("download");
	
	WSПараметры = WSПрокси.ФабрикаXDTO.Создать(ТипWSПараметра);
	WSПараметры.nodename = ИмяУзла;
		
	Данные = WSПрокси.download(WSПараметры);
        
        Если Данные <> Неопределено Тогда
		ДанныеЗагрузки = Данные.ПолучитьСписок("return");
                // прохождение списка и пр.
	КонецЕсли;
	
КонецПроцедуры



Проблема:
Собственно все вроде бы работает, никакие исключения не выскакивают, метод RequestsForRepairDownload.download(String nodeName) вызывается, НО web-сервис возвращает пустой список, когда должен возвращать заполненный некоторыми значениями. Включаем отладчик со стороны java ee и видимо, что значение параметра nodeName = null; Если тестировать web-сервис штатными средствами GlassFish через консоль администратора все работает ОК.

Примечание:
Предвижу предложение в 1С сделать так:
Код: vbnet
1.
       Данные = WSПрокси.download(ИмяУзла);


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

Вопрос:
Есть ли у кого опыт успешного решения подобной проблемы или хотя бы какие-то идеи куда копать?
Есть подозрение, что собственно прикладной код и со стороны web-сервиса и со стороны клиента написан верно (во всяком случае по мануалам), однако видимо формат wdsl описания, которое генерирует GlassFish чем-то не очень нравится 1С. Во всяком случае в сети описания подобной проблемы есть (не применительно к JAVA EE Web-сервису, в плане херовости реализации клиентской части работы с web-сервисами в 1С в принципе), но там речь идет о полной невозможности работать через стандартный механизм web-сервисов 1С (1С не может прочитать wdsl описание), здесь же оно вроде работает, но есть нюанс. ^_^ Есть и предложение решения: через HTTPСоединение, но я пока не пробовал. Хотелось бы все таки заставить все работать так, как оно ДОЛЖНО работать.
...
Рейтинг: 0 / 0
Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
    #38350424
neural_cyst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока что попробовал обходной маневр - использовать ms soap toolkit 3 через COM.
Результат оказался ещё хуже.

Здесь ошибка выскакивает на самом начальном этапе при вызове метода MSSoapInit():
Код: java
1.
2.
       WSПрокси = Новый COMОбъект("MSSOAP.SoapClient");
       WSПрокси.MSSoapInit("http://conversiontower:8080/RequestsForRepairDownload/RequestsForRepairDownload?wsdl");



Что имеем:
WSПрокси.faultstring =
WSПрокси.faultstringWSDLOperation: The schema definition with a targetnamespace of http://exchange.services/ for SoapMapper download could not be found


WSПрокси.detail =
WSПрокси.detailWSDLReader:Analyzing the WSDL file failed HRESULT=0x80004005
- WSDLReader:Initialization of service failed HRESULT=0x80004005
- WSDLService:Initialization of the port for service RequestsForRepairDownload failed HRESULT=0x80004005
- WSDLPort:Analyzing the binding information for port RequestsForRepairDownloadPort failed HRESULT=0x80004005
- WSDLPort:An operation for port RequestsForRepairDownloadPort could not be initialized HRESULT=0x80004005
- WSDLOperation:Initializing of the input message failed for operation download HRESULT=0x80004005
- WSDLOperation:The parameters for element parameters in operation download could not be created. The parameters could not be expanded HRESULT=0x80004005
- WSDLOperation:The schema definition with a targetnamespace of http://exchange.services/ for SoapMapper download could not be found HRESULT=0x80004005


Из всего вышесказанного я могу предположить, что загвоздка видимо в wsdl файле. Возможно его как-то надо откорректировать, чтобы он стал более понятен 1С и MS SOAP Toolkit - непосредственно или как-то изменив какие-то настройки glassfish, изменив аннотации или ещё как-то.

Думаю есть смысл выложить и сам wsdl файл:

conversiontower:8080/RequestsForRepairDownload/RequestsForRepairDownload?wsdl
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
<!--
 Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.2.0-1 (tags/2.2.0u1-7139; 2012-06-02T10:55:19+0000) JAXWS-RI/2.2.6-2 JAXWS/2.2 svn-revision#unknown. 
-->
<!--
 Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.2.0-1 (tags/2.2.0u1-7139; 2012-06-02T10:55:19+0000) JAXWS-RI/2.2.6-2 JAXWS/2.2 svn-revision#unknown. 
-->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://exchange.services/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://exchange.services/" name="RequestsForRepairDownload">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://exchange.services/"     schemaLocation="http://conversiontower:8080/RequestsForRepairDownload/RequestsForRepairDownload?xsd=1"/>
    </xsd:schema>
  </types>
  <message name="download">
    <part name="parameters" element="tns:download"/>
  </message>
  <message name="downloadResponse">
    <part name="parameters" element="tns:downloadResponse"/>
  </message>
  <message name="downloaded">
    <part name="parameters" element="tns:downloaded"/>
  </message>
  <portType name="RequestsForRepairDownload">
    <operation name="download">
      <input wsam:Action="http://exchange.services/RequestsForRepairDownload/downloadRequest" message="tns:download"/>
      <output wsam:Action="http://exchange.services/RequestsForRepairDownload/downloadResponse" message="tns:downloadResponse"/>
    </operation>
    <operation name="downloaded">
      <input wsam:Action="http://exchange.services/RequestsForRepairDownload/downloaded" message="tns:downloaded"/>
    </operation>
  </portType>
  <binding name="RequestsForRepairDownloadPortBinding" type="tns:RequestsForRepairDownload">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="download">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
    <operation name="downloaded">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
    </operation>
  </binding>
  <service name="RequestsForRepairDownload">
    <port name="RequestsForRepairDownloadPort" binding="tns:RequestsForRepairDownloadPortBinding">
      <soap:address location="http://conversiontower:8080/RequestsForRepairDownload/RequestsForRepairDownload"/>
    </port>
  </service>
</definitions>



conversiontower:8080/RequestsForRepairDownload/RequestsForRepairDownload?xsd=1
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
<!--
 Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.2.0-1 (tags/2.2.0u1-7139; 2012-06-02T10:55:19+0000) JAXWS-RI/2.2.6-2 JAXWS/2.2 svn-revision#unknown. 
-->
<xs:schema xmlns:tns="http://exchange.services/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://exchange.services/">
<xs:element name="download" type="tns:download"/>
<xs:element name="downloadResponse" type="tns:downloadResponse"/>
<xs:element name="downloaded" type="tns:downloaded"/>
<xs:element name="requestForRepair" type="tns:requestForRepair"/>
<xs:element name="vehicle" type="tns:vehicle"/>
<xs:complexType name="downloaded">
  <xs:sequence>
    <xs:element name="nodename" type="xs:string" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="download">
  <xs:sequence>
    <xs:element name="nodename" type="xs:string" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="downloadResponse">
  <xs:sequence>
    <xs:element name="return" type="tns:requestForRepair" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="requestForRepair">
  <xs:sequence>
    <xs:element name="number" type="xs:long" minOccurs="0"/>
    <xs:element name="date" type="xs:dateTime" minOccurs="0"/>
    <xs:element ref="tns:vehicle" minOccurs="0"/>
    <xs:element name="customer" type="xs:string" minOccurs="0"/>
    <xs:element name="status" type="tns:requestStatus" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="vehicle">
  <xs:sequence>
    <xs:element name="name" type="xs:string" minOccurs="0"/>
    <xs:element name="vin" type="xs:string" minOccurs="0"/>
    <xs:element name="model" type="xs:string" minOccurs="0"/>
    <xs:element name="customer" type="xs:string" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>
<xs:simpleType name="requestStatus">
  <xs:restriction base="xs:string">
    <xs:enumeration value="REQUEST"/>
    <xs:enumeration value="CONFIRMED"/>
    <xs:enumeration value="INWORK"/>
    <xs:enumeration value="COMPLETE"/>
    <xs:enumeration value="CANCELED"/>
  </xs:restriction>
</xs:simpleType>
</xs:schema>
...
Рейтинг: 0 / 0
Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
    #38352263
neural_cyst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена, тему можно закрывать!

Напишу здесь в чем было дело и что помогло на случай, если кто столкнется с аналогичной проблемой.

soapUI рулит! После создания проектов для теста клиента и сервиса все стало понятно.

Исходя из изначально сгенерированного wsdl следовал следующий формат сообщений с параметром:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Header/>
   <S:Body>
      <x:download xmlns:x="http://exchange.services/">
         <nodename>1C Backend</nodename>
      </x:download>
   </S:Body>
</S:Envelope>



1C же упорно слала сообщения следующего вида:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Header/>
   <S:Body>
      <download xmlns="http://exchange.services/">
         <nodename>1C Backend</nodename>
      </download>
   </S:Body>
</S:Envelope>



Из этих двух сообщений видно, что изначально для тэга <nodename> пространство имен было пустое, 1С же включала этот тэг в пространство имен " http://exchange.services/".

Решение было простым: добавить для тэга <nodename> пространство имен " http://exchange.services/"! Ничего сверхестественного делать не пришлось - все обошлось правкой аннотаций.
Сразу оговорюсь, что подобная фигня была не только с передачей параметра, но и со всем остальным.

В итоге метод download() приобрел следующий вид:
Код: java
1.
2.
3.
4.
5.
    @WebMethod(operationName = "download")
    @WebResult(name = "return", targetNamespace = "http://exchange.services/")
    public List<RequestForRepair> download(@WebParam(name = "nodename", targetNamespace = "http://exchange.services/") String nodeName) {
        return dqf.findAndMarkDBOByNodeName(nodeName);
    }



Как можно заметить в аннотациях @WebResult и @WebParam появилось targetNamespace = " http://exchange.services/".
Похожие вещи пришлось проделать со всеми классами графа возвращаемых объектов: @XmlRootElement(name = "requestforrepair") превратился @XmlRootElement(name = "requestforrepair", namespace = " http://exchange.services/"), @XmlElement(name = "number") превратился в @XmlElement(name = "number", namespace = " http://exchange.services/") и т.д.

После подобных махинаций все заработало нормально. Никаких HTTPСоединение и MS SOAP Toolkit не понадобилось.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
    #38755104
Anthonio84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neural_cyst,

есть способ по-проще:
в пакете веб-сервиса, допустим это "ru.company.ws", создать файл package-info.java
следующего содержания:

Код: java
1.
2.
3.
@javax.xml.bind.annotation.XmlSchema(namespace = "http://exchange.services/",
 elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package ru.company.ws;




тогда WSDL приобрет вид :
Код: xml
1.
2.
3.
4.
<wsdl:definitions name="WebServiceWS" targetNamespace="http://exchange.services/">
 <wsdl:types>
  <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://exchange.services/">
   ...



Как видно, elementFormDefault стал равен "qualified".

Теперь сервис будет производить ответ следующего вида:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <downloadResponse xmlns="http://exchange.services/">
         <return>
         ...
         </return>
      </getObjectGroupResponse>
   </soap:Body>
</soap:Envelope>



Такой вариант работы с неймспейсами на ура воспринимается 1С.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Web-сервис Java, 1С-клиент: проблема передачи строкового параметра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]