Как вернуть несколько параметров из Web-сервиса 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке SOAP Web-сервисов в платформе 1С часто возникает задача вернуть вызывающей системе сразу несколько значений (например, статус выполнения, код ошибки и результирующий массив данных). По умолчанию функция Web-сервиса содержит только одно возвращаемое значение, однако платформой предусмотрены механизмы для передачи множества параметров.

Разберем подробнее основные способы решения этой задачи, а также типичные ошибки, возникающие при настройке.

Способ 1. Использование выходных параметров SOAP (Direction Out / InOut)

Этот способ подходит, если внешняя система ожидает получить данные именно через выходные аргументы вызова метода, прописанные в WSDL-описании сервиса со своими типами данных.

Рассмотрим порядок настройки в Конфигураторе:

  1. Откроем свойства операции Web-сервиса и перейдем к списку ее параметров.
  2. Для каждого параметра, который должен возвращать значение, установим свойство «Направление передачи» в значение Выходной (Out) или Входной-Выходной (InOut).
  3. Важно: если операция Web-сервиса не должна возвращать отдельное основное значение через оператор Возврат, необходимо полностью очистить свойство операции «Тип возвращаемого значения». Если тип оставлен заправленным, функция обязана вернуть значение соответствующего типа, иначе возникнет ошибка.

Проанализируем пример кода модуля Web-сервиса. В этом случае значения передаются выходным параметрам путем прямого присваивания переменным-аргументам:


Функция ПолучитьДанные(Параметр1, Параметр2)
    
    // Заполняем выходные параметры напрямую
    Параметр1 = "Значение первой переменной";
    Параметр2 = 12345;
    
    // Если "Тип возвращаемого значения" в метаданных очищен, 
    // оператор Возврат с значением не требуется.
    
КонецФункции

Способ 2. Возврат структуры через СериализаторXDTO

Если нет жесткого требования к WSDL-схеме отдельных параметров, можно упаковать все возвращаемые значения в единый объект-структуру 1С и сериализовать его в XDTO.

Рассмотрим пример формирования структуры на стороне Web-сервиса:


Функция ЭкспортДанных()
    
    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("Результат", Истина);
    СтруктураОтвета.Вставить("КодОшибки", 0);
    СтруктураОтвета.Вставить("ТекстСообщения", "Операция выполнена успешно");
    
    // Сериализуем структуру 1С в объект XDTO
    ОтветXDTO = СериализаторXDTO.ЗаписатьXDTO(СтруктураОтвета);
    
    Возврат ОтветXDTO;
    
КонецФункции

На стороне приемника (в другой базе 1С) полученный объект XDTO десериализуется обратно в структуру:


// Чтение ответа на стороне клиента
СтруктураВозврата = СериализаторXDTO.ПрочитатьXDTO(ОтветXDTO);

Если СтруктураВозврата.Результат Тогда
    ЗаписьЖурналаРегистрации(СтруктураВозврата.ТекстСообщения);
КонецЕсли;

Способ 3. Использование пользовательского типа объекта XDTO

Когда сторонней системе требуется строгая типизация всех полей в WSDL, но использовать выходные параметры SOAP нежелательно, можно создать свой тип объекта XDTO:

  1. В дерево метаданных добавим новый Пакет XDTO.
  2. В пакете создадим Тип объекта XDTO, содержащий все необходимые свойства с нужными типами данных (строка, число, дата и т.д.).
  3. В свойствах операции Web-сервиса в поле «Тип возвращаемого значения» укажем созданный тип объекта XDTO.
  4. В коде функции сформируем объект с помощью фабрики:
    
    ОбъектОтвета = ФабрикаXDTO.Создать(ТипXDTO);
    ОбъектОтвета.par1 = "Значение 1";
    ОбъектОтвета.par2 = "Значение 2";
    
    Возврат ОбъектОтвета;
    

Разбор возможных ошибок

При работе с выходными параметрами Web-сервисов можно столкнуться со следующими ошибками:

1. «Обязательное возвращаемое значение не задано»
Возникает, когда у операции Web-сервиса заполнено свойство Тип возвращаемого значения, но в коде функции отсутствует оператор Возврат с заполнением требуемого типа, либо если обработчик написан как процедура. Для исправления очистите тип возвращаемого значения в метаданных или добавьте Возврат.

2. «Ошибка разбора SOAP сообщения: неизвестный параметр»
Обычно свидетельствует о том, что вызывающая система использует кэшированный старый WSDL-файл схемы, либо порядок и состав параметров в SOAP-запросе не соответствуют новым метаданным сервиса в 1С. Обновите кэш WSDL на стороне клиента.

Ограничение платформы: передавать ссылки на объекты базы данных 1С (такие как СправочникСсылка или ДокументСсылка) через параметры Web-сервиса напрямую нельзя. Все данные должны предварительно приводиться к примитивным типам XML Schema или объектам XDTO.

← На главную