Как исправить ошибку таймаута при вызове методов веб-сервиса 1С через прокси-сервер?

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

Разберем ситуацию, которая часто встречается при построении сложных инфраструктур доступа к базам 1С: когда веб-сервис опубликован на внутреннем сервере, а доступ к нему осуществляется через офисный сервер-прокси (например, с использованием IIS и модуля ARR). Часто возникает проблема, когда файл описания веб-сервиса (WSDL) успешно получается клиентом, но при попытке вызвать любой метод (даже самый простой Ping) система выдает ошибку: "Превышено время ожидания". Проанализируем причины этой проблемы и найдем способы её решения.

Причина 1: Несоответствие адресов в WSDL-описании

Выясним, как работает механизм обращения к веб-сервису. Когда мы создаем объект WSПрокси в 1С, платформа сначала обращается по указанному URL, чтобы скачать WSDL-файл. Этот файл содержит описание всех доступных методов, типов данных и, что самое важное, точки подключения (endpoints).

Рассмотрим структуру секции service в типичном WSDL-файле 1С:


<service name="API">
    <port name="APISoap" binding="tns:APISoapBinding">
        <soapbind:address location="http://192.168.1.50/v1.0/api.1cws"/>
    </port>
</service>

Проанализируем ситуацию: если ваш прокси-сервер пробрасывает запрос на внутренний сервер с IP-адресом 192.168.1.50, то 1С сформирует WSDL, в котором в атрибуте location будет указан именно этот внутренний адрес. Когда клиентское приложение (внешний пользователь) получает этот файл, оно пытается отправить собственно SOAP-запрос на выполнение метода напрямую по адресу из location. Естественно, внутренний IP-адрес недоступен из интернета, что и приводит к глухому зависанию и последующему таймауту.

Решение 1: Настройка атрибута publishURL в файле default.vrd

Для того чтобы 1С генерировала правильные ссылки в WSDL, нам необходимо явно указать внешний адрес публикации. Для этого отредактируем файл default.vrd, который находится в каталоге публикации веб-сервиса на стороне сервера базы данных. Нам нужно добавить атрибут publishURL в секцию point.

Рассмотрим пример настройки файла default.vrd:


<?xml version="1.0" encoding="UTF-8"?>
<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="/v1.0"
       ib="Srvr=&quot;localhost&quot;;Ref=&quot;MyBase&quot;;"
       publishURL="https://api.mysite.ru/v1.0/api.1cws">
    <ws>
        <point name="API" alias="api.1cws"/>
    </ws>
</point>

Важный момент: указание publishURL заставит сервер 1С подставлять в WSDL именно этот адрес. Теперь клиент, получив описание сервиса, поймет, что обращаться нужно к https://api.mysite.ru, запрос попадет на ваш прокси-сервер, а тот уже перенаправит его внутрь сети.

Причина 2: Проблемы SSL-терминации и заголовков (SSL Offloading)

