Как устранить ошибки 404 и 403 при публикации HTTP-сервисов 1С на IIS?

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

При работе с платформой 1С:Предприятие и интеграции её с внешними системами часто возникает необходимость в публикации HTTP-сервисов. Для реализации этой задачи есть инструмент создания полноценного REST API в 1С. Однако, этот процесс может сопровождаться различными трудностями, в частности, ошибками 404 (Not Found) и 403 (Forbidden) при обращении к опубликованным сервисам. В этой статье мы подробно разберем, почему возникают эти ошибки и как их эффективно устранить, основываясь на практическом опыте и рекомендациях.

Рассмотрим сценарий, когда база 1С успешно опубликована на веб-сервере IIS (например, IIS 10), но попытки обращения к HTTP-сервисам завершаются ошибкой 404, а затем, после частичного решения, ошибкой 403. Это типичная ситуация для разработчиков и системных администраторов, настраивающих взаимодействие между 1С и внешними API, такими как сервисы Яндекс.Маркета или других маркетплейсов. Для таких случаев есть анализ прав доступа и отладка кода 1С.

Устранение ошибки 404 (Сервис не найден)

Ошибка 404 означает, что запрашиваемый ресурс не найден на сервере. При публикации HTTP-сервисов 1С это часто указывает на некорректный URL-адрес в запросе или неверные настройки публикации. Разберем наиболее частые причины и способы их устранения.

  1. Чувствительность к регистру в rootUrl.

    Одной из наиболее распространенных и коварных причин ошибки 404 является несоответствие регистра символов в корневом URL HTTP-сервиса. Некоторые веб-серверы, в частности IIS в определённых конфигурациях, могут быть чувствительны к регистру URL-адресов. Если в конфигурации 1С или в файле публикации (default.vrd) корневой URL указан с использованием заглавных букв (например, "Beru_API"), а в запросе используется иной регистр (например, "beru_api"), это может привести к тому, что сервис не будет найден.

    Практический пример:

    Изначально в файле default.vrd сервис был описан так:

    
    <httpServices>
        <service name="Беру_ПолучениеЗаказовПоAPI"
                 rootUrl="Beru_API"
                 enable="true"
                 reuseSessions="autouse"
                 sessionMaxAge="20"
                 poolSize="10"
                 poolTimeout="5"/>
    </httpServices>
    

    При этом запрос выполнялся к URL, содержащему /beru_api/. После изменения rootUrl на полностью строчный регистр, проблема была решена:

    
    <httpServices>
        <service name="Беру_ПолучениеЗаказовПоAPI"
                 rootUrl="beru_api"
                 enable="true"
                 reuseSessions="autouse"
                 sessionMaxAge="20"
                 poolSize="10"
                 poolTimeout="5"/>
    </httpServices>
    

    Что делать: Всегда используйте строчные буквы для rootUrl как в конфигурации 1С, так и в файле default.vrd и, соответственно, в запросах к сервису. После любых изменений в файле default.vrd, обязательно перезапустите веб-сервер IIS, чтобы изменения вступили в силу.

  2. Обязательный сегмент /hs/ в URL.

    Для обращения к HTTP-сервисам 1С сегмент /hs/ в пути является обязательным. Он сигнализирует серверу 1С о том, что запрос предназначен именно для HTTP-сервиса, а не для обычного веб-файла или веб-сервиса (SOAP). Полный URL для обращения к HTTP-сервису обычно имеет вид:

    https://<Имя хоста веб-сервера>/<Имя виртуального каталога>/hs/<Корневой URL HTTP-сервиса>/<Шаблон URL>

    Например, если ваша база опубликована как "ut10_base", а корневой URL сервиса "beru_api", с шаблоном "getyml/1", то полный URL будет:

    https://ваш_сервер/ut10_base/hs/beru_api/getyml/1

    Что делать: Убедитесь, что в ваших запросах всегда присутствует сегмент /hs/ после имени виртуального каталога и перед корневым URL HTTP-сервиса.

  3. Проблемы с публикацией или перезапуском веб-сервера.

    После любых изменений в конфигурации 1С, касающихся HTTP-сервисов, или ручного редактирования файла default.vrd, необходимо переопубликовать базу и/или перезапустить пул приложений IIS, связанный с публикацией, а затем и сам веб-сервер. Без этого изменения не вступят в силу, и вы продолжите получать ошибку 404.

    Что делать: Регулярно перезапускайте веб-сервер после изменений. Убедитесь, что файл wsisapi.dll (для IIS) или `wsap*.dll` (для Apache) корректно указан в сопоставлениях обработчиков веб-сервера и имеет актуальную версию, соответствующую платформе 1С.

  4. Несоответствие корневого URL и шаблона.

    Убедитесь, что URL, указанный в запросе, точно совпадает с корневым URL и шаблоном, определенными в конфигурации 1С и в файле default.vrd. Любое несоответствие (лишний символ, опечатка) приведет к ошибке 404.

Устранение ошибки 403 (Доступ запрещен)

