При интеграции систем часто возникает необходимость вызова внешних веб-сервисов (SOAP) из 1С с помощью объектов WSОпределения и WSПрокси. В зависимости от того, как метод веб-сервиса объявлен в его WSDL-схеме, передача параметров может осуществляться простым передаванием обычных переменных 1С либо путем сериализации объектов в формат XDTO.
Рассмотрим подробнее, как передавать как базовые типы данных (строки, числа, даты), так и сложные структуры или таблицы значений.
Если в WSDL-описании операции параметры заданы базовыми типом XML (например, xs:string, xs:int, xs:dateTime, xs:boolean), платформа 1С автоматически выполняет их преобразование из стандартных типов 1С (Строка, Число, Дата, Булево). Дополнительных действий по преобразованию выполнять не нужно.
Важное правило: параметры в динамический метод прокси передаются строго в той последовательности, в которой они описаны в WSDL-схеме веб-сервиса.
Посмотрим на пример вызова метода веб-сервиса, принимающего примитивные параметры:
// Создание определений и прокси-объекта
АдресWSDL = Выборка.АдресВебсервиса + "?wsdl";
Определения = Новый WSОпределения(АдресWSDL);
Прокси = Новый WSПрокси(Определения, "urn:DefaultNamespace", "DBNAMEService", "Domino");
// Передача параметров непосредственно в вызываемый метод сервиса
Ответ = Прокси.SKDTASK(
Тип,
Сотрудник.ФизЛицо.ИдентификационныйКодЛичности,
Руководитель.Физлицо.ИдентификационныйКодЛичности,
УниверсальноеВремя(ДатаИВремя, Организация.СКД_ЧасовойПояс),
Фото,
УниверсальноеВремя(ДатаАвтоОтвета, Организация.СКД_ЧасовойПояс)
);
Когда требуется передать составной объект (например, Структура, Массив или ТаблицаЗначений), стандартных типов данных XML недостаточно. В таком случае объект 1С переводится в формат XDTO с помощью объекта СериализаторXDTO.
Разберем по шагам порядок подключения к веб-сервису с аутентификацией и передачей сериализованного объекта:
WSОпределения и WSПрокси.СериализаторXDTO.ЗаписатьXDTO().Проанализируем пример кода:
Пользователь = ИмяПользователя;
Пароль = ПарольПользователя;
Попытка
Определение = Новый WSОпределения(URLВебСервиса, Пользователь, Пароль);
Прокси = Новый WSПрокси(Определение, URIПространстваИмен, ИмяВебСервиса, ИмяВебСервисаSoap);
Прокси.Пользователь = Пользователь;
Прокси.Пароль = Пароль;
Исключение
ЗаписьЖурналаРегистрации(
НСтр("ru = 'Веб-Сервис'"),
УровеньЖурналаРегистрации.Ошибка,
,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)
);
ВызватьИсключение;
КонецПопытки;
// Сериализация Таблицы Значений или Структуры в XDTO-объект
ТаблицаЗначенийXDTO = СериализаторXDTO.ЗаписатьXDTO(ТаблицаЗадач);
// Вызов метода веб-сервиса
ГотоваяТаблицаXDTO = Прокси.GetPercentTask(ТаблицаЗначенийXDTO);
Также возможен вариант, когда параметры упаковываются в структуру, а элементы структуры отдельно преобразуются в XDTO перед вызовом сервиса:
НаименованиеОтчета = "Отчет по продажам";
ПараметрыОперации = Новый Структура;
ПараметрыОперации.Вставить("ReportName", НаименованиеОтчета);
ПараметрыОперации.Вставить("Params", СериализаторXDTO.ЗаписатьXDTO(СтруктураПараметровОтчета));
// Передача готовых параметров в метод сервиса
ОбъектXDTO = WSПрокси.СформироватьОтчет(ПараметрыОперации.ReportName, ПараметрыОперации.Params);
При вызове веб-сервисов в 1С стоит учитывать следующие особенности:
Прокси.ФабрикаXDTO, а не глобальную контекстную фабрику, чтобы избежать несовместимости типов.nillable="false" или minOccurs="1"), передача значения Неопределено вызовет ошибку несоответствия типов.WSОпределения.xs:string и передавать в нем строку JSON (созданную с помощью ЗаписатьJSON()). Это упрощает интеграцию и исключает жесткую привязку к XDTO-схемам.