Часто прокси-сервер принимает входящие соединения по защищенному протоколу HTTPS (с SSL-сертификатом от Let's Encrypt), а внутри локальной сети передает запрос на сервер 1С по обычному HTTP. Это называется SSL Offloading. Если сервер 1С не знает, что исходный запрос пришел по HTTPS, он может некорректно обрабатывать сессию или формировать обратные ссылки.

Решение 2: Настройка X-Forwarded-Proto в IIS

Нам необходимо убедиться, что модуль проксирования (Application Request Routing в IIS) передает информацию об исходном протоколе. Проверим настройки на офисном сервере-прокси:

  1. В диспетчере IIS перейдем в настройки Application Request Routing Cache.
  2. Откроем Server Settings.
  3. Убедимся, что включена опция "Reverse rewrite host in response headers".
  4. Добавим правило перенаправления заголовков (через URL Rewrite), чтобы сервер базы данных получал заголовок X-Forwarded-Proto: https.

Также проверим, что на сервере 1С в настройках IIS разрешено анонимное управление (Anonymous Authentication), если аутентификация пользователя 1С прописана непосредственно в строке соединения файла api.1cws.

Причина 3: Ограничения IIS на спецсимволы (Double Escaping)

Проанализируем специфику работы IIS. Иногда запросы к веб-сервисам 1С содержат в URL или параметрах специфические символы, которые IIS считает потенциально опасными. Это может приводить к блокировке запроса еще на уровне веб-сервера прокси, что внешне выглядит как таймаут или ошибка 404.

Решение 3: Разрешение двойного экранирования

На обоих серверах (прокси и сервере базы) выполним следующие действия в консоли управления IIS:

  1. Выберем сайт или конкретное виртуальное приложение 1С.
  2. Откроем раздел Request Filtering (Фильтрация запросов).
  3. В правой панели выберем Edit Feature Settings (Изменить параметры функции).
  4. Установим галочку в поле Allow double escaping (Разрешить двойное экранирование).
  5. Нажмем "ОК" и перезапустим IIS командой iisreset в командной строке.

Причина 4: Таймауты модуля ARR

Посмотрим на настройки времени ожидания. По умолчанию в модуле Application Request Routing (ARR) установлено время ожидания 30 секунд. Если база 1С долго выполняет запрос (например, при первом обращении происходит "прогрев" кэша или долгая авторизация), прокси-сервер просто разрывает соединение раньше времени.

Решение 4: Увеличение Proxy Timeout

Для изменения этого параметра выполним шаги:

  1. В IIS на уровне сервера зайдем в Application Request Routing Cache.
  2. Выберем Server Farms (если настроена ферма) или перейдем в настройки проксирования.
  3. Найдем пункт Time-out и увеличим его значение с 30 до 120 или более секунд (в зависимости от тяжести ваших запросов).

Практические советы по диагностике

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

  1. Проверка через SoapUI: Скачайте бесплатную утилиту SoapUI. Попробуйте импортировать WSDL по внешней ссылке https://api.mysite.ru/v1.0/api.1cws?wsdl. После импорта посмотрите, какой адрес указан в поле Endpoint в самой утилите. Если там локальный IP — возвращайтесь к настройке publishURL.
  2. Анализ логов IIS: Посмотрите файлы логов на прокси-сервере (обычно в C:\inetpub\logs\LogFiles\). Код ответа 200 означает успех, 502.3 — проблемы с получением ответа от внутреннего сервера (таймаут шлюза).
  3. Код инициализации прокси в 1С: Убедитесь, что при создании WSПрокси вы правильно используете защищенное соединение. Посмотрим на пример кода:

// Использование защищенного соединения для работы через HTTPS
Соединение = Новый ЗащищенноеСоединениеOpenSSL();

// Создание определения веб-сервиса
Определение = Новый WSОпределения("https://api.mysite.ru/v1.0/api.1cws?wsdl", , , , , Соединение);

// Создание прокси
// Обратите внимание на пространство имен и имя сервиса
WSПрокси = Новый WSПрокси(Определение, "http://api.mysite.ru", "API", "APISoap12");
WSПрокси.Пользователь = "MyApiUser";
WSПрокси.Пароль = "MyPass";

Попытка
    Результат = WSПрокси.Ping();
    Сообщить("Связь установлена: " + Результат);
Исключение
    Инфо = ИнформацияОбОшибке();
    Сообщить("Ошибка вызова: " + Инфо.Описание);
КонецПопытки;

Выясним важную деталь: использование WSОпределения позволяет платформе 1С заранее проанализировать структуру сервиса. Если на этапе создания WSОпределения ошибок нет, а WSПрокси зависает на вызове метода — значит, проблема именно в маршрутизации трафика между клиентом, прокси-сервером и сервером 1С, либо в неверных адресах внутри WSDL.

Подведем итог: чаще всего проблема кроется именно в адресе точки подключения. Платформа 1С "честно" сообщает клиенту в WSDL-файле свой локальный адрес, не подозревая о существовании прокси-сервера. Использование атрибута publishURL в файле default.vrd является самым быстрым и правильным способом решения этой задачи.

← На главную