При разработке SOAP Web-сервисов в платформе 1С часто возникает задача вернуть вызывающей системе сразу несколько значений (например, статус выполнения, код ошибки и результирующий массив данных). По умолчанию функция Web-сервиса содержит только одно возвращаемое значение, однако платформой предусмотрены механизмы для передачи множества параметров.
Разберем подробнее основные способы решения этой задачи, а также типичные ошибки, возникающие при настройке.
Этот способ подходит, если внешняя система ожидает получить данные именно через выходные аргументы вызова метода, прописанные в WSDL-описании сервиса со своими типами данных.
Рассмотрим порядок настройки в Конфигураторе:
Выходной (Out) или Входной-Выходной (InOut).Возврат, необходимо полностью очистить свойство операции «Тип возвращаемого значения». Если тип оставлен заправленным, функция обязана вернуть значение соответствующего типа, иначе возникнет ошибка.Проанализируем пример кода модуля Web-сервиса. В этом случае значения передаются выходным параметрам путем прямого присваивания переменным-аргументам:
Функция ПолучитьДанные(Параметр1, Параметр2)
// Заполняем выходные параметры напрямую
Параметр1 = "Значение первой переменной";
Параметр2 = 12345;
// Если "Тип возвращаемого значения" в метаданных очищен,
// оператор Возврат с значением не требуется.
КонецФункции
Если нет жесткого требования к WSDL-схеме отдельных параметров, можно упаковать все возвращаемые значения в единый объект-структуру 1С и сериализовать его в XDTO.
Рассмотрим пример формирования структуры на стороне Web-сервиса:
Функция ЭкспортДанных()
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("Результат", Истина);
СтруктураОтвета.Вставить("КодОшибки", 0);
СтруктураОтвета.Вставить("ТекстСообщения", "Операция выполнена успешно");
// Сериализуем структуру 1С в объект XDTO
ОтветXDTO = СериализаторXDTO.ЗаписатьXDTO(СтруктураОтвета);
Возврат ОтветXDTO;
КонецФункции
На стороне приемника (в другой базе 1С) полученный объект XDTO десериализуется обратно в структуру:
// Чтение ответа на стороне клиента
СтруктураВозврата = СериализаторXDTO.ПрочитатьXDTO(ОтветXDTO);
Если СтруктураВозврата.Результат Тогда
ЗаписьЖурналаРегистрации(СтруктураВозврата.ТекстСообщения);
КонецЕсли;
Когда сторонней системе требуется строгая типизация всех полей в WSDL, но использовать выходные параметры SOAP нежелательно, можно создать свой тип объекта XDTO:
ОбъектОтвета = ФабрикаXDTO.Создать(ТипXDTO);
ОбъектОтвета.par1 = "Значение 1";
ОбъектОтвета.par2 = "Значение 2";
Возврат ОбъектОтвета;
При работе с выходными параметрами Web-сервисов можно столкнуться со следующими ошибками:
1. «Обязательное возвращаемое значение не задано»
Возникает, когда у операции Web-сервиса заполнено свойство Тип возвращаемого значения, но в коде функции отсутствует оператор Возврат с заполнением требуемого типа, либо если обработчик написан как процедура. Для исправления очистите тип возвращаемого значения в метаданных или добавьте Возврат.
2. «Ошибка разбора SOAP сообщения: неизвестный параметр»
Обычно свидетельствует о том, что вызывающая система использует кэшированный старый WSDL-файл схемы, либо порядок и состав параметров в SOAP-запросе не соответствуют новым метаданным сервиса в 1С. Обновите кэш WSDL на стороне клиента.
Ограничение платформы: передавать ссылки на объекты базы данных 1С (такие как СправочникСсылка или ДокументСсылка) через параметры Web-сервиса напрямую нельзя. Все данные должны предварительно приводиться к примитивным типам XML Schema или объектам XDTO.