После успешного устранения ошибки 404 вы можете столкнуться с ошибкой 403. Эта ошибка означает, что сервер понял запрос, но отказывается предоставить доступ к запрошенному ресурсу. Причины могут быть как в самой 1С (права пользователя), так и в настройках веб-сервера или некорректности запроса.

  1. Некорректные параметры запроса.

    Как это ни парадоксально, но ошибка 403 может быть возвращена сервером 1С, если в запросе переданы неверные или ожидаемые параметры. Сервер может интерпретировать отсутствие или некорректность обязательных параметров как попытку несанкционированного доступа или некорректного использования сервиса, блокируя дальнейшую обработку.

    Практический пример из обсуждения: Пользователь обнаружил, что ошибка 403 возвращалась "при передаче неверного параметра". Это означает, что логика HTTP-сервиса в 1С или его предобработчик на сервере 1С выявил проблему с входными данными и вместо ошибки типа 400 (Bad Request) вернул 403.

    Что делать:

    • Тщательно проверьте документацию по API, к которому вы обращаетесь. Убедитесь, что все обязательные параметры переданы, их имена и типы данных соответствуют ожиданиям.
    • Используйте инструменты для отладки запросов, такие как Postman или Fiddler, чтобы детально просмотреть структуру вашего запроса (заголовки, тело, URL-параметры) и сравнить её с требованиями API. Поможет расширение анализа HTTP-запросов и ответов в 1С.
    • Отладьте код обработчика HTTP-сервиса в 1С. Поставьте точки останова в соответствующем методе (например, в обработчике GET или POST для вашего шаблона) и проанализируйте значения входящих параметров. Это позволит точно определить, какие параметры приходят некорректно.
  2. Недостаточные права пользователя 1С. — решает задачу универсальная настройка и аудит прав доступа пользователей

    Ошибка 403 Forbidden часто указывает на то, что пользователь, от имени которого осуществляется вызов HTTP-сервиса, не имеет необходимых прав доступа в конфигурации 1С. Для корректной работы HTTP-сервиса пользователю должны быть предоставлены следующие права:

    • Права на сам объект "HTTP-сервис".
    • Права на конкретные методы (GET, POST, PUT, DELETE) в рамках шаблонов этого HTTP-сервиса.
    • Права на объекты метаданных (справочники, документы, регистры), с которыми работает логика HTTP-сервиса.

    Что делать:

    • Создайте отдельного служебного пользователя в 1С для внешних информационных систем.
    • Назначьте этому пользователю минимально необходимые роли и права доступа, достаточные только для работы с данным HTTP-сервисом и связанными данными.
    • В окне "Управление HTTP-сервисами" в конфигураторе, для каждого метода сервиса, проверьте и установите необходимую аутентификацию и права.
  3. Настройки аутентификации на веб-сервере (IIS).

    IIS предлагает различные методы аутентификации. Если в настройках публикации 1С не указаны логин и пароль для подключения к базе, а на веб-сервере отключена анонимная аутентификация или настроена строгая аутентификация, то доступ может быть запрещен.

    Что делать:

    • Анонимная аутентификация: В большинстве случаев для 1С HTTP-сервисов используется анонимная аутентификация на уровне IIS, а сама аутентификация пользователя 1С происходит уже внутри платформы через передачу логина/пароля в заголовках или теле запроса, либо через механизм токенов. Убедитесь, что для вашего виртуального каталога в IIS включена "Анонимная проверка подлинности".
    • Аутентификация пула приложений: Проверьте, под какой учетной записью работает пул приложений IIS. Эта учетная запись должна иметь права на чтение файлов публикации 1С и, при необходимости, доступ к серверу 1С.
    • Строка подключения в default.vrd: В файле default.vrd может быть указана строка подключения к базе 1С, включая пользователя и пароль для доступа к информационной базе (параметр ib="Srvr=...").
      
      <?xml version="1.0" encoding="UTF-8"?>
      <v8:application xmlns:v8="http://v8.1c.ru/8.1/data/application"
                     xmlns:xs="http://www.w3.org/2001/XMLSchema"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     ib="Srvr="ваш_сервер_1с";Ref="имя_базы";Usr="имя_пользователя_1с";Pwd="пароль_пользователя_1с""
                     baseRoute="/имя_виртуального_каталога"
                     appRunMode="Normal"
                     version="8.3"
                     protocol="http">
          <httpServices>
              <service name="Беру_ПолучениеЗаказовПоAPI"
                       rootUrl="beru_api"
                       enable="true"
                       reuseSessions="autouse"
                       sessionMaxAge="20"
                       poolSize="10"
                       poolTimeout="5"/>
          </httpServices>
      </v8:application>
      

      Важно понимать, что пользователь, указанный в параметре ib, используется для установления сессии с сервером 1С для публикации базы в целом, а не для аутентификации каждого отдельного запроса к HTTP-сервису. Для аутентификации HTTP-сервисов обычно используются HTTP-заголовки (Basic или Bearer аутентификация) или OAuth2-токены.

    • Использование токенов доступа (OAuth 2.0). Для более безопасной и гибкой аутентификации внешних программ рекомендуется использовать токены доступа. Внешняя программа сначала получает токен аутентификации (например, через POST-запрос с grant_type=CLIENT_CREDENTIALS и заголовком Authorization: Basic <Base64(ClientId:ClientSecret)>), а затем использует этот токен в заголовке Authorization: Bearer <токен> при вызове HTTP-сервиса. Токен обычно действителен ограниченное время, после чего требуется получить новый.
  4. Конфигурация IIS или Apache.

    На веб-сервере могут быть настроены правила, запрещающие доступ к определенным каталогам или файлам (например, через модули URL Rewrite для IIS или `.htaccess` для Apache). Также, если веб-сервер настроен не формировать список содержимого каталога, может возникать ошибка 403.14.

    Что делать: Проверьте настройки безопасности вашего веб-сервера. Убедитесь, что нет блокирующих правил для виртуального каталога с публикацией 1С.

