Имя: Пароль:
1C
1С v8
Отправка документов через веб сервис
0 D_Sergeevich
 
01.05.13
14:38
Приветствую. Всех с наступающим.
Помоги разобраться с веб сервисом. Первый раз с ними сталкиваюсь.
Есть веб сервис банка, нужно через него скидывать электронные документы. Подключение к веб сервису я выполнил так:
Процедура ПодключениеКВебСервису()
   WSОпределение = Новый WSОпределения("https://dc_6/WebLoader/LoaderSrv.asmx?wsdl","fgrpmr","FeRr2fN");
   WSПрокси = Новый WSПрокси(WSОпределение,"http://tempuri.org/","LoaderSrv","LoaderSrvSoap");
   Фабрика = WSПрокси.ФабрикаXDTO;
КонецПроцедуры

Скрин отладчика на "WSПрокси", я добрался до методов через которые сбрасываются доки. Что делать дальше?
http://i5.pixs.ru/storage/9/7/7/otlJPG_1881867_7860977.jpg

Это описание этих методов веб сервиса
Методы
public long LoadReport(byte [] ReportData, string FileName,  out string ResultString)
предназначен для сброса форматного ОЭД (электронный документ)

 
Параметр    Тип            Описание
ReportData    IN Byte[]    Передаваемый ОЭД в виде массива байт. ОЭД должен быть зашифрован и подписан ЭЦП отправителя
FileName    IN string    Имя файла, соответствующего ОЭД
ResultString    OUT string    Описание ошибки в случае если метод вернул не ноль
//Метод возвращает ноль, если операция завершена успешно, код ошибки в противном случае
1 ДенисЧ
 
01.05.13
14:46
и в чём проблема?
2 D_Sergeevich
 
01.05.13
14:49
(1)Проблема в том что я не знаю че делать дальше, как Строку данных преобразовать в массив байт и потом этот массив передать
3 ДенисЧ
 
01.05.13
14:51
(2) ДвоичныеДанные пробовал пихать?
4 D_Sergeevich
 
01.05.13
14:54
Как?
5 ДенисЧ
 
01.05.13
14:56
(4) мммм.....
Записать в файл, создать ДвоичныеДанные из этого файла и пихнуть в параметры?

По крайней мере, в самописный ws у меня так зип пролетает на ура.
6 D_Sergeevich
 
01.05.13
14:59
Ну ладно, ну а далее как эти данные передать? можно плиз пример кода
7 yukon
 
01.05.13
15:29
> public long LoadReport(byte [] ReportData, string FileName,  out string ResultString)

Нет такого в веб-сервисах. Это они дали заголовок своего обработчика. А работаешь-ты с вэб-сервисом, а не с их программным кодом.

Ты лучше загрузи описание в Общие-WSСсылки и посмотри там типы параметров соответствующей операции.
8 D_Sergeevich
 
01.05.13
15:38
(7) Я добавлял WSСылку она появляется, но структура не загружается. т.е. там пусто....
9 yukon
 
01.05.13
15:42
(8) Скорее всего из-за авторизации не импортируется.

Зайди по ссылке "ht tps://dc_6/WebLoader/LoaderSrv.asmx?wsdl" с именем и паролем, сохрани содержимое на диск, затем в имени импортируемого WSDL укажи имя файла.
10 Нуф-Нуф
 
01.05.13
15:45
демобаза документооборота последнего релиза - ихмо отличный вариант потренироваться на кошках
11 D_Sergeevich
 
01.05.13
15:48
(9)Чет я не понял. Я жму wsсылки - добавить, задаю адрес "https://dc_6/WebLoader/LoaderSrv.asmx" просит логин и пас, ввожу и все ссылка добавляется, но в просмотре структуры нету. Какое содержимое сохранить на диск?
Да и еще если я ввожу так "https://dc_6/WebLoader/LoaderSrv.asmx?wsdl" то пишет неверный формат
12 D_Sergeevich
 
01.05.13
15:52
Если сохранить содержимое https://dc_6/WebLoader/LoaderSrv.asmx?wsdl в xml на диск и потом через импорт прописать путь до этого xml то тоже пишет неверный формат
13 yukon
 
