Проанализируем распространенную проблему, с которой сталкиваются разработчики и администраторы 1С при работе с веб-сервисами. Ошибка «Превышено время ожидания» при вызове конструктора WSОпределения часто возникает при попытке сервера 1С обратиться к собственному веб-сервису, опубликованному на локальном веб-сервере (IIS или Apache), в то время как со сторонних рабочих станций подключение проходит успешно.
Рассмотрим характерные признаки такой ситуации:
http://x.x.x.x/servis/ws/dm.1cws?wsdl) успешно открывается в браузере, а вызовы 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", Логин, Пароль);
Выясним причины, почему сервер «не слышит» сам себя при обращении к локальному веб-сервису, и рассмотрим способы решения задачи.
Распространенная причина — накопление зависших рабочих процессов IIS (w3wp.exe) или службы агента сервера 1С (ragent.exe), из-за чего пул приложений теряет способность обрабатывать новые входящие соединения от того же узла.
Решение: выполним перезапуск служб IIS (командой iisreset) и службы 1С:Предприятие. В случаях, когда процессы заблокированы на уровне операционной системы, требуется полная перезагрузка сервера.
В операционных системах Windows Server встроен механизм безопасности Loopback Check, блокирующий NTLM-аутентификацию и локальные HTTP-запросы, если обращение происходит по IP-адресу или доменному имени на тот же самый узел.
Решение: отключим проверку зацикливания в реестре Windows:
regedit).HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa.DisableLoopbackCheck и значением 1.Если вызов веб-сервиса выполняется из контекста той же базы 1С, опубликованной на IIS, новый запрос поступает в тот же пул приложений. При нехватке рабочих процессов возникает мертвая блокировка: вызывающий процесс ждет ответа от веб-сервиса, а IIS не может выделить поток для обработки входящего запроса.
Решение: выделим опубликованную базу в отдельный пул приложений в консоли IIS и установим для параметра Загрузить профиль пользователя (Load User Profile) значение False.
При работе с файловой базой данные обрабатываются последовательно. Длительный вызов из одного сеанса блокирует обработку других веб-запросов. Для предотвращения зависания при отсутствии ответа целесообразно использовать объект HTTPСоединение вместо WSОпределения, так как он позволяет явно задавать время ожидания с помощью метода УстановитьТаймаут().