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

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

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

Шаг 1. Проверка публикации и устранение ошибки «Код ответа сервера: 404»

Ошибка с кодом 404 при вызове конструктора WSОпределения означает, что веб-сервер (Apache или IIS) не может найти запрашиваемый ресурс по указанному URL-адресу. Выясним основные причины этой ситуации:

  1. Некорректный адрес WSDL-описания. Адрес для получения схемы сервиса формируется по строгому шаблону: http://[Адрес_Сервера]/[ИмяПубликации]/ws/[ИмяСервиса].1cws?wsdl. Обратим внимание: имена публикации и сервиса чувствительны к регистру символов.
  2. Содержимое файла публикации (default.vrd). Проверим файл default.vrd, расположенный в каталоге публикации веб-сервера. В секции веб-сервисов должно быть установлено разрешение на публикацию: либо общий атрибут <ws enable="true">, либо явное описание конкретного сервиса <service name="..." enable="true" publishName="..."/>.
  3. Несовпадение разрядности платформы и веб-сервера. Разрядность веб-сервера (32-bit или 64-bit) должна строго совпадать с разрядностью установленного модуля расширения веб-сервера 1С (например, wsap24.dll для Apache 2.4). При несовпадении модуль не загружается, и запросы к .1cws завершаются ошибкой 404.
  4. Кэширование настроек веб-сервером. После внесения любых изменений в конфигурацию или файл default.vrd обязательно перезапустим службу веб-сервера.

Для быстрой проверки работоспособности публикации введем сформированный адрес в адресную строку браузера на рабочем компьютере или воспользуемся специализированными утилитами (например, SoapUI). В ответ браузер должен отобразить корректную XML-структуру схемы WSDL.

Шаг 2. Устранение ошибки «Порт не найден» при создании WSПрокси

Когда схема WSDL успешно получена, разработчики переходят к созданию объекта WSПрокси, где нередко возникает ошибка: «по причине: Порт не найден». Проанализируем сигнатуру конструктора объекта WSПрокси:

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

Четвертый параметр — ИмяТочкиПодключения (порт) — не является произвольной строкой или именем операции. В платформе 1С точка подключения формируется автоматически на основании имени веб-сервиса и версии протокола SOAP:

  1. Для протокола SOAP 1.1 имя порта формируется как [ИмяСервиса]Soap.
  2. Для протокола SOAP 1.2 имя порта формируется как [ИмяСервиса]Soap12.

Точное имя порта всегда можно проверить в тексте самой WSDL-схемы внутри тега <wsdl:port name="...">. Если в конфигурации сервис называется ZaprosOstatok, то в конструкторе прокси следует указывать "ZaprosOstatokSoap" или "ZaprosOstatokSoap12".

Шаг 3. Распределение контекста выполнения (Клиент — Сервер)

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

Рассмотрим правильную организацию работы: все операции по созданию определений, инициализации прокси и непосредственному вызову веб-сервиса должны полностью выполняться в серверной процедуре или функции (директива &НаСервере или &НаСервереБезКонтекста). На сторону клиента следует возвращать только готовые сериализуемые типы данных: строки, числа, структуры или массивы.

Пример корректного кода вызова Web-сервиса

Посмотрим на практический пример реализации клиент-серверного взаимодействия в модуле формы мобильного приложения:


&НаКлиенте
Процедура ПолучитьНаименованиеПоАртикулу(Команда)
    
    Если ПустаяСтрока(АртикулПоиска) Тогда
        Предупреждение("Укажите артикул для поиска!");
        Возврат;
    КонецЕсли;
    
    // Вызываем серверную функцию для обращения к Web-сервису
    РезультатПоиска = ПолучитьДанныеНаСервере(АртикулПоиска);
    
    Если РезультатПоиска.Успех Тогда
        НаименованиеНоменклатуры = РезультатПоиска.Наименование;
    Иначе
        Сообщить(РезультатПоиска.ТекстОшибки);
    КонецЕсли;
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьДанныеНаСервере(Знач Артикул)
    
    Результат = Новый Структура("Успех, Наименование, ТекстОшибки", Ложь, "", "");
    
    АдресWSDL = "http://192.168.1.167/wsExchange/ws/ZaprosOstatok.1cws?wsdl";
    URIПространстваИмен = "http://www.company.ru/wsExchange";
    ИмяСервиса = "ZaprosOstatok";
    ИмяТочкиПодключения = "ZaprosOstatokSoap12";
    
    Попытка
        // Инициализируем WSDL-описание сервиса с указанием таймаута соединения
        Определения = Новый WSОпределения(АдресWSDL, "ПользовательWS", "ПарольWS", 10);
        
        // Создаем прокси для выполнения операций
        Прокси = Новый WSПрокси(Определения, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения);
        Прокси.Пользователь = "ПользовательWS";
        Прокси.Пароль = "ПарольWS";
        Прокси.Таймаут = 10;
        
        // Вызываем операцию веб-сервиса
        ОтветСервиса = Прокси.ПолучитьДанные(Артикул);
        
        Результат.Успех = Истина;
        Результат.Наименование = ОтветСервиса;
        
    Исключение
        Результат.ТекстОшибки = "Ошибка при обращении к веб-сервису: " + ОписаниеОшибки();
    КонецПопытки;
    
    Возврат Результат;
    
КонецФункции

Рекомендации по оптимизации интеграции для мобильных устройств

Разберем дополнительные нюансы, которые необходимо учитывать при промышленной эксплуатации мобильных решений:

  1. Использование объекта конфигурации «WS-ссылка». Вызов конструктора Новый WSОпределения(...) при каждом сетевом обращении загружает всю WSDL-схему по сети. В мобильных сетях это создает лишний трафик и задержки. Рекомендуется добавить в дерево метаданных объект WS-ссылка, содержащий статическую WSDL-схему, и создавать прокси сразу через WSСсылки[ИмяСсылки].СоздатьWSПрокси(...).
  2. Управление таймаутами. Мобильное соединение подвержено обрывам. Всегда явно передавайте параметр Таймаут в конструкторах WSОпределения и объекте WSПрокси, чтобы приложение не зависало при отсутствии ответа от сервера.
  3. Использование безопасного протокола HTTPS. Современные мобильные платформы блокируют незашифрованный HTTP-трафик. Для публикации рабочих сервисов необходимо настроить веб-сервер на использование протокола HTTPS с доверенным SSL-сертификатом.
  4. Альтернатива: HTTP-сервисы (REST API). Для простых операций обмена (например, поиск номенклатуры по реквизиту или остаткам) формат SOAP/XML часто оказывается избыточным. Использование стандартных HTTP-сервисов 1С с передачей данных в формате JSON существенно снижает объем передаваемого трафика и упрощает отладку запросов.
← На главную