01.05.13
15:54
(11) Какое содержимое сохранить на диск?

Кодовое слово - "https". Открой ссылку в браузере, затем жми "сохранить" или "сохранить страницу" или как там у тебя в браузере. По возможности задай расширение у файла .wsdl
14 yukon
 
01.05.13
15:56
(12) Значит там еще файлы нужны. Обычно это всякие xsd файлы.
15 D_Sergeevich
 
01.05.13
15:58
(11) Также пишет неверный формат
16 D_Sergeevich
 
01.05.13
15:58
т.е. (13) Также пишет неверный формат
17 yukon
 
01.05.13
16:02
Ладно попробуй так:


Определение = Новый WSОпределения(АдресWSDL,ИмяПользователя,Пароль);

Прокси = Новый WSПрокси(Определение,"http://tempuri.org/","LoaderSrv","LoaderSrvSoap");
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = Пароль;

ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);

ТекстОшибки = "";
Если Прокси.LoadReport(ДвоичныеДанные, ИмяФайла, ТекстОшибки) <> 0 Тогда
   ВызватьИсключение ТекстОшибки;
КонецЕсли;
18 D_Sergeevich
 
01.05.13
16:11
(17)Обращение к процедуре объекта как к функции (LoadReport)
19 yukon
 
01.05.13
16:18
(17) Значит все переписывать заново :)


ТекстОшибки = "";
Прокси.LoadReport(ДвоичныеДанные, ИмяФайла, ТекстОшибки);
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
   ВызватьИсключение ТекстОшибки;
КонецЕсли;
20 yukon
 
01.05.13
16:22
(18) и да - значит разработчики веб-сервиса продятлили - у метода приложения есть возвращаемый результат, а у соответствующего метода веб-сервиса нет. Можешь им в баг-репорт заслать.

Это как иллюстрация к (7) - реализации методов могут различаться, и тебе нужна только та реализация с которой ты непосредственно работаешь.
21 yukon
 
01.05.13
16:26
+ Точно баг. В твоем скриншоте:
Свойство: "Возвращаемое значение"
Тип: Неопределено
22 D_Sergeevich
 
01.05.13
16:34
Если так (19) То пишет что не достаточно параметров
Написал так т.к. их фактически 6 Прокси.LoadReport(ДвоичныеДанные, ИмяФайла,,,, ТекстОшибки);
И 1с сваливается полностью.
23 D_Sergeevich
 
01.05.13
16:35
У меня есть на с# клиент их который работает с этой службой, могу взять у них исходники после праздников, может там можно будит разобраться?
24 D_Sergeevich
 
01.05.13
16:37
А можно как то подключить к 1с этот клиент? Там тупо прописана папка где хранятся доки, и в клиенте одна копка отправить и все, больше там ничего нету. Этот клиент шифрует файл и отправляет его.
25 yukon
 
01.05.13
16:43
(22) > Прокси.LoadReport(ДвоичныеДанные, ИмяФайла,,,, ТекстОшибки)

Так ты фактически написал Прокси.LoadReport(ДвоичныеДанные, ИмяФайла,Неопределено,Неопределено,Неопределено, ТекстОшибки);

Нужно смотреть реальные типы параметров. К сожалению, на твоем скриншоте они не поместились. Ну и в документации должно же быть описано, что они означают. Походу у них документация "протухла".
26 D_Sergeevich
 
