Готовим Soap для Web-сервисов. Рецепты

26.12.18

Интеграция - WEB-интеграция

В статье описаны различные варианты обмена данными с web-сервисами по протоколу Soap, основанные на личном опыте.

Disclaimer: Статей на эту тему написано очень много и, как вы, конечно, догадались, это очередная. Возможно, вы узнаете из неё что-то новое, но ничего сверхсекретного, что нельзя было бы нагуглить самостоятельно, здесь не описано. Только заметки из личного опыта.

Вступление

Рассматривать будем только ситуацию, когда есть сторонний web-сервис и стоит задача наладить обмен данными.

Строение сервиса описывается в файле WSDL (англ. Web Services Description Language)

Файл чаще всего доступен по ссылке, где находится точка входа в сам web-сервис. Я написал «чаще всего», так как бывают исключения. Например, Web-сервис на базе SAP не публикует wsdl и его можно получить только выгрузив из самого приложения.

И так, у нас есть описание web-сервиса, логин, пароль. Давайте подключимся.

// Определяем настройки

URLПространстваИменСервиса = "http://Somesite.ru";
ИмяПользователя = "TestUser";
Пароль = "q1w2e3";
МестоположениеWSDL = "https://Somesite.ru/WebService/Some?wsdl";
ИмяСервиса = "SomeServiceName";
ИмяТочкиПодключения = "SomeService_Port";

// Создаем подключение

SSL = Новый ЗащищенноеСоединениеOpenSSL();
WSОпределение = Новый WSОпределения(МестоположениеWSDL,,,,,SSL);
WSПрокси = Новый WSПрокси(WSОпределение, URLПространстваИменСервиса, ИмяСервиса, ИмяТочкиПодключения,,,SSL);
WSПрокси.Пользователь = ИмяПользователя;
WSПрокси.Пароль = Пароль;

Отлично! Мы подключились к web-сервису! По идее это основа любого варианта обмена, так как позволяет создавать объект структуры данных на основании wsdl, а работать с таким объектом одно удовольствие.

Рассмотрим XML который нам выдает SoapUI

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:som="http://Somesite.ru">
    <soapenv:Header/>
    <soapenv:Body>
        <som:SUBMISSION>
            <som:ID>357</som:ID>
            <som:CUSTOMER>
                <som:CLIENT_ID>121212</som:CLIENT_ID>
                <som:SEX>M</som:SEX>
                <som:CLIENT_BIRTHDAY>19900111</som:CLIENT_BIRTHDAY>
                <som:CARS>
                    <som:CLASS>Mercedes</som:CLASS>
                    <som:MODEL>GLS</som:MODEL>
                </som:CARS>
                <som:CARS>
                    <som:CLASS>Audi</som:CLASS>
                    <som:MODEL>TT</som:MODEL>
                </som:CARS>
            </som:CUSTOMER>
        </som:SUBMISSION>
    </soapenv:Body>
</soapenv:Envelope>

 Теперь опишем его программно

// Создаем объект и наполняем его данными

СвояФабрикаXDTO = WSОпределение.ФабрикаXDTO;

КорневойТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "SUBMISSION");
КорневойОбъект = СвояФабрикаXDTO.Создать(КорневойТип);

КорневойОбъект.ID = "4356";

КлиентТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "CUSTOMER");
КлиентОбъект = СвояФабрикаXDTO.Создать(КлиентТип);

КлиентОбъект.CLIENT_ID = "121212";
КлиентОбъект.SEX = "M"; // F - женский, M - мужской
КлиентОбъект.CLIENT_BIRTHDAY = "19900111";

// Автомобили клиента

АвтоТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "CARS");

АвтоОбъект = СвояФабрикаXDTO.Создать(АвтоТип);
АвтоОбъект.CLASS = "Mercedes";
АвтоОбъект.MODEL = "GLS";

КлиентОбъект.CARS.Добавить(АвтоОбъект);

АвтоОбъект = СвояФабрикаXDTO.Создать(АвтоТип);
АвтоОбъект.CLASS = "Audi";
АвтоОбъект.MODEL = "TT";

КлиентОбъект.CARS.Добавить(АвтоОбъект);

КорневойОбъект.CUSTOMER.Добавить(КлиентОбъект);

Данные успешно заполнены. Теперь нужно их отправить.

В этот самый момент и возникает множество нюансов. Попробуем рассмотреть каждый.

 

Рецепт 1. Отправляем XDTO-объект целиком

Результат = WSПрокси.AddCustomers(КорневойОбъект);

