При интеграции мобильного приложения на платформе 1С с центральной базой через SOAP-веб-сервисы разработчики часто сталкиваются с двумя распространенными проблемами: ошибкой HTTP 404 (Not Found) при получении WSDL-описания через объект WSОпределения и исключением «Порт не найден» при попытке инициализировать WSПрокси. Разберем по шагам причины возникновения этих ошибок и рассмотрим правильный алгоритм настройки публикации и программного кода подключения.
Ошибка HTTP 404 при обращении к WSDL чаще всего означает, что адрес сформирован некорректно либо веб-сервер не перенаправляет запрос к модулю расширения 1С. Разберем структуру URL для доступа к веб-сервису 1С:
Стандартный шаблон URL для получения WSDL-схемы выглядит следующим образом: http://<АдресСервера>/<ИмяПубликации>/ws/<ИмяСервисаИлиАлиас>.1cws?wsdl
Проанализируем файл дескриптора публикации default.vrd, который формируется в каталоге публикации веб-сервера:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/wsExchange"
ib="Srvr="SQL:1741";Ref="MobilOP";">
<ws publishExtensionsByDefault="true">
<point name="ZaprosOstatok" alias="wsExchange" enable="true" reuseSessions="autouse" sessionMaxAge="20" poolSize="10" poolTimeout="5"/>
</ws>
<standardOdata enable="true" reuseSessions="autouse" sessionMaxAge="20" poolSize="10" poolTimeout="5"/>
</point>
Обратим внимание на параметры:
base="/wsExchange" задает имя виртуального каталога публикации.alias="wsExchange" переопределяет имя веб-сервиса в URL (если псевдоним не задан, используется имя из атрибута name).Конструктор объекта WSПрокси принимает следующие параметры: Новый WSПрокси(Определения, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения, ...).
Типичная ошибка заключается в том, что в качестве четвертого параметра (имя точки подключения) передается имя самого сервиса (например, "ZaprosOstatok"). При генерации схемы WSDL платформа 1С автоматически добавляет суффикс к имени порта, формируя имя вида "ZaprosOstatokSoap" или "ZaprosOstatokSoap12". Если переданное строковое значение не совпадает с именем точки подключения в WSDL, платформа генерирует исключение «Порт не найден».
Чтобы избежать ошибок с ручным указанием имен сервисов и портов, рекомендуется получать их динамически из коллекции полученного объекта WSОпределения. Рассмотрим готовый пример функции для безопасного создания прокси с обработкой исключений и установкой таймаутов:
Функция ПолучитьНовыйПроксиВебСервисаЦБ(ТекстОшибки = "") Экспорт
Пользователь = "Obmen";
Пароль = "1";
ОпределениеСервиса = Неопределено;
АдресСервераСПортом = Константы.АдресОбменаЦБ.Получить();
Если Прав(АдресСервераСПортом, 1) <> "/" Тогда
АдресСервераСПортом = АдресСервераСПортом + "/";
КонецЕсли;
ТекстОшибки = "";
Попытка
// Получаем WSDL-описание сервиса с таймаутом соединения
ОпределениеСервиса = Новый WSОпределения("http://" + АдресСервераСПортом + "ws/wsExchange.1cws?wsdl", Пользователь, Пароль, , 300);
Исключение
ТекстОшибки = ОписаниеОшибки();
ОпределениеСервиса = Неопределено;
КонецПопытки;
Если ОпределениеСервиса = Неопределено Тогда
ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", Символы.ПС) + "Не удалось получить определение веб-сервиса";
Возврат Неопределено;
КонецЕсли;
Попытка
// Извлекаем сервис и первую точку подключения программно
Сервис = ОпределениеСервиса.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];
Прокси = Новый WSПрокси(ОпределениеСервиса, Сервис.URIПространстваИмен, Сервис.Имя, ТочкаПодключения.Имя, , 300);
Прокси.Пользователь = Пользователь;
Прокси.Пароль = Пароль;
Исключение
ТекстОшибки = ОписаниеОшибки();
ОпределениеСервиса = Неопределено;
Прокси = Неопределено;
КонецПопытки;
Если Прокси = Неопределено Тогда
ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", Символы.ПС) + "Не удалось получить прокси веб-сервиса";
Возврат Неопределено;
КонецЕсли;
Возврат Прокси;
КонецФункции
При разработке мобильных решений на базе 1С полезно учитывать следующие архитектурные особенности:
WSОпределения при каждом вызове заставляет мобильный клиент загружать схему WSDL по сети, что замедляет работу при нестабильном канале. Добавление объекта метаданных WS-ссылка в мобильную конфигурацию позволяет хранить WSDL локально и создавать прокси через метод WSСсылки.<ИмяWSСсылки>.СоздатьWSПрокси() без повторной загрузки метаданных сервиса.HTTPСоединение / HTTPЗапрос являются более легковесными, экономят мобильный трафик и работают быстрее SOAP.<standardOdata enable="true"/> в default.vrd), данные из справочника можно получить простым HTTP GET-запросом к сущности без написания отдельного веб-сервиса.