Вариант реализации клиента SOAP на примере получения остатков из MERLION
1C-admin
14.11.2019
В статье приведу пример клиента к сервису SOAP, функции которого принимают несколько значений типа строка или массив строк.
Порядок работы:
1. Подключаем wsdl
2. Получаем основной вариант отгрузки
3. Получаем ближайшую дату отгрузки
4. Получаем данные по остаткам
Вариант получения и фиксации данных в 1С выходит за рамки данной статьи.
Подключаем wsdl
Каждое создание "Новый WSОпределения(Server);" загружает WSDL схему, поэтому лучше подключить один раз и дальше переиспользовать.
Перем Отказ, СоответствиеWSПараметры;
Процедура ЗаполнитьСоответствиеWSПараметры()
СоответствиеWSПараметры = Новый Соответствие;
СоответствиеWSПараметры.Вставить("mlservice3", ПолучитьПараметрыWS_Служебный());
КонецПроцедуры
Функция ПолучитьПараметрыWS_Служебный()
Если Тест Тогда
Server = "https://apitest.merlion.com/rl/mlservice3?wsdl";
Иначе
Server = "https://api.merlion.com/rl/mlservice3?wsdl";
КонецЕсли;
ssl4 = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
WSОпределение = Новый WSОпределения(Server);
Сервис = WSОпределение.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];
Операции = ТочкаПодключения.Интерфейс.Операции[0];
Прокси = Новый WSПрокси(WSОпределение, Сервис.URIПространстваИмен, Сервис.Имя, ТочкаПодключения.Имя,,,ssl4);
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = Пароль;
Фабрика = Прокси.ФабрикаXDTO;
Пакеты = Фабрика.Пакеты.Получить(Сервис.URIПространстваИмен);
WSПараметры = Новый Структура;
WSПараметры.Вставить("Прокси", Прокси);
WSПараметры.Вставить("Фабрика", Фабрика);
WSПараметры.Вставить("Пакеты", Пакеты);
Возврат WSПараметры;
КонецФункции
Используется basic аутентификация, поэтому устанавливаем логин и пароль на для "Прокси = Новый WSПрокси"
Специфика данной SOAP схемы в том что передается несколько параметров типа "строка", их передаю напрямую и массив строк, его беру из схемы.
Функции формирования SOAP запроса
Функция ВыполнитьЗапросSOAP(ИмяСервиса, ИмяФункции, СтруктураЗапрос)
WSОтвет = Неопределено;
Попытка
WSПараметры = ПолучитьПараметрыWS(ИмяСервиса);
Для каждого СтрС Из СтруктураЗапрос Цикл
Если ТипЗнч(СтрС.Значение) = Тип("Массив") Тогда
ТипWSМассивСтрок = WSПараметры.Пакеты.Получить("ArrayOfString");
WSМассивСтрок = WSПараметры.Фабрика.Создать(ТипWSМассивСтрок);
Для каждого СтрМ Из СтрС.Значение Цикл
WSМассивСтрок.item.Добавить(СтрМ);
КонецЦикла;
СтруктураЗапрос.Вставить(СтрС.Ключ, WSМассивСтрок);
КонецЕсли;
КонецЦикла;
//--
МассивСтрок = Новый Массив;
Для каждого СтрС Из СтруктураЗапрос Цикл
МассивСтрок.Добавить("СтруктураЗапрос." + СтрС.Ключ);
КонецЦикла;
СтрокаЗапрос = СтрСоединить(МассивСтрок, ",");
Выполнить("WSОтвет = WSПараметры.Прокси." + ИмяФункции + "(" + СтрокаЗапрос + ")");
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "" + ИмяСервиса + " " + ИмяФункции + Символы.ПС + ОписаниеОшибки();
Сообщение.Сообщить();
Отказ = Истина;
КонецПопытки;
Возврат WSОтвет;
КонецФункции
Функция ПолучитьПараметрыWS(ИмяСервиса)
Возврат СоответствиеWSПараметры.Получить(ИмяСервиса);
КонецФункции
Получаем основной вариант отгрузки
Функция ПолучитьСписокМетодовОтгрузки()
СтруктураЗапрос = Новый Структура;
СтруктураЗапрос.Вставить("code", "");
WSОтвет = ВыполнитьЗапросSOAP("mlservice3", "getShipmentMethods", СтруктураЗапрос);
//--
Если WSОтвет = Неопределено Тогда
Возврат "";
КонецЕсли;
Для каждого СтрОтвет Из WSОтвет.item Цикл
Если СтрОтвет.IsDefault = 1 Тогда
Возврат СтрОтвет.Code;
КонецЕсли;
КонецЦикла;
КонецФункции
При вызове SOAP функции указываем все параметры, как указано в документации, для пустых значений указываем пустую строку.
Получаем ближайшую дату отгрузки
Функция ПолучитьБлижайшуюДоступнуюДатуОткгрузки(МетодОтгрузки)
СтруктураЗапрос = Новый Структура;
СтруктураЗапрос.Вставить("code", "");
СтруктураЗапрос.Вставить("ShipmentMethodCode", МетодОтгрузки);
WSОтвет = ВыполнитьЗапросSOAP("mlservice3", "getShipmentDates", СтруктураЗапрос);
//--
Попытка
Возврат WSОтвет.item[0].Date;
Исключение
//ОписаниеОшибки()
КонецПопытки;
КонецФункции
Получаем данные по остаткам
Функция ПолучитьДоступноеКоличествоТоваровИЦенSOAP(МетодОтгрузки, ДатаОтгрузки, МассивКодовТоваров)
СтруктураЗапрос = Новый Структура;
СтруктураЗапрос.Вставить("cat_id", "");
СтруктураЗапрос.Вставить("shipment_method", МетодОтгрузки);
СтруктураЗапрос.Вставить("shipment_date", ДатаОтгрузки);
СтруктураЗапрос.Вставить("only_avail", 1);
СтруктураЗапрос.Вставить("item_id", МассивКодовТоваров);
Возврат ВыполнитьЗапросSOAP("mlservice3", "getItemsAvail", СтруктураЗапрос);
КонецФункции
Вывод: При наличии внятной архитектуры со стороны сервиса SOAP использовать его удобно и код клиента получается достаточно простым.
Под общей методологией SOAP могут находится реализации разного качества.