При первой публикации собственного HTTP-сервиса 1С на веб-сервере Internet Information Services (IIS) разработчики часто сталкиваются с пугающим сообщением Ошибка HTTP 500.0 - Internal Server Error или сопутствующей ошибкой HTTP 401.2 - Unauthorized. Проблема осложняется тем, что встроенный отладчик 1С на этом этапе не срабатывает, так как веб-запрос "падает" еще на подступах к платформе, внутри самого веб-сервера IIS.
В этой статье мы подробно и по шагам разберем комплексную диагностику этой проблемы, выявим все скрытые причины и восстановим работоспособность нашего сервиса.
Начнем с самой банальной, но критически важной детали, на которую часто не обращают внимания. Веб-сервер IIS и платформа 1С крайне чувствительны к регистру символов в путях URL. Если ваша информационная база опубликована под именем UTP, а корневой URL вашего HTTP-сервиса в конфигураторе задан как Test, то обращение по адресу http://localhost/utp/hs/test вернет ошибку.
Давайте проанализируем правильную структуру формирования адреса для HTTP-сервиса 1С:
http://[ИмяСервера]/[ИмяПубликации]/hs/[КорневойURLСервиса]/[ШаблонURL]
Разберем это правило по шагам:
UTP).ws для SOAP Web-сервисов).Test).get или data). Если шаблон настроен как /get, то итоговый адрес должен заканчиваться именно так.Таким образом, вместо неверного пути http://localhost/utp/hs/test мы должны использовать строго соответствующий регистру адрес: http://localhost/UTP/hs/Test/get.
Если после исправления регистра в URL вместо ошибки 500.0 вы получили Ошибка HTTP 401.2 - Unauthorized, это означает, что веб-сервер требует проверки подлинности пользователя, но не может её выполнить с текущими настройками.
Если в этот момент просто отключить в настройках IIS проверку подлинности Windows и оставить только "Анонимный доступ", мы снова вернемся к ошибке 500.0. Происходит это потому, что IIS пытается зайти в базу под анонимным пользователем, но в самой базе 1С настроен список пользователей с паролями. Механизм HTTP-сервисов в 1С спроектирован так, что он не может интерактивно отобразить диалоговое окно ввода логина и пароля, как это делает Web-клиент. В результате 1С аварийно завершает сессию, а IIS транслирует это как ошибку 500.0.
Выясним, как правильно решить эту проблему. У нас есть два пути:
Вариант А. Прописать сервисного пользователя по умолчанию
Мы можем жестко указать учетную запись 1С, под которой будут выполняться все запросы к HTTP-сервису. Для этого найдем в папке публикации (по умолчанию C:\inetpub\wwwroot\UTP) конфигурационный файл default.vrd и откроем его через любой текстовый редактор. Нам необходимо отредактировать тег point, добавив в него атрибуты пользователя usr и пароля pwd:
<?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="/UTP"
ib="File="C:\Bases\UTP";"
usr="WebUser"
pwd="SecretPassword">
<ws/>
<httpServices>
<service name="Test" rootUrl="Test" enable="true"/>
</httpServices>
</point>
Убедимся, что у пользователя WebUser в базе 1С достаточно прав для выполнения операций в HTTP-сервисе, а в его роли отмечено право "Администрирование данных" или специализированные права на работу с HTTP-сервисами.
Вариант Б. Использовать Basic-авторизацию в запросе
Если жестко прописывать пользователя в файле конфигурации нельзя из соображений безопасности, мы должны передавать авторизационные данные непосредственно в заголовке HTTP-запроса от клиента (например, из утилиты Postman или сторонней системы). Для этого в заголовки запроса добавляется стандартный заголовок Authorization с типом Basic, где логин и пароль пользователя 1С передаются в кодировке Base64.
Ошибка 500.0 очень часто оказывается следствием банальной нехватки прав доступа операционной системы Windows к исполняемым файлам 1С и каталогу базы данных (при файловом варианте работы).
Процессы IIS выполняются от имени специального пользователя пула приложений (например, IIS_IUSRS или IUSR). Нам необходимо убедиться, что эти пользователи имеют полные права на чтение и выполнение в ключевых каталогах системы. Настроим права по шагам:
C:\Program Files\1cv8 (или конкретной версии платформы, например C:\Program Files\1cv8\8.3.22.1709\bin). На вкладке "Безопасность" добавим группу пользователей IIS_IUSRS и предоставим им права "Чтение и выполнение", "Список содержимого папки" и "Чтение".IIS_IUSRS и предоставим ей права "Изменение", "Чтение и выполнение", "Список содержимого", "Чтение", "Запись". Это критично, так как IIS должен иметь физическую возможность вносить изменения в файл базы данных 1Cv8.1CD и создавать файлы блокировок 1Cv8.1CL.IIS_IUSRS имеет права на чтение файлов в папке C:\inetpub\wwwroot\UTP, где лежат конфигурационные файлы default.vrd и web.config.C:\Windows\Temp. Перейдем в свойства папки Temp и предоставим группе IIS_IUSRS права на чтение, запись и изменение. Без этих прав вы гарантированно получите ошибку 500.0 при попытке вернуть из HTTP-сервиса большой объем данных.Рассмотрим аппаратную причину возникновения сбоя. Если вы опубликовали HTTP-сервис из 32-разрядного конфигуратора 1С (x86) на 64-битной операционной системе Windows, IIS попытается запустить соответствующую 32-битную библиотеку wsapi.dll (или wsap24.dll).
По умолчанию 64-битный веб-сервер IIS запрещает исполнение 32-битных расширений ISAPI в стандартном пуле приложений, что моментально вызывает ошибку 500.0 при первом же обращении.
Для исправления этой ситуации выполним следующие действия:
DefaultAppPool).Проанализируем ситуацию, упомянутую автором на форуме: на одном и том же сервере успешно работает веб-клиент другой базы 1С, но ломается новый HTTP-сервис. Это классический признак конфликта версий платформ 1С.
Если обе публикации привязаны к одному и тому же пулу приложений IIS, веб-сервер не может одновременно загрузить в память разные версии библиотек (например, от платформы 8.3.18 и 8.3.22). Тот сервис, к которому обратились первым после перезапуска IIS, займет пул, а второй начнет выдавать ошибку 500.0.
Для решения этой проблемы разделим базы по разным пулам приложений:
AppPool_UTP.UTP.AppPool_UTP.wsap24.dll для обеих версий платформы.Если все вышеперечисленные шаги выполнены, но ошибка 500.0 сохраняется, нам необходимо локализовать причину с помощью системных логов Windows. Код 500.0 — это слишком общий ответ веб-сервера. Чтобы узнать технический подкод ошибки, выполним следующие шаги:
Win + R, введите eventvwr.msc и нажмите Enter для открытия "Просмотра событий".IIS-W3SVC-WP или 1C:Enterprise.0x800700c1 четко укажет на проблему несовместимости разрядности (32/64 бит), а ошибки файловой системы укажут на конкретный путь, к которому у IIS нет прав доступа.Дополнительно мы можем включить отображение подробных ошибок непосредственно в браузере. Для этого в диспетчере IIS перейдем в настройки нашей публикации, откроем раздел Страницы ошибок (Error Pages) -> Изменить параметры функции (Edit Feature Settings) и установим переключатель в положение Подробные ошибки (Detailed errors). Теперь при отправке локального запроса IIS выдаст детальную страницу с указанием конкретного модуля и обработчика, вызвавшего сбой.