Остается лишь обработать результат, который нам вернул сервис и на этом всё. Согласитесь, что это очень удобно!

Но на практике не всегда бывает так. Например 1с не ладит с префиксацией определенных тэгов внутри xml, когда пространство имен корнеового тэга отличается от пространства дочерних. В таких случаях приходится собирать soap вручную. Так же приходилось сталкиваться с web-сервисами, которые в качестве параметра ждут xml в чистом виде. Маразм, но все же делается это не слишком сложно.

 

Рецепт 2. Отправляем чистый xml в качестве параметра

ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);
МойXML = Новый ЗаписьXML;
МойXML.УстановитьСтроку(ПараметрыЗаписиXML);
МойXML.ЗаписатьОбъявлениеXML();

СвояФабрикаXDTO.ЗаписатьXML(МойXML, КорневойОбъект);

СтрокаXML = МойXML.Закрыть();

Если УдалитьОписаниеПространстваИмен Тогда
    Попытка
        ПервыйТэгВСтроке = СтрПолучитьСтроку(СтрокаXML,2);
        ИмяКорневогоТэга = КорневойОбъект.Тип().Имя;
        СтрокаXML = СтрЗаменить(СтрокаXML, ПервыйТэгВСтроке, "<"+ИмяКорневогоТэга+">");
    Исключение
        //ОписаниеОшибки()
    КонецПопытки;
КонецЕсли;

Результат = WSПрокси.AddCustomers(СтрокаXML);

Если не удалять пространство имен, которое 1с добавляет по умолчанию, то стало больше всего на 5 строк кода. Чаще всего я заворачиваю преобразование xml в функцию, так как обычно вызываем более одного метода.

 

Рецепт 3. Отправляем через нативный HTTPЗапрос.

СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns=""http://Somesite.ru"">
| <soapenv:Header/>
| <soapenv:Body>
|"
+СтрокаXML+
"
| </soapenv:Body>
|</soapenv:Envelope>";

// Описываем заголовки HTTP-запроса

Заголовки = Новый Соответствие;

Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
Заголовки.Вставить("SOAPAction", "http://sap.com/xi/WebService/soap1.1");
Заголовки.Вставить("Authorization", "Basic "+ПолучитьBase64ЗаголовокАвторизации(ИмяПользователя, Пароль));

// ВНИМАНИЕ!!!
// Нельзя заполнять программно следующие заголовки, так как это приводит к ошибке
// Платформа сама правильно их заполнит
//Заголовки.Вставить("Accept-Encoding", "gzip,deflate");
//Заголовки.Вставить("Content-Length", Формат(СтрДлина(СтрокаSOAP),"ЧГ=")); // длина сообщения
//Заголовки.Вставить("Host", "Somesite.ru:8001");
//Заголовки.Вставить("Connection", "Keep-Alive");
//Заголовки.Вставить("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)");


// Подключаемся к сайту.

Соединение = Новый HTTPСоединение("Somesite.ru/WebService/Some",,ИмяПользователя, Пароль,,,SSL, Ложь); // Адрес должен быть без https://

// Получаем текст корневой страницы через POST-запрос.

HTTPЗапрос = Новый HTTPЗапрос("/GetCustomer", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаSOAP);

Результат = Соединение.ВызватьHTTPМетод("POST", HTTPЗапрос);

В этом варианте нам придется собрать soap вручную. По сути мы просто оборачиваем xml из рецепта 2 в оболочку soap, где в зависимости от требований web-сервиса мы можем менять наш soap как душе угодно.

Далее описываем заголовки согласно документации. Некоторые сервисы спокойно прожуют наш запрос и без заголовков, тут надо смотреть конкретный случай. Если вы не знаете какие заголовки прописывать, то самый простой способ это подглядеть запрос в SoapUI переключившись во вкладку RAW.

Функция получения Base64 строки выглядит так (подсмотрел здесь):

Функция ПолучитьBase64ЗаголовокАвторизации(ИмяПользователя, Пароль)

    КодировкаФайла = КодировкаТекста.UTF8;
    ВременныйФайл = ПолучитьИмяВременногоФайла();
    Запись = Новый ЗаписьТекста(ВременныйФайл, КодировкаФайла);
    Запись.Записать(ИмяПользователя+":"+Пароль);
    Запись.Закрыть();

    ДвДанные = Новый ДвоичныеДанные(ВременныйФайл);
    Результат = Base64Строка(ДвДанные);
    УдалитьФайлы(ВременныйФайл);

    Результат = Сред(Результат,5);

    Возврат Результат;