Публикация HTTP-сервисов отдельным файлом (.1cws)

Возникает вопрос, можно ли оформить HTTP-сервис отдельным файлом, как это делается для веб-сервисов (SOAP) с расширением .1cws. Рассмотрим эту возможность.

В отличие от веб-сервисов (SOAP), для HTTP-сервисов 1С нет прямого аналога файла .1cws, который бы создавался конфигуратором для отдельной публикации. HTTP-сервисы всегда описываются в файле default.vrd, который находится в каталоге публикации базы. Для комфортного управления файлами default.vrd и автоматизации работы с веб-сервером можно использовать приложение для управления публикациями баз 1С.

Тем не менее, если вы разрабатываете HTTP-сервис в расширении конфигурации 1С, после его создания и публикации расширения, информация о сервисе должна появиться в файле default.vrd. Если этого не произошло автоматически (например, при ручной публикации), вы можете вручную отредактировать файл default.vrd, добавив соответствующую секцию <service> внутри блока <httpServices>.

Пример ручного добавления HTTP-сервиса в default.vrd:

Предположим, у вас есть HTTP-сервис "МойСервис" с корневым URL "myapi". Вам нужно добавить следующую секцию:


<?xml version="1.0" encoding="UTF-8"?>
<v8:application xmlns:v8="http://v8.1c.ru/8.1/data/application"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               ib="Srvr="ваш_сервер_1с";Ref="имя_базы""
               baseRoute="/имя_виртуального_каталога"
               appRunMode="Normal"
               version="8.3"
               protocol="http">
    <httpServices>
        <service name="МойСервис"
                 rootUrl="myapi"
                 enable="true"
                 reuseSessions="autouse"
                 sessionMaxAge="20"
                 poolSize="10"
                 poolTimeout="5"/>
        <!-- Здесь могут быть другие HTTP-сервисы -->
    </httpServices>
</v8:application>

После ручного редактирования файла default.vrd необходимо обязательно перезапустить веб-сервер IIS, чтобы изменения были применены. Этот подход позволяет гибко управлять публикацией HTTP-сервисов, особенно при работе с расширениями или в нестандартных сценариях.

Общая информация и рекомендации по HTTP-сервисам 1С

Чтобы минимизировать проблемы при работе с HTTP-сервисами, полезно учитывать следующие аспекты:

  1. Отличие HTTP-сервисов от веб-сервисов (SOAP): HTTP-сервисы (REST) ориентированы на "ресурсы", предлагают простоту программирования клиента, меньший объем передаваемых данных и меньшую вычислительную нагрузку, что делает их идеальными для мобильных приложений и взаимодействия между системами. Веб-сервисы (SOAP) ориентированы на "действия" и используют более формализованный, но и более сложный XML-формат.
  2. Файлы публикации: При публикации базы 1С на веб-сервере всегда должны присутствовать файлы *.wsdd (описывающие структуру базы) и *.vrd (описывающие HTTP-сервисы и веб-сервисы).
  3. Инструменты тестирования: Для тестирования HTTP-сервисов крайне удобно использовать такие инструменты, как Postman или командную утилиту curl. Они позволяют быстро формировать запросы с различными методами (GET, POST), заголовками и телами, а также анализировать ответы сервера.
  4. Права доступа: Права доступа для HTTP-сервисов в 1С могут быть настроены на нескольких уровнях:
    • На уровне всего HTTP-сервиса.
    • На уровне отдельного URL-шаблона.
    • На уровне отдельного HTTP-метода (GET, POST и т.д.) внутри шаблона.
    Это дает гибкость в управлении безопасностью.
  5. Создание HTTP-сервиса в конфигурации 1С: При создании HTTP-сервиса в конфигурации 1С вы устанавливаете свойство "Корневой URL", которое определяет группу ресурсов. Затем для каждого сервиса создаются шаблоны URL (например, /getyml/{версия}) и HTTP-методы (GET, POST и т.д.) с соответствующими обработчиками на языке 1С.

Следуя этим рекомендациям и тщательно проверяя каждый шаг публикации и настройки, вы сможете эффективно устранять проблемы с HTTP-сервисами 1С и обеспечить стабильное взаимодействие с внешними системами.

← На главную