Как устранить ошибки 500, 401.5 и «Сервис не найден» при публикации веб-сервиса 1С на IIS

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

При первой настройке и публикации веб-сервисов 1С на веб-сервере Microsoft IIS разработчики часто сталкиваются с ошибками инициализации: конструктор WSОпределения в коде 1С падает в исключение с кодом HTTP 500, в браузере при попытке открыть WSDL возвращается HTTP 401.5 или появляется сообщение «Сервис не найден». Разберем по шагам, почему возникают эти ошибки и как правильно настроить веб-сервис для стабильной работы.

Типовой сценарий обращения к веб-сервису из кода 1С выглядит следующим образом:


ПараметрыВебСервиса = Новый Структура;
ПараметрыВебСервиса.Вставить("ПутьПубликацииСервиса", "http://ИмяСервера/ИмяБазы/ws/GetPayData.1cws?wsdl");
ПараметрыВебСервиса.Вставить("Пользователь", "WsUser");
ПараметрыВебСервиса.Вставить("Пароль", "SecretPass");
ПараметрыВебСервиса.Вставить("Таймаут", 30);

Попытка
    ВСОпределение = Новый WSОпределения(
        ПараметрыВебСервиса.ПутьПубликацииСервиса,
        ПараметрыВебСервиса.Пользователь,
        ПараметрыВебСервиса.Пароль,,
        ПараметрыВебСервиса.Таймаут
    );
Исключение
    Инфо = ИнформацияОбОшибке();
    ЗаписьЖурналаРегистрации("ВебСервис.Ошибка", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(Инфо));
    ВызватьИсключение;
КонецПопытки;

Причина 1. Ошибки компиляции и выполнения кода веб-сервиса (HTTP 500)

Ошибка с кодом 500 Internal Server Error указывает на то, что сбой произошел на стороне целевой базы (сервера 1С), в которой опубликован веб-сервис. Основные причины:

  1. Синтаксические ошибки и директивы компиляции: если модуль веб-сервиса содержит синтаксическую ошибку, платформа не может скомпилировать WSDL-описание сервиса при получении внешнего запроса.
  2. Ошибки времени выполнения: исключение внутри тела вызванной экспортной функции веб-сервиса, не перехваченное блоком Попытка ... Исключение, возвращает вызывающей стороне ошибку 500.

Для локализации проблемы очистим метод сервиса от сложного кода и оставим минимальный рабочий ответ:


Функция ПолучитьДанные() Экспорт
    Ответ = Новый Структура;
    Ответ.Вставить("ДокументНайден", Ложь);
    Возврат ЗначениеВСтрокуВнутр(Ответ);
КонецФункции

Рекомендуется выносить основную бизнес-логику из модуля веб-сервиса в отдельные общие серверные модули. В самом модуле веб-сервиса оставляем только прием параметров, вызов общего модуля и возврат результата.

Причина 2. Ошибка авторизации HTTP 401.5 в IIS

Ошибка HTTP 401.5 - Unauthorized означает, что модуль ISAPI/CGI отклонил учетные данные до того, как они дошли до механизмов авторизации самой платформы 1С. Разберем правильную схему аутентификации:

  1. В диспетчере служб IIS для каталога опубликованного приложения 1С должна быть включена Анонимная проверка подлинности (Anonymous Authentication).
  2. Все остальные типы аутентификации (Windows Authentication, Basic Authentication) на уровне IIS должны быть отключены, если проверка логина и пароля возлагается на пользователей базы 1С.
  3. Учетная запись анонимного доступа (IUSR) и группа IIS_IUSRS должны иметь права на чтение каталога публикации (C:\inetpub\wwwroot\ИмяБазы), каталога платформы bin (где лежит модуль wsisapi.dll), а также права на запись во временную папку C:\Windows\Temp.

Причина 3. Сообщение «Сервис не найден» и двойные слэши в URL

Если авторизация проходит успешно, но веб-сервер возвращает ответ «Сервис не найден», проверим следующие моменты:

  1. Корректность URL: обратим внимание на путь публикации. Наличие двойных слэшей (например, /ИмяБазы//ws/GetPayData.1cws?wsdl) приводит к ошибке маршрутизации запроса модулем wsisapi.dll. Относительный путь должен быть строго разделен одиночными слэшами: /ИмяБазы/ws/GetPayData.1cws?wsdl.
  2. Файл публикации 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>

Причина 4. Кэширование пула приложений IIS

Часто изменения в коде веб-сервиса, метаданных или в файле default.vrd не вступают в силу мгновенно, так как рабочий процесс IIS (w3wp.exe) кэширует WSDL-схему и состояние модуля. Это приводит к ситуации, когда код исправлен, но сервис продолжает выдавать ошибку.

После каждого изменения структуры веб-сервиса или повторной публикации через Конфигуратор необходимо выполнять перезапуск (Recycle) пула приложений в IIS либо перезапуск службы веб-сервера через командную строку от имени администратора:

iisreset

Чек-лист для гарантированного запуска веб-сервиса

  1. Запускаем Конфигуратор целевой базы от имени локального администратора.
  2. Выполняем публикацию на веб-сервере («Администрирование» — «Публикация на веб-сервере»), убедившись, что флаг напротив нужного веб-сервиса установлен.
  3. Проверяем файл default.vrd на корректность имени и алиаса сервиса.
  4. Убеждаемся, что в IIS для сайта включена только анонимная аутентификация, а права для IUSR и IIS_IUSRS выданы.
  5. В диспетчере IIS проверяем разрядность пула приложений: для 32-битной платформы 1С параметр «Разрешены 32-разрядные приложения» должен быть равен True, для 64-битной — False.
  6. Перезапускаем пул приложений IIS командой iisreset.
  7. Проверяем доступность WSDL-описания через браузер по адресу: http://ИмяСервера/ИмяБазы/ws/ИмяСервиса.1cws?wsdl.
← На главную