КонецФункции

Есть важный момент. При работе с HTTPСоединение указывайте адрес без указания протоколов «http://» и «https://», иначе рискуете потратить время на поиск не очевидной ошибки.

Рецепт 4. Отправляем через WinHttpRequest

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

WinHttp.Option(2,"UTF-8");
WinHttp.Option(4, 13056); //intSslErrorIgnoreFlag
WinHttp.Option(6, true); //blnEnableRedirects
WinHttp.Option(12, true); //blnEnableHttpsToHttpRedirects

WinHttp.Open("POST", "https://Somesite.ru/WebService/Some/GetCustomer", 0);
WinHttp.SetRequestHeader("Content-type", "text/xml");
WinHttp.SetCredentials(ИмяПользователя, Пароль, 0);

WinHttp.Send(СтрокаSOAP);
WinHttp.WaitForResponse(15);

XMLОтвет = WinHttp.ResponseText();

Здесь по сути тоже самое, что и в предыдущем варианте, но работаем с COMОбъектом. Строку соединения указываем полностью, вместе с протоколом. Особое внимание следует уделить только флагам игнорирования ошибок SSL-сертификатов. Они нужны, если мы работаем по SSL, но без определенного сертификата, так как создать новое защищенное соединение в таком варианте не предоставляется возможным (или я не умею как). В остальном механизм схож с предыдущим.

Так же помимо "WinHttp.WinHttpRequest.5.1" можно использовать "Microsoft.XMLHTTP", "Msxml2.XMLHTTP", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.6.0", если вдруг не взлетит на WinHttp. Методы практически такие же, только количество параметров другое. Подозреваю, что один из этих вариантов и зашит внутри объекта 1c HTTPЗапрос.

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

 

Обработка результата

В рецепте 1 мы чаще всего получаем готовый XDTO-объект и работаем с ним как со структурой. Во всех остальных случаях можно преобразовывать xml-ответ в XDTO

Если Результат.КодСостояния = 200 Тогда

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
ОбъектОтвет = СвояФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Сообщить(ОбъектОтвет.Body.Response.RESPONSE_ID);
Сообщить(ОбъектОтвет.Body.Response.RESPONSE_TEXT);

КонецЕсли; 

Тут все просто.

 

Вместо заключения

1. Начинайте работу с web-сервисами с программы SoapUI. Она предназначена для таких работ и позволит быстрее понять как работает тот или иной сервис. Для освоения есть статья про SoapUI.

2. Если вы обмениваете с сервисом по незащищенному каналу http и возникает вопрос в том что именно отправляет 1с в своих сообщениях, то можно воспользоваться снифферами трафика такими как Wireshark, Fiddler, и другие. Проблема возникнет только если используете ssl-соединение.

3. Если все же web-сервис общается по https, то ставим на удаленной машине (любой, главное не на своей) сервер Nginx, к которому мы и будем обращаться, а он в свою очередь запакует все в https и перешлет куда нужно (reverse proxy) и в стандартный конфиг добавляем:

server {
    listen 0.0.0.0:8080;
    server_name MyServer;
    location ~ .* {
        proxy_pass https://Somesite.ru:8001;
        proxy_set_header Host $host;
        proxy_set_header Authorization "Basic <base64 ваш пароль:логин>";
        proxy_pass_header Authorization;
    }
}

4. Если вас пугает XDTO, то рекомендую ознакомится с циклом статей злого бобра Андрея XDTO - это просто.

5. Если аутентификация предполагает использование Cookie, то нашлась следующая статья.

 

P.S. Если у вас появились вопросы, предложения по улучшению кода, есть собственные рецепты, отличные от описанных, вы нашли ошибки или считаете, что автор "ниправ" и ему "не место в 1с", то пишите комментарии, и мы все обсудим.

 

UPD:
1. Добавил по просьбе join2us XML, который выдавал SoapUI
2. Исправил ошибки найденные пользователем VasilVtoroy

