При первой настройке и публикации веб-сервисов 1С на веб-сервере Microsoft IIS разработчики часто сталкиваются с ошибками инициализации: конструктор WSОпределения в коде 1С падает в исключение с кодом HTTP 500, в браузере при попытке открыть WSDL возвращается HTTP 401.5 или появляется сообщение «Сервис не найден». Разберем по шагам, почему возникают эти ошибки и как правильно настроить веб-сервис для стабильной работы.
Типовой сценарий обращения к веб-сервису из кода 1С выглядит следующим образом:
ПараметрыВебСервиса = Новый Структура;
ПараметрыВебСервиса.Вставить("ПутьПубликацииСервиса", "http://ИмяСервера/ИмяБазы/ws/GetPayData.1cws?wsdl");
ПараметрыВебСервиса.Вставить("Пользователь", "WsUser");
ПараметрыВебСервиса.Вставить("Пароль", "SecretPass");
ПараметрыВебСервиса.Вставить("Таймаут", 30);
Попытка
ВСОпределение = Новый WSОпределения(
ПараметрыВебСервиса.ПутьПубликацииСервиса,
ПараметрыВебСервиса.Пользователь,
ПараметрыВебСервиса.Пароль,,
ПараметрыВебСервиса.Таймаут
);
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("ВебСервис.Ошибка", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(Инфо));
ВызватьИсключение;
КонецПопытки;
Ошибка с кодом 500 Internal Server Error указывает на то, что сбой произошел на стороне целевой базы (сервера 1С), в которой опубликован веб-сервис. Основные причины:
Попытка ... Исключение, возвращает вызывающей стороне ошибку 500.Для локализации проблемы очистим метод сервиса от сложного кода и оставим минимальный рабочий ответ:
Функция ПолучитьДанные() Экспорт
Ответ = Новый Структура;
Ответ.Вставить("ДокументНайден", Ложь);
Возврат ЗначениеВСтрокуВнутр(Ответ);
КонецФункции
Рекомендуется выносить основную бизнес-логику из модуля веб-сервиса в отдельные общие серверные модули. В самом модуле веб-сервиса оставляем только прием параметров, вызов общего модуля и возврат результата.
Ошибка HTTP 401.5 - Unauthorized означает, что модуль ISAPI/CGI отклонил учетные данные до того, как они дошли до механизмов авторизации самой платформы 1С. Разберем правильную схему аутентификации:
IUSR) и группа IIS_IUSRS должны иметь права на чтение каталога публикации (C:\inetpub\wwwroot\ИмяБазы), каталога платформы bin (где лежит модуль wsisapi.dll), а также права на запись во временную папку C:\Windows\Temp.Если авторизация проходит успешно, но веб-сервер возвращает ответ «Сервис не найден», проверим следующие моменты:
/ИмяБазы//ws/GetPayData.1cws?wsdl) приводит к ошибке маршрутизации запроса модулем wsisapi.dll. Относительный путь должен быть строго разделен одиночными слэшами: /ИмяБазы/ws/GetPayData.1cws?wsdl.default.vrd: откроем файл публикации в каталоге на веб-сервере и убедимся, что узел <ws> содержит описание сервиса. Имя и псевдоним сервиса должны в точности (с учетом регистра) совпадать с именем в строке вызова:
<?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="/ИмяБазы"
ib="Srvr=Server1C;Ref=ИмяБазы;">
<ws enable="true">
<service name="GetPayData" alias="GetPayData.1cws" enable="true"/>
</ws>
</point>
Часто изменения в коде веб-сервиса, метаданных или в файле default.vrd не вступают в силу мгновенно, так как рабочий процесс IIS (w3wp.exe) кэширует WSDL-схему и состояние модуля. Это приводит к ситуации, когда код исправлен, но сервис продолжает выдавать ошибку.
После каждого изменения структуры веб-сервиса или повторной публикации через Конфигуратор необходимо выполнять перезапуск (Recycle) пула приложений в IIS либо перезапуск службы веб-сервера через командную строку от имени администратора:
iisreset
default.vrd на корректность имени и алиаса сервиса.IUSR и IIS_IUSRS выданы.True, для 64-битной — False.iisreset.http://ИмяСервера/ИмяБазы/ws/ИмяСервиса.1cws?wsdl.