Как исправить периодическую ошибку 500 при обращении к HTTPS-сервису 1С на IIS

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

Ситуация, когда HTTP-сервис 1С стабильно работает на локальной машине, но периодически возвращает ошибку 500 (Internal Server Error) при обращении с другого сервера, является классической проблемой настройки связки IIS + 1С. Особенно часто это проявляется при использовании Windows-аутентификации и протокола HTTPS. Рассмотрим детально, почему запрос может «отваливаться» на стороне веб-сервера, даже не доходя до Журнала регистрации 1С, и как это исправить.

Проверка прохождения запроса до уровня 1С

Прежде чем приступать к глубоким настройкам сервера, нам необходимо убедиться, что проблема локализована именно в IIS или модуле расширения веб-сервера (wsap22.dll). Разберем методику «пустой функции», которую применили участники обсуждения. Создадим в HTTP-сервисе метод, который не выполняет никакой бизнес-логики, а сразу возвращает статус 200.


Функция ТестовыйЗапрос(Запрос)
    // Записываем событие в Журнал регистрации для фиксации факта дохождения запроса
    ЗаписьЖурналаРегистрации("HTTP.Тест", УровеньЖурналаРегистрации.Информация, , , "Запрос получен сервером 1С");
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки("OK");
    Возврат Ответ;
КонецФункции

Если при получении ошибки 500 в Журнале регистрации 1С отсутствует запись «Запрос получен сервером 1С», это однозначно указывает на то, что IIS прервал обработку запроса раньше, чем передал его в 1С. В этом случае копать код конфигурации бессмысленно — проблема в инфраструктуре.

Диагностика с помощью Failed Request Tracing (FRT)

Когда стандартные логи IIS (находящиеся обычно в C:\inetpub\logs\LogFiles) содержат лишь сухую запись об ошибке 500, проанализируем ситуацию с помощью инструмента Failed Request Tracing. Это самый мощный способ увидеть «внутреннюю кухню» обработки HTTP-пакета.

  1. В диспетчере IIS выберите ваш сайт и откройте раздел «Трассировка неудачных запросов» (Failed Request Tracing).
  2. Добавьте правило для кода состояния 500.
  3. Выполните запрос, который вызывает ошибку, и откройте сформированный XML-отчет в браузере.

В отчете нас интересует раздел VIEW_TRACE_TOP. Если вы видите, что ошибка произошла на модуле IsapiModule, значит, проблема в загрузке или работе библиотеки 1С. Если же сбой произошел на WindowsAuthenticationModule, то причина в правах доступа или сетевых токенах.

Проблема Kerberos и размера токена авторизации

При использовании Windows-аутентификации в корпоративной среде пользователи часто состоят во множестве групп Active Directory. Это приводит к раздуванию заголовка авторизации Authorization: Negotiate.... Если размер этого заголовка превышает лимиты HTTP.sys, сервер вернет ошибку до того, как 1С узнает о запросе.

Выясним причину, проверив параметры реестра на сервере IIS. Рассмотрим путь HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters. Попробуем увеличить следующие ключи (тип DWORD):

После внесения изменений в реестр обязательна перезагрузка сервера (или службы HTTP через net stop http / net start http), так как эти параметры считываются драйвером при старте.

Настройка пула приложений и 64-битной платформы

Проанализируем настройки пула приложений (Application Pool), в котором работает публикация 1С. Одной из частых причин «временных» ошибок является Recycling (переработка) пула. Если пул настроен на частую перезагрузку по времени или по потреблению памяти, то в момент смены рабочих процессов w3wp.exe первые запросы могут получать 500-ю ошибку.

Важные настройки пула:

  1. Enable 32-Bit Applications: Если вы используете 64-битную версию платформы 1С, этот параметр ОБЯЗАТЕЛЬНО должен быть установлен в False. Как отмечено в обсуждении, включение 32-битного режима на 64-битной платформе гарантированно ведет к ошибке 500.
  2. Managed Pipeline Mode: Для 1С рекомендуется использовать Integrated (интегрированный режим).
  3. Identity: Убедитесь, что учетная запись, под которой запускается пул, имеет права Full Control на папку C:\Windows\Temp и права чтения/выполнения на папку bin платформы 1С.

Проверка сертификатов и списков отзыва (CRL)

Поскольку сервис работает по HTTPS, IIS выполняет проверку валидности SSL-сертификата. Посмотрим на ситуацию с точки зрения сервера: если сертификат выдан внутренним центром сертификации (CA), IIS при каждом запросе пытается проверить список отзыва (CRL). Если у сервера нет доступа к контроллеру домена или внешней ссылке CRL, запрос может завершиться по таймауту с ошибкой 500.

Что нужно сделать:

Отладка на стороне клиента 1С

Чтобы окончательно понять, что возвращает сервер, когда 1С выдает 500, проанализируем тело ответа на стороне вызывающего сервера. Часто IIS передает в теле ответа подробное описание ошибки (например, «Module: IsapiModule, Notification: ExecuteRequestHandler»), которое мы не видим в обычном логе.


Попытка
    Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
    Если Ответ.КодСостояния <> 200 Тогда
        // Читаем тело ошибки 500, там может быть важная информация от IIS
        ТекстОшибки = Ответ.ПолучитьТелоКакСтроку("UTF-8");
        ЗаписьЖурналаРегистрации("HTTP.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
    КонецЕсли;
Исключение
    Инфо = ИнформацияОбОшибке();
    // Обработка сетевых исключений
КонецПопытки

Права доступа к временным папкам

Нехватка прав на создание временных файлов — одна из самых неочевидных причин спорадических ошибок 500. При Windows-аутентификации может происходить олицетворение (Impersonation). Это значит, что 1С пытается работать под правами того пользователя, который обратился к сервису. Если у этого пользователя нет прав на системную временную папку или папку с конфигурацией 1С (при файловом варианте), возникнет ошибка. Проанализируем права доступа для группы Users или IIS_IUSRS на папку C:\Windows\Temp — они должны быть достаточными для записи и удаления файлов.

← На главную