Web-сервисы SOAP XDTO HTTPЗапрос

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15745    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17548    6    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16358    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25737    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88579    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. unichkin 1559 28.12.17 19:03 Сейчас в теме
Через Altova XML spy еще удобно тестить, она и поживее чем Soap UI. Интерфейс такой не дает конечно) Но на практике обычно надо было посылать готовый запрос, а не вбивать его вручную.
2. CSiER 35 29.12.17 16:37 Сейчас в теме
2. Если вы обмениваете с сервисом по незащищенному каналу http и возникает вопрос в том что именно отправляет 1с в своих сообщениях, то можно воспользоваться сниферами трафика такими как Wireshark, Fiddler, и другие. Проблема возникнет только если используете ssl-соединение.
, fiddler - очень удобно, можно работать и с ssl/tls (Tools-Options-HTTPS), а вот Wireshark для этой задачи не так удобен.
spectre1978; +1 Ответить
3. dmpas 417 30.12.17 17:20 Сейчас в теме
(0)
Например 1с не ладит с префиксацией определенных тэгов внутри xml, когда пространство имен корнеового тэга отличается от пространства дочерних.


вот на этом месте можно подробнее? И желательно с примерами, если вдруг остались под рукой.
4. 987ww765 306 09.01.18 09:10 Сейчас в теме
(3) Да. Веб-сервис ждет на входе xml следующего вида:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cus="http://SomeSite.org/customer">
	<soapenv:Header/>
	<soapenv:Body>
		<cus:CustomerCore>
 			<ID>357</ID>
 			<CUSTOMER>
  				<CLIENT_ID>222</CLIENT_ID>
    				<SEX>M</SEX>
  				<CLIENT_TYPE>P</CLIENT_TYPE>
  				<CLIENT_BIRTHDAY>19800101</CLIENT_BIRTHDAY>
				...
 			</CUSTOMER>
		</cus:CustomerCore>
	</soapenv:Body>
</soapenv:Envelope>
Показать


Обратите внимание на префикс cus в версии от SoapUI

И теперь вариант от 1с:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<CustomerCore xmlns="http://SomeSite.org/customer" xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
			<ID>357</ID>
 			<CUSTOMER>
 				<CLIENT_ID>222</CLIENT_ID>
  				<SEX>M</SEX>
 				<CLIENT_TYPE>P</CLIENT_TYPE>
				<CLIENT_BIRTHDAY>19800101</CLIENT_BIRTHDAY>
				...
 			</CUSTOMER>
		</CustomerCore>
	</soapenv:Body>
</soapenv:Envelope>
Показать


т.е. Пространство имен "http://SomeSite.org/customer" должно распространяться только на элемент CustomerCore, а не на всю ветку.
5. dmpas 417 09.01.18 10:45 Сейчас в теме
(4) Ну, это вообще косяк принимающей стороны, ибо эти два XML равнозначны по своей сути. И 1С тут нисколько не лукавит, создавая такой запрос.
DJ_Codebase; +1 Ответить
6. 987ww765 306 09.01.18 11:38 Сейчас в теме
(5) Согласен, но изменить принимающую сторону бывает невозможно и приходится подстраиваться. К тому же SoapUI интерпретировал WSDL ровно так, как того ждал принимающий веб-сервис
N!ghtmare; +1 Ответить
7. dmpas 417 09.01.18 11:53 Сейчас в теме
(6)
и приходится подстраиваться

с этим не поспоришь.

Но лучше обойтись штатными способами:
вместо
СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns=""http://Somesite.ru"">
| <soapenv:Header/>
| <soapenv:Body>
|"
+СтрокаXML+
"
| </soapenv:Body>
|</soapenv:Envelope>   "; // 3 пробела в конце обязательно!!!!
Показать


сделать честные ЗаписатьНачалоЭлемента("Envelope"); Потом ЗаписатьСоответствиеПространствИмен("cus", "http://SomeSite.org/customer");

и уже потом в эту же запись XML записать фабрикой необходимый объект. Потом закрыть запись и добавить три пробела, если уж принимающая сторона настолько упорота.

Всё же, пилить XML текстом - неблагодарное дело.
VasilVtoroy; +1 Ответить
8. 987ww765 306 09.01.18 12:18 Сейчас в теме
(7) Но это же тоже самое. Строку xml я формирую не сам, а получаю из фабрики. Опять же, не претендую на правду в последней инстанции.
9. dmpas 417 09.01.18 12:21 Сейчас в теме
(8) я про разделы Envelope и Body. Если их записать штатными средствами платформы и в них же туда прописать соответствие пространств имён с нужным префиксом, то фабрика при записи объекта уже не будет совать xmlns, так как он уже будет не нужен.
10. 987ww765 306 09.01.18 15:06 Сейчас в теме
(9) Видимо я не понял суть решения. То есть создаем объект ЗаписьXML, прописываем Envelope, Body. Отлично. Как потом дружим их с фабрикой?
11. dmpas 417 09.01.18 15:45 Сейчас в теме
(10) точно так же:

