Имя: Пароль:
1C
1С v8
Web-сервисы 1С
0 PitNN
 
08.08.16
14:39
Добрый день, коллеги.
Подскажите, никак не могу разобраться. Нужно используя php передать в 1С массив данных используя web-сервисы. Создал XDTO-пакет, прописал в нем параметры. Создал web-сервис. В качестве одного из параметров указал созданный параметр XDTO-пакета. На php пишу:
$Mass = ['article' => '111',
          'brand' => 'xxx',
          'name' => 'cup',
          'reason' => 'отказ клиента',
          'comment' => 'шляпа полная'
          ];

$params_ = array(
'id_order' => 'your google key4',
'guid' => '3523523hg32j4',
'quantity' => 10.5,
'struct_params' => Array($Mass)
);

// Поcылка SOAP-запроса и получение результата
$result = $client->CreateReturn($params_);

В отладчике перехватываю вызов сервиса и вижу что заполнился только 'article', а остальные Неопределено.
Если передать два элемента массива, то в первом элементе заполнится 'article', а во втором 'brand':
[0]: article = 111; brand = Неопределено; name= Неопределено; reason = Неопределено; comment = Неопределено
[1]: article = Неопределено; brand = xxx; name= Неопределено; reason = Неопределено; comment = Неопределено

Подскажите, как правильно передать массив через web-сервис?
1 Fragster
 
гуру
08.08.16
14:42
в инициализации соединения проверь флаги. вот так работает:
http://pastebin.com/0afCH19y
2 Fragster
 
гуру
08.08.16
14:44
и да, в php, вроде array <> Array
3 PitNN
 
08.08.16
14:53
(1) Не прокатило. Передается только первый элемент массива.
(2) Ранозначно
4 Fragster
 
гуру
08.08.16
14:55
(3) а можно wsdl выложить куда-нибудь?
когда-то такие же грабли были, вроде как раз дело во флагах было. Но очень давно
5 PitNN
 
