Как устранить ошибки при вызове веб-сервиса 1С на веб-сервере Apache

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

Публикация и отладка веб-сервисов 1С:Предприятия на веб-сервере Apache нередко сопровождаются ошибками сетевого взаимодействия. При попытке получить описание WSDL или создать объект WSОпределения разработчики часто сталкиваются с разрывом TCP-соединения (код 10054) либо с ошибкой 404. Разберем по шагам, почему возникают эти неполадки и как правильно настроить адресное пространство и программный вызов сервиса.

Анализ ошибки 10054 при обращении к WSDL через браузер

Рассмотрим распространенную ситуацию: информационная база опубликована на локальном веб-сервере Apache, файл описания default.vrd сформирован, однако при переходе по ссылке вида http://localhost/ws/MyWebService.1cws?wsdl браузер возвращает сбой:

1C:Enterprise 8 application error: server_addr=tcp://s10:1560 descr=10054: Удаленный хост принудительно разорвал существующее подключение.

Проанализируем структуру файла default.vrd:


<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
        base="/MyBase"
        ib="Srvr=&quot;s10&quot;;Ref=&quot;MyBase&quot;;">
    <ws>
        <point name="MyWebService"
                alias="MyWebService.1cws"
                enable="true"
                reuseSessions="autouse"
                sessionMaxAge="20"
                poolSize="10"
                poolTimeout="5"/>
    </ws>
</point>

Главная причина подобного поведения заключается в нарушении маршрутизации запроса. Обратите внимание на параметр base="/MyBase". Данный атрибут указывает базовый виртуальный каталог публикации. Если в URL пропустить имя базы и попытаться обратиться сразу к /ws/..., веб-сервер Apache не сможет корректно сопоставить запрос с контекстом нужной информационной базы и перенаправит его с ошибкой.

Сформируем правильный URL для получения схемы WSDL:

http://localhost/MyBase/ws/MyWebService.1cws?wsdl

После добавления имени публикации в путь браузер корректно выгрузит XML-схему веб-сервиса.

Устранение ошибки 404 при создании WSОпределения в коде 1С

Следующий этап отладки — программное подключение к опубликованному сервису из сеанса 1С. Рассмотрим типичный пример вызова через конструктор объекта WSОпределения:


ВСОпределения = Новый WSОпределения("http://localhost/MyBase/ws/MyWebService.1cws?wsdl", "admin", "admin");

При выполнении этого кода платформа может выдать исключение: При создании описания сервиса произошла ошибка. URL сервиса: http://localhost/MyBase/ws/MyWebService.1cws?wsdl Код ответа сервера: 404. При этом в браузере этот же адрес может открываться корректно. Выясним причины такого поведения платформы и способы решения:

  1. Контекст исполнения кода (Клиент / Сервер): если конструктор WSОпределения выполняется в серверной процедуре (&НаСервере или в общем модуле), имя localhost разрешается относительно сервера приложений 1С (хоста s10), а не локального компьютера разработчика, где запущен Apache. Сервер 1С пытается найти веб-сервис на самом себе и получает отказ или 404. Решением является замена localhost на реальный сетевой IP-адрес рабочей станции с веб-сервером.
  2. Сетевые настройки IPv4 / IPv6: имя localhost в современных операционных системах часто преобразуется в IPv6-адрес ::1. Если Apache слушает только сокет IPv4 (127.0.0.1), попытка подключения через имя localhost завершается ошибкой. Указание точного IP-адреса (например, 127.0.0.1 или внешнего IP в локальной сети) гарантирует отправку пакетов по протоколу IPv4.
  3. Использование параметров прокси-сервера: системные параметры прокси в операционной системе могут перенаправлять запросы к localhost во внешний шлюз. Чтобы исключить влияние прокси, рекомендуется передавать пустой объект ИнтернетПрокси в параметры сетевых вызовов либо использовать прямой IP-адрес.

Рекомендуемый способ инициализации WSОпределения

Перепишем вызов сервиса с использованием явного IP-адреса веб-сервера:


АдресWSDL = "http://192.168.1.100/MyBase/ws/MyWebService.1cws?wsdl";
Логин = "admin";
Пароль = "admin";
Таймаут = 10;

Попытка
    Определения = Новый WSОпределения(АдресWSDL, Логин, Пароль, , Таймаут);
    Прокси = Новый WSПрокси(Определения, "http://v8.1c.ru/ws", "MyWebService", "MyWebServiceSoap");
    Прокси.Пользователь = Логин;
    Прокси.Пароль = Пароль;
Исключение
    ВызватьИсключение "Не удалось инициализировать WS-соединение: " + ОписаниеОшибки();
КонецПопытки;

Альтернативный вариант: использование статической WS-ссылки

Динамическое создание объекта WSОпределения требует постоянного обращения к веб-серверу за WSDL-схемой при каждом вызове. Если структура веб-сервиса не меняется динамически, надежнее добавить схему в дерево метаданных конфигурации как объект WS-ссылки (WSReferences).

В этом случае платформа не выполняет сетевых запросов за определением WSDL, а сразу создает WSПрокси на основе встроенной схемы, что полностью исключает сетевые ошибки на этапе инициализации метаданных сервиса.

← На главную