gifts2017

1C8 + SOAP

Опубликовал Женька Ture (ture) в раздел Программирование - Практика программирования

1C8 + SOAP
Три способа работы из 1С с вебсервисами.

Обращение из 1С8 к вебсервисам можно делать разными способами.

Первое, что следует понимать, это то, что 1С посылает запросы (фактически это XML) файлы и получает ответы (обычно это так же XML, но не обязательно, т.к. программа вебпрограммиста отвечает так, как ей вздумается).

Работая с веб сервисом, придется обращаться к документации, которую написал вебразработчик, потому что без этого не получится подготовить адекватный запрос (XML). Примеры таких  запросов с разработчика можно требовать без всяких задних мыслей (ответом станет нечто вроде такого). Имея в руках пример, уже можно его опробовать (пощупать):

strЗапрос равен

< ? xml version="1.0" encoding="UTF-8" standalone="no" ? >

< SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"

                                    xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"  

                                    xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"

                                    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

             < SOAP-ENV:Body>

                           < GetAirportsList xmlns="http://webservices.belavia.by/">

                                   < Language xmlns:SOAPSDK4="http://webservices.belavia.by/">RU< / Language >

                           < / GetAirportsList>

             < / SOAP-ENV:Body >

< / SOAP-ENV:Envelope >

(c текстом XML пришлось повозиться, т.к. не отображался. В кусочках типа < / SOAP-ENV:Envelope > пробелы не нужны)

oXMLHTTP = Новый COMОбъект("MSXML2.XMLHTTP");

стрURL="http://86.57.245.235/TimeTable/Service.asmx?op=GetAirportsList";

oXMLHTTP.open("POST", стрURL, 0);

oXMLHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8");

oXMLHTTP.setRequestHeader("SOAPAction", "http://webservices.belavia.by/GetAirportsList");

oXMLHTTP.send(strЗапрос);

Если oXMLHTTP.Status=200 тогда

                xmlВыборкаAirport = oXMLHTTP.responseXML.SelectNodes("//Airport");

                Для чКК=1 По xmlВыборкаAirport.Length Цикл

                       xmlВеткаAirport = xmlВыборкаAirport.item(чКК-1);

                       спВыбора.Добавить(xmlВеткаAirport.getAttribute("IATA"),"["+xmlВеткаAirport.getAttribute("IATA")+"] "+ xmlВеткаAirport.getAttribute("Name"))

                КонецЦикла;

КонецЕсли;

Как не трудно заметить, для обращения к сервису используется объект MSXML2.XMLHTTP. И нету совсем упоминания о сепециальных механизмах. Этот способ отличается гибкостью.

 

Однако самостоятельное составление запроса (XML-файла) крайне лениво, и хочется как то упростить процесс. Для этого понадобится описание сервиса (к примеру, такое). Это описание потребует от нас некоторого осмысления, в результате которого получится следующий фрагмент:

SOAPN = Новый COMОбъект("MSSoap.SoapClient30");

SOAPN.MSSOAPInit("http://86.57.245.235/TimeTable/Service.asmx?WSDL","OnlineTimeTable", "OnlineTimeTableSoap");

comSafeArray=SOAPN.GetAirportsList("RU");

Для чК=comSafeArray.GetLowerBound(0) по comSafeArray.GetUpperBound(0) Цикл

                    элемент=comSafeArray.GetValue(чК);

                    Если элемент.Length=2 тогда

                              спВыбора.Добавить(элемент.item(0).value,"["+элемент.item(0).value+"] "+ элемент.item(1).value);

                    ИначеЕсли элемент.Length=1 тогда

                              спВыбора.Добавить(элемент.item(0).value,"["+элемент.item(0).value+"] ");

                    КонецЕсли;

КонецЦикла;

На этот раз использован объект MSSoap.SoapClient30. И как известно, он совсем сырой (или, по крайней мере, я не умею это варить). Сложные и путанные строки XML превратились в вызов comSafeArray=SOAPN.GetAirportsList("RU").

Однако 1С пошло на встречу своим верным "друзьям" и наделало разные объекты. Код на 1С8.2 похож на это:

WSОпределение = Новый WSОпределения("http://86.57.245.235/TimeTable/Service.asmx?WSDL");

Service = Новый WSПрокси(WSОпределение, "http://webservices.belavia.by/", "OnlineTimeTable", "OnlineTimeTableSoap" ); cписокXDTO=Service.GetAirportsList("RU").ПолучитьСписок("Airport");

ВсегоАэропортов=cписокXDTO.Количество();

Для чК=0 по ВсегоАэропортов-1 Цикл

          обАэропорт=cписокXDTO.Получить(чК);

          спВыбора.Добавить(обАэропорт.IATA,"["+обАэропорт.IATA+"] "+ обАэропорт.name);

КонецЦикла;

Можно даже положить в конфигурацию описание сервиса, и тогда первые две строки можно заменить на:

Service=WSСсылки.WSСсылка1.СоздатьWSПрокси("http://webservices.belavia.by/", "OnlineTimeTable", "OnlineTimeTableSoap" );


Вот так не хитро и не кривляясь можно работать с вебсервисами.



См. также

Подписаться Добавить вознаграждение

Комментарии

1. www2000 www2000 (www2000) 11.04.13 23:59
Soap3 - уже лучше не использовать, начиная с Вин 7 он уже не поддерживается и достать для него адекватную инсталяцию не получится

А так за обзор спасибо. Пока у себя использую первый подход с xml, так как он отлично работает в 7.7 тоже, пожтому можно спокойно переносить логику между платформами.
2. Данила Елистратов (CagoBHuK) 17.04.13 10:00
WS ссылки - тоже не лучший метод, т.к. не работают с сертификатами (только в 8.3). XMLHTTP - лучший выбор.
3. Рустам Атаи (ryst) 10.12.13 15:06
То, что сделано 1С "для друзей" полный отстой. Зачастую сервис успешно проходит тесты различными чекерами на валидность, а с 1С не работает. Не грузится wsdl или вылетают ошибки про обращении к методам сервиса.
В общем как обычно - сделали для галочки. Типа универсальная платформа. Отстой.
4. Алексей Белоусов (AllexSoft) 10.12.13 15:43
любая инфа по 1C8 + SOAP полезна, за статью однозначно +
А по поводу того что наваяло 1С, думаю должны доделать, ведь они активно развивают работу в модели сервиса, а там без SOAP никуда
5. program program (prodines) 08.04.15 11:48
Пока непонятно - а как составлять SOAP-запросы из клиента к веб-серверу 1С?
6. Женька Ture (ture) 10.04.15 16:33
(5) prodines, нужно добавлять ссылку на сервис по старому образцу (.Net 2.0). 1Ссы не торопится за инновациями совсем.
7. Алексей Чистов (Pertubator) 14.05.15 14:29
То, что 1с посылает запрос по SOAP расписано хорошо. Но можно ли отправить тоже запрос из сервера в 1С?
Например для получения списка сотрудников в ответ.
8. Николай Лапин (Turn123) 12.03.16 15:57
(7) Pertubator, Можно, любые методы синхронного обмена. К примеру ты посылаешь значение параметра и в зависимости от параметра возвращаются разные данные или делать два разных метода сервиса. Все зависит от конечной цели
9. Осипов Сергей (fixin) 17.05.16 15:00
хороший текст, но оформлен грязновато
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа