I
Ino
Здравствуйте. Возникла задача интеграции 1С с PHP посредством веб-сервиса, публикуемого на стороне PHP и вызываемого из 1С. Веб-сервис работает нормально, однако проблемы начинаются при попытке передать сложный объект, в котором одним из полей (наряду с полями-примитивами) является поле сложного типа, а этот тип в свою очередь является массивом любых объектов (сложных или примитивов).
Вот кусок описание типов из WSDL:
<!--shcode--><pre><code class='xml'><xsd:complexType name="ArrayOfString">
<xsd:sequence>
<xsd:element name="item" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Soap_Debug_Container">
<xsd:all>
<xsd:element name="field1" type="xsd:string" nillable="true"/>
<xsd:element name="field2" type="xsd:int" nillable="true"/>
<xsd:element name="field3" type="xsd:float" nillable="true"/>
<xsd:element name="field4" type="xsd:boolean" nillable="true"/>
<xsd:element name="nestedObjects" type="tns:ArrayOfString" nillable="true"/>
</xsd:all>
</xsd:complexType>[/CODE]
Проблема состоит в том, что 1С не хочет воспринимать такой объект и при вызове метода веб-сервиса выдает следующую ошибку
Для тестов также был создан другой веб-сервис, который и публикуется, и вызывается на стороне 1С. В данном веб-сервисе похожая структура типов (но не идентичная) описывается следующим образом:
<!--shcode--><pre><code class='xml'><xsd:complexType name="Obj">
<xsd:sequence>
<xsd:element name="N" type="xsd:integer"/>
<xsd:element name="D" type="xsd:date"/>
<xsd:element name="S" type="xsd:string"/>
<xsd:element name="B" type="xsd:boolean"/>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="Mas" type="tns:StrTZ"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="StrTZ">
<xsd:sequence>
<xsd:element name="Num" type="xsd:integer"/>
<xsd:element name="Dat" type="xsd:date"/>
<xsd:element name="Str" type="xsd:string"/>
<xsd:element name="Bul" type="xsd:boolean"/>
</xsd:sequence>
</xsd:complexType>[/CODE]
Этот веб-сервис нормально вызывается и работает в 1С. Очевидно, что во втором случае отсутствует выделение сложного типа, такого как <xsd:complexType name="ArrayOfString"> в первом примере. Во втором случае, в ответе сервися 1С последовательность вложенных объектов (из 4х свойств каждый) находится на одном уровне с полями объекта. В первом же случае -- одно из полей имеет сложный тип, который является последовательностью объектов.
Теперь, собственно, вопрос: является ли это проблемой 1С? Если да, то как можно заставить 1С воспринимать сложные типы вида "Массив сложных типов"?
Также стоит упомянуть, что WSDL ссылка воспринимается 1С нормально и показывает верную структуру типов, а ошибка возникает именно при вызове метода, возвращающего такой объект. Для полной ясности, приведу также кусок ответа от сервера, в котором описывается этот объект:
<!--shcode--><pre><code class='xml'><return xsi:type='ns1:Oir_Module_Sync_Soap_Debug_Container'>
<field1 xsi:type='xsd:string'>Field 1 value</field1>
<field2 xsi:type='xsd:int'>32</field2>
<field3 xsi:type='xsd:float'>24.56</field3>
<field4 xsi:type='xsd:boolean'>false</field4>
<nestedObjects xsi:type='ns1:ArrayOfString'>
<item xsi:type='xsd:string'>string0</item>
<item xsi:type='xsd:string'>string1</item>
...
</nestedObjects>
</return>[/CODE]
Вот кусок описание типов из WSDL:
<!--shcode--><pre><code class='xml'><xsd:complexType name="ArrayOfString">
<xsd:sequence>
<xsd:element name="item" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Soap_Debug_Container">
<xsd:all>
<xsd:element name="field1" type="xsd:string" nillable="true"/>
<xsd:element name="field2" type="xsd:int" nillable="true"/>
<xsd:element name="field3" type="xsd:float" nillable="true"/>
<xsd:element name="field4" type="xsd:boolean" nillable="true"/>
<xsd:element name="nestedObjects" type="tns:ArrayOfString" nillable="true"/>
</xsd:all>
</xsd:complexType>[/CODE]
Проблема состоит в том, что 1С не хочет воспринимать такой объект и при вызове метода веб-сервиса выдает следующую ошибку
Ошибка при вызове метода контекста (getObject): Ошибка вызова операции сервиса: {http://...}:Soap_Debug_ServiceService:getObject()
Для тестов также был создан другой веб-сервис, который и публикуется, и вызывается на стороне 1С. В данном веб-сервисе похожая структура типов (но не идентичная) описывается следующим образом:
<!--shcode--><pre><code class='xml'><xsd:complexType name="Obj">
<xsd:sequence>
<xsd:element name="N" type="xsd:integer"/>
<xsd:element name="D" type="xsd:date"/>
<xsd:element name="S" type="xsd:string"/>
<xsd:element name="B" type="xsd:boolean"/>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="Mas" type="tns:StrTZ"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="StrTZ">
<xsd:sequence>
<xsd:element name="Num" type="xsd:integer"/>
<xsd:element name="Dat" type="xsd:date"/>
<xsd:element name="Str" type="xsd:string"/>
<xsd:element name="Bul" type="xsd:boolean"/>
</xsd:sequence>
</xsd:complexType>[/CODE]
Этот веб-сервис нормально вызывается и работает в 1С. Очевидно, что во втором случае отсутствует выделение сложного типа, такого как <xsd:complexType name="ArrayOfString"> в первом примере. Во втором случае, в ответе сервися 1С последовательность вложенных объектов (из 4х свойств каждый) находится на одном уровне с полями объекта. В первом же случае -- одно из полей имеет сложный тип, который является последовательностью объектов.
Теперь, собственно, вопрос: является ли это проблемой 1С? Если да, то как можно заставить 1С воспринимать сложные типы вида "Массив сложных типов"?
Также стоит упомянуть, что WSDL ссылка воспринимается 1С нормально и показывает верную структуру типов, а ошибка возникает именно при вызове метода, возвращающего такой объект. Для полной ясности, приведу также кусок ответа от сервера, в котором описывается этот объект:
<!--shcode--><pre><code class='xml'><return xsi:type='ns1:Oir_Module_Sync_Soap_Debug_Container'>
<field1 xsi:type='xsd:string'>Field 1 value</field1>
<field2 xsi:type='xsd:int'>32</field2>
<field3 xsi:type='xsd:float'>24.56</field3>
<field4 xsi:type='xsd:boolean'>false</field4>
<nestedObjects xsi:type='ns1:ArrayOfString'>
<item xsi:type='xsd:string'>string0</item>
<item xsi:type='xsd:string'>string1</item>
...
</nestedObjects>
</return>[/CODE]