Почему возникает ошибка «Превышено время ожидания» при подключении к веб-сервису 1С на IIS?

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

Проанализируем распространенную проблему, с которой сталкиваются разработчики и администраторы 1С при работе с веб-сервисами. Ошибка «Превышено время ожидания» при вызове конструктора WSОпределения часто возникает при попытке сервера 1С обратиться к собственному веб-сервису, опубликованному на локальном веб-сервере (IIS или Apache), в то время как со сторонних рабочих станций подключение проходит успешно.

Симптомы и диагностика проблемы

Рассмотрим характерные признаки такой ситуации:

  1. При вызове веб-сервиса с клиентского компьютера в локальной сети файл WSDL (по адресу вида http://x.x.x.x/servis/ws/dm.1cws?wsdl) успешно открывается в браузере, а вызовы WSОпределения выполняются штатно.
  2. При попытке выполнить аналогичный код в сеансе 1С, запущенном непосредственно на самом сервере приложений, происходит длительное зависание с последующим сообщением об ошибке «Превышено время ожидания».
  3. При попытке открыть опубликованную базу в браузере на самом сервере запуск останавливается на стартовом экране заставки, и форма авторизации не появляется.

Пример программного подключения через WSОпределения

Разберем базовый пример создания объекта WSОпределения для работы с веб-сервисом с использованием защищенного соединения и аутентификации:


ssl1 = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),
    Новый СертификатыУдостоверяющихЦентровWindows());

Определения = Новый WSОпределения("http://x.x.x.x/servis/ws/dm.1cws?wsdl", Логин, Пароль, , , ssl1);

Если используется незащищенное соединение (HTTP), параметр защищенного соединения передавать не требуется:


Определения = Новый WSОпределения("http://x.x.x.x/servis/ws/dm.1cws?wsdl", Логин, Пароль);

Основные причины локального зависания и способы их устранения

Выясним причины, почему сервер «не слышит» сам себя при обращении к локальному веб-сервису, и рассмотрим способы решения задачи.

1. Зависшие процессы веб-сервера и службы 1С

Распространенная причина — накопление зависших рабочих процессов IIS (w3wp.exe) или службы агента сервера 1С (ragent.exe), из-за чего пул приложений теряет способность обрабатывать новые входящие соединения от того же узла.

Решение: выполним перезапуск служб IIS (командой iisreset) и службы 1С:Предприятие. В случаях, когда процессы заблокированы на уровне операционной системы, требуется полная перезагрузка сервера.

2. Защита от зацикливания Windows (Loopback Check)

В операционных системах Windows Server встроен механизм безопасности Loopback Check, блокирующий NTLM-аутентификацию и локальные HTTP-запросы, если обращение происходит по IP-адресу или доменному имени на тот же самый узел.

Решение: отключим проверку зацикливания в реестре Windows:

  1. Откроем редактор реестра (regedit).
  2. Перейдем в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa.
  3. Создадим параметр DWORD с именем DisableLoopbackCheck и значением 1.

3. Взаимная блокировка (Deadlock) в пуле приложений IIS

Если вызов веб-сервиса выполняется из контекста той же базы 1С, опубликованной на IIS, новый запрос поступает в тот же пул приложений. При нехватке рабочих процессов возникает мертвая блокировка: вызывающий процесс ждет ответа от веб-сервиса, а IIS не может выделить поток для обработки входящего запроса.

Решение: выделим опубликованную базу в отдельный пул приложений в консоли IIS и установим для параметра Загрузить профиль пользователя (Load User Profile) значение False.

4. Особенности файловых баз и таймауты

При работе с файловой базой данные обрабатываются последовательно. Длительный вызов из одного сеанса блокирует обработку других веб-запросов. Для предотвращения зависания при отсутствии ответа целесообразно использовать объект HTTPСоединение вместо WSОпределения, так как он позволяет явно задавать время ожидания с помощью метода УстановитьТаймаут().

← На главную