Разберем распространенную ситуацию: после публикации веб-сервисов 1С на веб-сервере Microsoft IIS пользователи внутри локальной сети успешно подключаются к сервису по стандартному порту 80, однако внешние клиенты, обращающиеся через проброшенный порт (например, 8088), не могут выполнить вызовы методов.
Проанализируем причину такого поведения. При открытии схемы WSDL в браузере или SOAP-клиенте загружается XML-описание сервиса. В самом конце файла располагается блок service с элементом <soapbind:address location="...">. Платформа 1С формирует этот WSDL-документ динамически, считывая сетевые параметры из входящего HTTP-запроса (серверные переменные SERVER_NAME, SERVER_PORT и заголовок Host).
Когда на сетевом шлюзе или роутере настроена трансляция портов (Port NAT) с внешнего 8088 на внутренний 80, веб-сервер IIS обрабатывает запрос как стандартное HTTP-соединение. В соответствии со спецификацией URL для 80-го порта номер порта в адресе опускается. В результате клиент успешно скачивает схему сервиса по адресу с портом 8088, но дальнейшие функциональные SOAP-запросы отправляет на адрес из атрибута location (то есть на порт 80), куда из внешней сети доступа нет.
Рассмотрим, как можно решить данную проблему на уровне веб-сервера, сетевой инфраструктуры и клиентских приложений.
Самое надежное и простое решение — сделать так, чтобы веб-сервер IIS принимал входящие запросы именно на том порту, который открыт снаружи.
Разберем по шагам настройку веб-сервера IIS:
http, IP-адрес Все свободные (или конкретный внутренний IP) и порт 8088.80, и 8088 порт.8088 на внутренний порт 8088 сервера IIS.При таком подходе модуль 1С увидит в заголовках порт 8088 и автоматически сгенерирует WSDL со строкой вида http://domain_or_ip:8088/base/ws/service.1cws. Никаких дополнительных правок в конфигурации или файле default.vrd не потребуется.
Если на основном сайте нельзя менять или добавлять привязки, создадим для внешних веб-сервисов отдельный сайт в IIS:
1C_WebServices.8088.webinst) в этот новый сайт.8088 на внутренний порт 8088.Если инфраструктурные настройки менять нельзя, а схема WSDL уже получена, скорректируем точку подключения (Endpoint URL) непосредственно в клиентском коде.
Если клиентом выступает другая база 1С, переопределим адрес сервиса при создании прокси:
Определения = Новый WSОпределения("http://remote.server.ru:8088/base/ws/service.1cws?wsdl", "Логин", "Пароль");
// Явно указываем адрес точки подключения с нужным внешним портом:
АдресТочкиПодключения = "http://remote.server.ru:8088/base/ws/service.1cws";
Прокси = Новый WSПрокси(Определения, "http://www.sample.org/service", "ServiceName", "ServiceSoapEndpoint", , , АдресТочкиПодключения);
Прокси.Пользователь = "Логин";
Прокси.Пароль = "Пароль";
Результат = Прокси.ВыполнитьОперацию();
Если клиентом выступает стороннее приложение (.NET, Java, Python, PHP), в большинстве библиотек SOAP доступно свойство переопределения конечной точки (например, EndpointAddress или location), которое позволяет отправлять SOAP-пакеты на порт 8088, игнорируя сгенерированный внутри WSDL адрес.
Рассмотрим альтернативный вариант для сторонних интеграций:
soapbind:address.:8088 в атрибут location.