СвояФабрикаXDTO.ЗаписатьXML(МойXML, КорневойОбъект);


где перед этим кодом запись начал элементов Envelope и Body с указанием пространств имён, а после этого конца, соответственно, закрытие элементов Body и Envelope.
crismar24; +1 Ответить
20. nikolayvg 23 13.07.18 10:41 Сейчас в теме
(4)Здравствуйте. Вопрос не по теме, но относительно вашего комментария.
Я создаю WSПрокси, заполняю параметры и вызываю метод GetReferenceData.

СервисЭП = WSСсылки.cse.СоздатьWSПрокси("http://www.cargo3.ru", "WebService", "WebServiceSoap");
	
	
	ТипWSПараметра1 = СервисЭП.ФабрикаXDTO.Пакеты.Получить("http://www.cargo3.ru").Получить("Element");//GetReferenceData");
	WSПараметр1 = СервисЭП.ФабрикаXDTO.Создать(ТипWSПараметра1);
	WSПараметр1.Key	= "Reference";
	WSПараметр1.ValueType	= "string";
	WSПараметр1.Value	= "Currencies";
	
	
	ТипWSПараметра = СервисЭП.ФабрикаXDTO.Пакеты.Получить("http://www.cargo3.ru").Получить("Element");//GetReferenceData");
	WSПараметр	   = СервисЭП.ФабрикаXDTO.Создать(ТипWSПараметра);
	WSПараметр.Key	= "parameters";
	WSПараметр.List.Добавить(WSПараметр1);
	
	Данные = СервисЭП.GetReferenceData(Логин, Пароль, WSПараметр);
Показать


Каким образом я могу сначала посмотреть xml запрос, который отправляется? Просто возникает ошибка, а отладить не получается.
21. 987ww765 306 17.07.18 10:00 Сейчас в теме
(20) Можно преобразовать обратно из фабрики в XML

	
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку(Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина));
	МойXML.ЗаписатьОбъявлениеXML();
	
	СервисЭП.ФабрикаXDTO.ЗаписатьXML(МойXML, WSПараметр); 
	
	СтрокаXML = МойXML.Закрыть();
Показать


Но лучше всего воспользоваться сниферами типа Fiddler, Wireshark и т.д. Такой метод будет более точным.
nikolayvg; +1 Ответить
22. nikolayvg 23 18.07.18 06:10 Сейчас в теме
(21) Спасибо. Fiddler помог. Нашел единственное отличие. Почему-то 1С не формирует тег <soap:Header/>.
Должно быть
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
<m:GetReferenceData xmlns:m="http://www.cargo3.ru">
а у меня
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:GetReferenceData xmlns:m="http://www.cargo3.ru">
где искать причины?
23. 987ww765 306 20.07.18 15:00 Сейчас в теме
(22) Это заголовки. Я не знаю как насильно прописать заголовок в XML при работе с фабрикой. Вообще по идее он никак не должен влиять на поведение системы. Уверены, что наличие <soap:Header/> изменит ситуацию?
12. jaroslav.h 180 27.01.18 22:01 Сейчас в теме
Есть веб сервис который на вход принимает ID, KEY (string)

Смотрю через SoapUI структура

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:api2="http:/name/Api20" xmlns:int="http://name/integration20">
<soap:Header/>
<soap:Body>
<api2:AllCatalog>
<api2:AllCatalogRequest>
<int:Auth>
<int:ID></int:ID>
<int:KEY></int:KEY>
</int:Auth>
</api2:AllCatalogRequest>
</api2:AllCatalog>
</soap:Body>
</soap:Envelope>
Показать


как данную структуру описать из 1С?
13. 987ww765 306 30.01.18 08:10 Сейчас в теме
(12) Сейчас 1с неправильно формирует? Раз через SoapUI работаете, то описание веб сервиса (wsdl) у вас есть. Попробуйте так как описано в статье (Вступление и рецепт 1). У вас соответственно будет вот так:

// Создаем объект и наполняем его данными

СвояФабрикаXDTO = WSОпределение.ФабрикаXDTO;

КорневойТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "AllCatalog");
КорневойОбъект = СвояФабрикаXDTO.Создать(КорневойТип);

ЗапросСправочниковТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "AllCatalogRequest");
ЗапросСправочниковОбъект = СвояФабрикаXDTO.Создать(ЗапросСправочниковТип );

АвторизацияТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "Auth");
АвторизацияОбъект = СвояФабрикаXDTO.Создать(АвторизацияТип );

