Как устранить ошибки 404 и «Порт не найден» при подключении к веб-сервису 1С из мобильного приложения?

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

При интеграции мобильного приложения на платформе 1С с центральной базой через SOAP-веб-сервисы разработчики часто сталкиваются с двумя распространенными проблемами: ошибкой HTTP 404 (Not Found) при получении WSDL-описания через объект WSОпределения и исключением «Порт не найден» при попытке инициализировать WSПрокси. Разберем по шагам причины возникновения этих ошибок и рассмотрим правильный алгоритм настройки публикации и программного кода подключения.

1. Проверка структуры URL и параметров публикации веб-сервиса

Ошибка 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=&quot;SQL:1741&quot;;Ref=&quot;MobilOP&quot;;">
    <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>

Обратим внимание на параметры:

  1. Атрибут base="/wsExchange" задает имя виртуального каталога публикации.
  2. Атрибут alias="wsExchange" переопределяет имя веб-сервиса в URL (если псевдоним не задан, используется имя из атрибута name).
  3. Для проверки работоспособности сервиса откроем сформированный URL в обычном браузере или специализированной утилите (например, SoapUI). В ответ веб-сервер должен вернуть XML-документ с описанием WSDL. Если браузер выдает ошибку 404, выполним перезапуск службы веб-сервера (Apache или IIS).

2. Выясняем причину ошибки «Порт не найден»

Конструктор объекта WSПрокси принимает следующие параметры: Новый WSПрокси(Определения, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения, ...).

Типичная ошибка заключается в том, что в качестве четвертого параметра (имя точки подключения) передается имя самого сервиса (например, "ZaprosOstatok"). При генерации схемы WSDL платформа 1С автоматически добавляет суффикс к имени порта, формируя имя вида "ZaprosOstatokSoap" или "ZaprosOstatokSoap12". Если переданное строковое значение не совпадает с именем точки подключения в WSDL, платформа генерирует исключение «Порт не найден».

3. Универсальный программный способ инициализации WSПрокси

Чтобы избежать ошибок с ручным указанием имен сервисов и портов, рекомендуется получать их динамически из коллекции полученного объекта WSОпределения. Рассмотрим готовый пример функции для безопасного создания прокси с обработкой исключений и установкой таймаутов:


Функция ПолучитьНовыйПроксиВебСервисаЦБ(ТекстОшибки = "") Экспорт
    
    Пользователь = "Obmen";
    Пароль = "1";
    
    ОпределениеСервиса = Неопределено;
    
    АдресСервераСПортом = Константы.АдресОбменаЦБ.Получить();
    Если Прав(АдресСервераСПортом, 1) <> "/" Тогда
        АдресСервераСПортом = АдресСервераСПортом + "/";
    КонецЕсли;
    
    ТекстОшибки = "";
    Попытка
        // Получаем WSDL-описание сервиса с таймаутом соединения
        ОпределениеСервиса = Новый WSОпределения("http://" + АдресСервераСПортом + "ws/wsExchange.1cws?wsdl", Пользователь, Пароль, , 300);
    Исключение
        ТекстОшибки = ОписаниеОшибки();
        ОпределениеСервиса = Неопределено;
    КонецПопытки;
    
    Если ОпределениеСервиса = Неопределено Тогда
        ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", Символы.ПС) + "Не удалось получить определение веб-сервиса";
        Возврат Неопределено;
    КонецЕсли;
    
    Попытка
        // Извлекаем сервис и первую точку подключения программно
        Сервис = ОпределениеСервиса.Сервисы[0];
        ТочкаПодключения = Сервис.ТочкиПодключения[0];
        
        Прокси = Новый WSПрокси(ОпределениеСервиса, Сервис.URIПространстваИмен, Сервис.Имя, ТочкаПодключения.Имя, , 300);
        Прокси.Пользователь = Пользователь;
        Прокси.Пароль = Пароль;
    Исключение
        ТекстОшибки = ОписаниеОшибки();
        ОпределениеСервиса = Неопределено;
        Прокси = Неопределено;
    КонецПопытки;
    
    Если Прокси = Неопределено Тогда
        ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", Символы.ПС) + "Не удалось получить прокси веб-сервиса";
        Возврат Неопределено;
    КонецЕсли;
    
    Возврат Прокси;
    
КонецФункции

4. Рекомендации по оптимизации обмена на мобильной платформе

При разработке мобильных решений на базе 1С полезно учитывать следующие архитектурные особенности:

  1. Статические WS-ссылки: Динамическое создание объекта WSОпределения при каждом вызове заставляет мобильный клиент загружать схему WSDL по сети, что замедляет работу при нестабильном канале. Добавление объекта метаданных WS-ссылка в мобильную конфигурацию позволяет хранить WSDL локально и создавать прокси через метод WSСсылки.<ИмяWSСсылки>.СоздатьWSПрокси() без повторной загрузки метаданных сервиса.
  2. Переход на HTTP-сервисы (REST/JSON): Для передачи небольших порций данных (например, получение наименования по артикулу) формат JSON и объекты HTTPСоединение / HTTPЗапрос являются более легковесными, экономят мобильный трафик и работают быстрее SOAP.
  3. Использование OData: Если на веб-сервере включен стандартный интерфейс OData (параметр <standardOdata enable="true"/> в default.vrd), данные из справочника можно получить простым HTTP GET-запросом к сущности без написания отдельного веб-сервиса.
  4. Таймауты и фоновые задания: Любые сетевые обращения с мобильного клиента необходимо ограничивать разумным таймаутом либо выполнять в фоновых потоках, чтобы избежать блокировки интерфейса приложения.
← На главную