Публикация и отладка веб-сервисов 1С:Предприятия на веб-сервере Apache нередко сопровождаются ошибками сетевого взаимодействия. При попытке получить описание WSDL или создать объект WSОпределения разработчики часто сталкиваются с разрывом TCP-соединения (код 10054) либо с ошибкой 404. Разберем по шагам, почему возникают эти неполадки и как правильно настроить адресное пространство и программный вызов сервиса.
Рассмотрим распространенную ситуацию: информационная база опубликована на локальном веб-сервере 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="s10";Ref="MyBase";">
<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-схему веб-сервиса.
Следующий этап отладки — программное подключение к опубликованному сервису из сеанса 1С. Рассмотрим типичный пример вызова через конструктор объекта WSОпределения:
ВСОпределения = Новый WSОпределения("http://localhost/MyBase/ws/MyWebService.1cws?wsdl", "admin", "admin");
При выполнении этого кода платформа может выдать исключение: При создании описания сервиса произошла ошибка. URL сервиса: http://localhost/MyBase/ws/MyWebService.1cws?wsdl Код ответа сервера: 404. При этом в браузере этот же адрес может открываться корректно. Выясним причины такого поведения платформы и способы решения:
WSОпределения выполняется в серверной процедуре (&НаСервере или в общем модуле), имя localhost разрешается относительно сервера приложений 1С (хоста s10), а не локального компьютера разработчика, где запущен Apache. Сервер 1С пытается найти веб-сервис на самом себе и получает отказ или 404. Решением является замена localhost на реальный сетевой IP-адрес рабочей станции с веб-сервером.localhost в современных операционных системах часто преобразуется в IPv6-адрес ::1. Если Apache слушает только сокет IPv4 (127.0.0.1), попытка подключения через имя localhost завершается ошибкой. Указание точного IP-адреса (например, 127.0.0.1 или внешнего IP в локальной сети) гарантирует отправку пакетов по протоколу IPv4.localhost во внешний шлюз. Чтобы исключить влияние прокси, рекомендуется передавать пустой объект ИнтернетПрокси в параметры сетевых вызовов либо использовать прямой IP-адрес.Перепишем вызов сервиса с использованием явного 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Определения требует постоянного обращения к веб-серверу за WSDL-схемой при каждом вызове. Если структура веб-сервиса не меняется динамически, надежнее добавить схему в дерево метаданных конфигурации как объект WS-ссылки (WSReferences).
В этом случае платформа не выполняет сетевых запросов за определением WSDL, а сразу создает WSПрокси на основе встроенной схемы, что полностью исключает сетевые ошибки на этапе инициализации метаданных сервиса.