АвторизацияОбъект.ID = "121212";
АвторизацияОбъект.KEY= "**********";

ЗапросСправочниковОбъект.Auth = АвторизацияОбъект;
КорневойОбъект.AllCatalogRequest = ЗапросСправочниковОбъект;

Показать
eeeio; jaroslav.h; +2 Ответить
14. jaroslav.h 180 30.01.18 08:54 Сейчас в теме
15. VasilVtoroy 30.01.18 18:52 Сейчас в теме
1) Content-Length устанавливать не надо.
Платформа сама его правильно посчитает (в отличие от приведенного кода)


2) Fiddler тоже позволяет перехватывать защищенные http-соединения

3) Заголовок Host тоже не надо устанавливать

4) Basic-авторизацию можно делать не вручную, а задав в HTTPСоединения свойства логин и пароль.
Таким образом вы и Windows аутентификацию можете делать.

5) Accept-Encoding устанавливать просто нельзя, платформа не поддерживает сжатие HTTP!
16. 987ww765 306 31.01.18 07:59 Сейчас в теме
(15) Заголовки я не сам придумал. Это было одним из требованием принимающей стороны. По поводу Fiddler`а согласен, но я поздно узнал, что он умеет перехватывать https.
17. VasilVtoroy 31.01.18 15:11 Сейчас в теме
(16) Я же не говорю, что он не нужны.
Но пункты (1) и (3) платформа формирует сама, и более правильно

По пункту (4) - тоже самое можно сделать проще

По пункту (5) - такого требования точно быть не могло. Если бы на другой стороне был сервер с поддержкой сжатия, то вы бы получили чушь вместо ответа
18. almas 254 16.03.18 09:50 Сейчас в теме
Спасибо, за информацию. Статья очень помогла для настройки подключения к SilverDat.
19. 987ww765 306 21.03.18 09:54 Сейчас в теме
(18) Это здорово. Были какие-то особенности при настройке обмена?
24. join2us 15 21.12.18 23:37 Сейчас в теме
Отлично! Мы подключились к web-сервису! По идее это основа любого варианта обмена, так как позволяет создавать объект структуры данных на основании wsdl, а работать с таким объектом одно удовольствие.

// Создаем объект и наполняем его данными


Вот честное слово! Автор, если бы Вы перед созданием объекта в 1С привели пример хмл из SoapUI - нубам было бы в разы проще усвоить корректный синтаксис...

ЗЫ: в любом случае, спасибо за инфо
25. 987ww765 306 26.12.18 07:49 Сейчас в теме
(24) Вы правы. Мое упущение. Сомневаюсь, что найду эту xml, но попробую сделать аналог, чтобы было понятнее.
26. Dorosh 176 28.12.18 17:29 Сейчас в теме
SoapUI хорошая тулза, но с неприятным для нашей работы недостатком. Она не переваривает кириллицу, ни в запросах ни в ответах ни в авторизации.
27. 987ww765 306 29.12.18 07:31 Сейчас в теме
(26) Может вы пробовали старую версию? Сейчас она прекрасно переваривает в любых направлениях
28. ildar_muh 15.03.20 08:22 Сейчас в теме
Здравствуйте!
Дело в том, что есть такая же проблема с отправкой такого же случая, которую вы описывали, типа "<soapenv:Header/>
<soapenv:Body>" и тд
Дело в том, что почему-то не получается отправить просто xml текст (1с выдает ошибку, даже отправлять не желает), а только ОбъектXDTO. Скажите, можно ли это как-то исправить?
Заранее спасибо!
29. 987ww765 306 16.03.20 09:37 Сейчас в теме
(28) Пришлите код и текст ошибки. Попробую помочь. Можно и в личку.
30. user817897 2 10.03.23 12:09 Сейчас в теме
(29)
Добрый день. Подскажите пожалуйста, когда в параметре лежит тип: "SearchSubstLevel", тип указал ниже, вижу что это фасеты. Но как в параметр правильно его выбрать? сколько не выбираю, ругается что ошибка. Выбираю фасет "All". Очень нужен ответ)

	ТипWSsubstLevel =     СвояФабрикаXDTO.Тип("http://tempuri.org/", "SearchSubstLevel").Фасеты.Получить(1);    
	ТипОбъектаFind.substLevel = ТипWSsubstLevel.Значение;
Прикрепленные файлы:
31. wmonref1 30.05.23 17:12 Сейчас в теме
Подскажите, пожалуйста как подписать XML сертификатом *cer или *pfx установленном на сервере?
Спасибо!
Оставьте свое сообщение