08.08.16
15:09
(4)
<code>
<?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://testo.ru";
        xmlns:xsd="http://www.w3.org/2001/XMLSchema";
        xmlns:xsd1="http://testo.ru";
        xmlns:xsd2="http://www.testo.ru";
        name="ExchangeBitrix"
        targetNamespace="http://testo.ru">;
    <types>
        <xs:schema xmlns:tns="http://www.testo.ru";
                xmlns:xs="http://www.w3.org/2001/XMLSchema";
                targetNamespace="http://www.testo.ru";
                attributeFormDefault="unqualified"
                elementFormDefault="qualified">
            <xs:complexType name="Params">
                <xs:choice>
                    <xs:element name="Param"
                            minOccurs="0"
                            maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:choice>
                                <xs:element name="article"
                                        type="xs:string"
                                        minOccurs="0"/>
                                <xs:element name="brand"
                                        type="xs:string"
                                        minOccurs="0"/>
                                <xs:element name="name"
                                        type="xs:string"
                                        minOccurs="0"/>
                                <xs:element name="reason"
                                        type="xs:string"
                                        minOccurs="0"/>
                                <xs:element name="comment"
                                        type="xs:string"
                                        minOccurs="0"/>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:choice>
            </xs:complexType>
            <xs:complexType name="StructParams">
                <xs:sequence>
                    <xs:element name="article"
                            type="xs:string"
                            nillable="true"/>
                    <xs:element name="brand"
                            type="xs:string"
                            nillable="true"/>
                    <xs:element name="name"
                            type="xs:string"
                            nillable="true"/>
                    <xs:element name="reason"
                            type="xs:string"
                            nillable="true"/>
                    <xs:element name="comment"
                            type="xs:string"
                            nillable="true"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
                xmlns:xs1="http://www.testo.ru";
                xmlns:xs2="http://testo.ru";
                targetNamespace="http://testo.ru";
                elementFormDefault="qualified">
            <xs:import namespace="http://www.testo.ru"/>;
            <xs:element name="GetStrHello">
                <xs:complexType>
                    <xs:sequence/>
                </xs:complexType>
            </xs:element>
            <xs:element name="GetStrHelloResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="return"
                                type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="CreateReturn">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="id_order"
                                type="xs:string"/>
                        <xs:element name="guid"
                                type="xs:string"/>
                        <xs:element name="quantity"
                                type="xs:float"/>
                        <xs:element name="struct_params"
                                type="xs1:Params"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="CreateReturnResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="return"
                                type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </types>
    <message name="GetStrHelloRequestMessage">
        <part name="parameters"
                element="tns:GetStrHello"/>
    </message>
    <message name="GetStrHelloResponseMessage">
        <part name="parameters"
                element="tns:GetStrHelloResponse"/>
    </message>
    <message name="CreateReturnRequestMessage">
        <part name="parameters"
                element="tns:CreateReturn"/>
    </message>
    <message name="CreateReturnResponseMessage">
        <part name="parameters"
                element="tns:CreateReturnResponse"/>
    </message>
    <portType name="ExchangeBitrixPortType">
        <operation name="GetStrHello">
            <input message="tns:GetStrHelloRequestMessage"/>
            <output message="tns:GetStrHelloResponseMessage"/>
        </operation>
        <operation name="CreateReturn">
            <input message="tns:CreateReturnRequestMessage"/>
            <output message="tns:CreateReturnResponseMessage"/>
        </operation>
    </portType>
    <binding name="ExchangeBitrixSoapBinding"
            type="tns:ExchangeBitrixPortType">
        <soapbind:binding style="document"
                transport="http://schemas.xmlsoap.org/soap/http"/>;
        <operation name="GetStrHello">
            <soapbind:operation style="document"
                    soapAction="http://testo.ru#ExchangeBitrix:GetStrHello"/>;
            <input>
                <soapbind:body use="literal"/>
            </input>
            <output>
                <soapbind:body use="literal"/>
            </output>
        </operation>
        <operation name="CreateReturn">
            <soapbind:operation style="document"
                    soapAction="http://testo.ru#ExchangeBitrix:CreateReturn"/>;
            <input>
                <soapbind:body use="literal"/>
            </input>
            <output>
                <soapbind:body use="literal"/>
            </output>
        </operation>
    </binding>
    <binding name="ExchangeBitrixSoap12Binding"
            type="tns:ExchangeBitrixPortType">
        <soap12bind:binding style="document"
                transport="http://schemas.xmlsoap.org/soap/http"/>;
        <operation name="GetStrHello">
            <soap12bind:operation style="document"
                    soapAction="http://testo.ru#ExchangeBitrix:GetStrHello"/>;
            <input>
                <soap12bind:body use="literal"/>
            </input>
            <output>
                <soap12bind:body use="literal"/>
            </output>
        </operation>
        <operation name="CreateReturn">
            <soap12bind:operation style="document"
                    soapAction="http://testo.ru#ExchangeBitrix:CreateReturn"/>;
            <input>
                <soap12bind:body use="literal"/>
            </input>
            <output>
                <soap12bind:body use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="ExchangeBitrix">
        <port name="ExchangeBitrixSoap"
                binding="tns:ExchangeBitrixSoapBinding">
            <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.10.111:81/test2/ws/obmen.1cws"/>;
        </port>
        <port name="ExchangeBitrixSoap12"
                binding="tns:ExchangeBitrixSoap12Binding">
            <soap12bind:address location="http://192.168.10.111:81/test2/ws/obmen.1cws"/>;
        </port>
    </service>
</definitions>
</code>
6 Fragster
 
гуру
08.08.16
15:09
(5) вот я не зря просил "куда-нибудь"...
7 PitNN
 
08.08.16
15:14
8 Fragster
 
гуру
08.08.16
15:18
если я правильно понял - то ты хочешь четвертым параметром передать массив, а в объявлении у тебя четвертый параметр - не массив.
тебе надо создать тип с одним полем и указать у него maxOccurs -1 и в него уже пихать массив
9 PitNN
 
08.08.16
15:24
(8) У меня так и сделано. Четвертый параметр ссылается на тип Params, который объявлен в XDTO и у него свойство Params с maxOccurs -1
10 PitNN
 
08.08.16
15:25
(9) ... и у него свойство Param с maxOccurs -1
11 Fragster
 
гуру
08.08.16
15:33
почему-то Params не как sequence, а как choice. попробуй в пакете XDTO не в типе Params у свойства добавлять вложенный тип, а указать у него тип (http://testo.ru)StructParams в окошке типов, чтобы он не был вложенным.
12 PitNN
 
08.08.16
16:01
(11) Не совсем понял что нужно сделать.
13 PitNN
 
08.08.16
16:05
(11) У меня сейчас вот так:
http://itmages.ru/image/view/4701219/a268c7eb
14 Fragster
 
гуру
08.08.16
16:06
как-то так:
http://pastebin.com/i6Ugetjg
15 Fragster
 
гуру
08.08.16
16:07
(13) у Param дали влоежнное определение типа и укажи тип (над "минимальное количество")
16 PitNN
 
08.08.16
16:14
(15) Вот так, я полагаю:
http://itmages.ru/image/view/4701280/81a5d320
17 PitNN
 
08.08.16
16:21
(14) УРА!!! Заработало!))) Спасибо огромное!)