01.05.13
16:45
На скриншоте они как раз есть 0-5 в самом низу. А документации вообще нету. Эту службу писал чел, который уже не работает. ((
27 yukon
 
01.05.13
16:46
(26) Типы не поместились. Имя видно полностью, а тип "{www...".
28 D_Sergeevich
 
01.05.13
16:53
29 D_Sergeevich
 
01.05.13
16:54
Блин, 0 строка там {http://www.w3.org/2001/XMLSchema}base64Binary
30 yukon
 
01.05.13
16:57
(29) base64Binary - это и есть ДвоичныеДанные.
31 yukon
 
01.05.13
16:57
+ Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://www.w3.org/2001/XMLSchema}. Имя типа XDTO: может быть любым из перечисленных: base64Binary, hexBinary
32 yukon
 
01.05.13
17:00
(28) Ну так сделай


ТекстОшибки = "";
Formular = "";
DateString = "";
LoadnotFormat = 0;
ТекстОшибки = "";
Прокси.LoadReport(ДвоичныеДанные, ИмяФайла, Formular, DateString, LoadnotFormat, ТекстОшибки);
[1C/]
33 D_Sergeevich
 
01.05.13
17:07
(32) Неа, так 1с сваливается и не отвечает. Может из за того что данные не шифруются и не подписываются?
34 yukon
 
01.05.13
17:15
(33) Что значит сваливается? Выскакивает ошибка какая-то? Если нет, то это значит, что 1С ждет результат от сторонней системы, т.е. это уже не вопрос 1С.

Выставь для начала таймаут при создании прокси.

Прокси.Таймаут = 5;
35 D_Sergeevich
 
01.05.13
17:17
(34)Сваливается с ошибкой типа отправить в майкрософт и т.д.
36 yukon
 
01.05.13
17:18
(33) > Может из за того что данные не шифруются и не подписываются?

По идее для того чтобы тебе это сообщить есть ResultString, она же ТекстОшибки.
37 yukon
 
01.05.13
17:21
(35) А размер файла какой у тебя?
38 D_Sergeevich
 
01.05.13
17:23
(37) Да там одна строчка, всего 4кб.
39 yukon
 
01.05.13
17:30
(38) тогда остается только ошибка в WSDL описании. Тем более, что оно у тебя импортироваться не хочет.
40 D_Sergeevich
 
01.05.13
17:34
(39)А как же тогда клиент на си шарпе работает...
41 yukon
 
01.05.13
17:42
(40) Скажем так. 1С накладывает более строгие ограничения на описание WSDL, чем это требуется по стандарту. Поэтому валидный с т.ч. стандартов WSDL, может быть невалидным для 1С.

Выложи куда-нибудь wsdl, может чего можно подправить.
42 D_Sergeevich
 
01.05.13
17:46
<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://tempuri.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://tempuri.org/" xmlns="http://schemas.xmlsoap.org/wsdl/">
 <types>
   <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
     <s:import namespace="http://www.w3.org/2001/XMLSchema" />
     <s:element name="GetPayCard">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="date_of_move" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="GetPayCardResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="1" maxOccurs="1" name="GetPayCardResult" type="s:long" />
           <s:element minOccurs="0" maxOccurs="1" name="result" type="s:base64Binary" />
           <s:element minOccurs="0" maxOccurs="1" name="error_description" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="LoadNFReport">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="ReportData" type="s:base64Binary" />
           <s:element minOccurs="0" maxOccurs="1" name="FileName" type="s:string" />
           <s:element minOccurs="0" maxOccurs="1" name="Formular" type="s:string" />
           <s:element minOccurs="0" maxOccurs="1" name="DateString" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="LoadNFReportResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="1" maxOccurs="1" name="LoadNFReportResult" type="s:long" />
           <s:element minOccurs="0" maxOccurs="1" name="ResultString" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="LoadReport">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="ReportData" type="s:base64Binary" />
           <s:element minOccurs="0" maxOccurs="1" name="FileName" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="LoadReportResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="1" maxOccurs="1" name="LoadReportResult" type="s:long" />
           <s:element minOccurs="0" maxOccurs="1" name="ResultString" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="GetDocIds">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="filename" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="GetDocIdsResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="GetDocIdsResult">
             <s:complexType>
               <s:sequence>
                 <s:element ref="s:schema" />
                 <s:any />
               </s:sequence>
             </s:complexType>
           </s:element>
           <s:element minOccurs="0" maxOccurs="1" name="details" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="GetEdErrors">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="filename" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="GetEdErrorsResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="1" maxOccurs="1" name="GetEdErrorsResult" type="s:long" />
           <s:element minOccurs="0" maxOccurs="1" name="result" type="s:base64Binary" />
           <s:element minOccurs="0" maxOccurs="1" name="details" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="LoadNonFormatReport">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="ReportData" type="s:base64Binary" />
           <s:element minOccurs="0" maxOccurs="1" name="FileName" type="s:string" />
           <s:element minOccurs="0" maxOccurs="1" name="Formular" type="s:string" />
           <s:element minOccurs="0" maxOccurs="1" name="DateString" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="LoadNonFormatReportResponse">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="1" maxOccurs="1" name="LoadNonFormatReportResult" type="s:long" />
           <s:element minOccurs="0" maxOccurs="1" name="ResultString" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
   </s:schema>
 </types>
 <message name="GetPayCardSoapIn">
   <part name="parameters" element="s0:GetPayCard" />
 </message>
 <message name="GetPayCardSoapOut">
   <part name="parameters" element="s0:GetPayCardResponse" />
 </message>
 <message name="LoadNFReportSoapIn">
   <part name="parameters" element="s0:LoadNFReport" />
 </message>
 <message name="LoadNFReportSoapOut">
   <part name="parameters" element="s0:LoadNFReportResponse" />
 </message>
 <message name="LoadReportSoapIn">
   <part name="parameters" element="s0:LoadReport" />
 </message>
 <message name="LoadReportSoapOut">
   <part name="parameters" element="s0:LoadReportResponse" />
 </message>
 <message name="GetDocIdsSoapIn">
   <part name="parameters" element="s0:GetDocIds" />
 </message>
 <message name="GetDocIdsSoapOut">
   <part name="parameters" element="s0:GetDocIdsResponse" />
 </message>
 <message name="GetEdErrorsSoapIn">
   <part name="parameters" element="s0:GetEdErrors" />
 </message>
 <message name="GetEdErrorsSoapOut">
   <part name="parameters" element="s0:GetEdErrorsResponse" />
 </message>
 <message name="LoadNonFormatReportSoapIn">
   <part name="parameters" element="s0:LoadNonFormatReport" />
 </message>
 <message name="LoadNonFormatReportSoapOut">
   <part name="parameters" element="s0:LoadNonFormatReportResponse" />
 </message>
 <portType name="LoaderSrvSoap">
   <operation name="GetPayCard">
     <input message="s0:GetPayCardSoapIn" />
     <output message="s0:GetPayCardSoapOut" />
   </operation>
   <operation name="LoadNFReport">
     <input message="s0:LoadNFReportSoapIn" />
     <output message="s0:LoadNFReportSoapOut" />
   </operation>
   <operation name="LoadReport">
     <input message="s0:LoadReportSoapIn" />
     <output message="s0:LoadReportSoapOut" />
   </operation>
   <operation name="GetDocIds">
     <input message="s0:GetDocIdsSoapIn" />
     <output message="s0:GetDocIdsSoapOut" />
   </operation>
   <operation name="GetEdErrors">
     <input message="s0:GetEdErrorsSoapIn" />
     <output message="s0:GetEdErrorsSoapOut" />
   </operation>
   <operation name="LoadReport">
     <input name="LoadNonFormatReport" message="s0:LoadNonFormatReportSoapIn" />
     <output name="LoadNonFormatReport" message="s0:LoadNonFormatReportSoapOut" />
   </operation>
 </portType>
 <binding name="LoaderSrvSoap" type="s0:LoaderSrvSoap">
   <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
   <operation name="GetPayCard">
     <soap:operation soapAction="http://tempuri.org/GetPayCard" style="document" />
     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <soap:body use="literal" />
     </output>
   </operation>
   <operation name="LoadNFReport">
     <soap:operation soapAction="http://tempuri.org/LoadNFReport" style="document" />
     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <soap:body use="literal" />
     </output>
   </operation>
   <operation name="LoadReport">
     <soap:operation soapAction="http://tempuri.org/LoadReport" style="document" />
     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <soap:body use="literal" />
     </output>
   </operation>
   <operation name="GetDocIds">
     <soap:operation soapAction="http://tempuri.org/GetDocIds" style="document" />
     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <soap:body use="literal" />
     </output>
   </operation>
   <operation name="GetEdErrors">
     <soap:operation soapAction="http://tempuri.org/GetEdErrors" style="document" />
     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <soap:body use="literal" />
     </output>
   </operation>
   <operation name="LoadReport">
     <soap:operation soapAction="http://tempuri.org/LoadNonFormatReport" style="document" />
     <input name="LoadNonFormatReport">
       <soap:body use="literal" />
     </input>
     <output name="LoadNonFormatReport">
       <soap:body use="literal" />
     </output>
   </operation>
 </binding>
 <service name="LoaderSrv">
   <port name="LoaderSrvSoap" binding="s0:LoaderSrvSoap">
     <soap:address location="https://dc_6/WebLoader/LoaderSrv.asmx" />
   </port>
 </service>
</definitions>
43 yukon
 
01.05.13
18:45
Только метод LoadReport:


<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://tempuri.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://tempuri.org/" xmlns="http://schemas.xmlsoap.org/wsdl/">

 <types>
   <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
     <s:element name="LoadReport">
       <s:complexType>
         <s:sequence>
           <s:element name="ReportData" type="s:base64Binary" />
           <s:element name="FileName" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
     <s:element name="LoadReportResponse">
       <s:complexType>
         <s:sequence>
           <s:element name="LoadReportResult" type="s:long" />
           <s:element name="ResultString" type="s:string" />
         </s:sequence>
       </s:complexType>
     </s:element>
   </s:schema>
 
 </types>
 <message name="LoadReportSoapIn">
   <part name="parameters" element="s0:LoadReport" />
 </message>
 <message name="LoadReportSoapOut">
   <part name="parameters" element="s0:LoadReportResponse" />
 </message>
 <portType name="LoaderSrvSoap">
   <operation name="LoadReport">
     <input message="s0:LoadReportSoapIn" />
     <output message="s0:LoadReportSoapOut" />
   </operation>
 </portType>
 <binding name="LoaderSrvSoap" type="s0:LoaderSrvSoap">
   <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />

   <operation name="LoadReport">
     <soap:operation soapAction="http://tempuri.org/LoadReport" style="document" />

     <input>
       <soap:body use="literal" />
     </input>
     <output>
       <soap:body use="literal" />
     </output>
   </operation>
 </binding>
 
 <service name="LoaderSrv">
   <port name="LoaderSrvSoap" binding="s0:LoaderSrvSoap">
     <soap:address location="https://dc_6/WebLoader/LoaderSrv.asmx" />
    </port>
 </service>
</definitions>
[1C/]
44 yukon
 
01.05.13
18:53
получается в итоге:

LoadReport(
{http://www.w3.org/2001/XMLSchema}base64Binary ReportData,
{http://www.w3.org/2001/XMLSchema}string FileName,
{http://www.w3.org/2001/XMLSchema}long LoadReportResult,
{http://www.w3.org/2001/XMLSchema}string ResultString)

или
{http://www.w3.org/2001/XMLSchema}long LoadReport(
{http://www.w3.org/2001/XMLSchema}base64Binary ReportData,
{http://www.w3.org/2001/XMLSchema}string FileName,
{http://www.w3.org/2001/XMLSchema}string ResultString)

Соответственно вызовы:
Результат = Прокси.LoadReport(ДвоичныеДанные, ИмяФайла, ТекстОшибки);
либо
Прокси.LoadReport(ДвоичныеДанные, ИмяФайла, Результат, ТекстОшибки);
45 D_Sergeevich
 
01.05.13
19:13
(43)(44) Блин афигеть, заработало. Теперь LoadReportResult выдал -5. Значит файл отправляется. Теперь встает вопрос как сюда прикрутить криптомодуль, которым будут шифроваться данные
46 D_Sergeevich
 
01.05.13
19:29
Криптомодуль состоит из десятка dll которые регистрируются в системе и твик реестра в котором одна ветка с путями на публичные и секретные ключи.
Можно ли использовать из 1с crypto.dll?
47 D_Sergeevich
 
01.05.13
19:41
(44)yukon Огромное спасибо за помощь! ))
48 yukon
 
01.05.13
20:18
(46) > Можно ли использовать из 1с crypto.dll?

Таких crypto.dll - куча. Надо понимать какой именно, хотя бы автора.

Ну а использовать - либо через МенеджерКриптографии - если crypto.dll в Windows распознается как провайдер криптографии, либо через COMОбъект.