При работе с платформой 1С:Предприятие и интеграции её с внешними системами часто возникает необходимость в публикации HTTP-сервисов. Для реализации этой задачи есть инструмент создания полноценного REST API в 1С. Однако, этот процесс может сопровождаться различными трудностями, в частности, ошибками 404 (Not Found) и 403 (Forbidden) при обращении к опубликованным сервисам. В этой статье мы подробно разберем, почему возникают эти ошибки и как их эффективно устранить, основываясь на практическом опыте и рекомендациях.
Рассмотрим сценарий, когда база 1С успешно опубликована на веб-сервере IIS (например, IIS 10), но попытки обращения к HTTP-сервисам завершаются ошибкой 404, а затем, после частичного решения, ошибкой 403. Это типичная ситуация для разработчиков и системных администраторов, настраивающих взаимодействие между 1С и внешними API, такими как сервисы Яндекс.Маркета или других маркетплейсов. Для таких случаев есть анализ прав доступа и отладка кода 1С.
Ошибка 404 означает, что запрашиваемый ресурс не найден на сервере. При публикации HTTP-сервисов 1С это часто указывает на некорректный URL-адрес в запросе или неверные настройки публикации. Разберем наиболее частые причины и способы их устранения.
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, чтобы изменения вступили в силу.
/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-сервиса.
После любых изменений в конфигурации 1С, касающихся HTTP-сервисов, или ручного редактирования файла default.vrd, необходимо переопубликовать базу и/или перезапустить пул приложений IIS, связанный с публикацией, а затем и сам веб-сервер. Без этого изменения не вступят в силу, и вы продолжите получать ошибку 404.
Что делать: Регулярно перезапускайте веб-сервер после изменений. Убедитесь, что файл wsisapi.dll (для IIS) или `wsap*.dll` (для Apache) корректно указан в сопоставлениях обработчиков веб-сервера и имеет актуальную версию, соответствующую платформе 1С.
Убедитесь, что URL, указанный в запросе, точно совпадает с корневым URL и шаблоном, определенными в конфигурации 1С и в файле default.vrd. Любое несоответствие (лишний символ, опечатка) приведет к ошибке 404.
После успешного устранения ошибки 404 вы можете столкнуться с ошибкой 403. Эта ошибка означает, что сервер понял запрос, но отказывается предоставить доступ к запрошенному ресурсу. Причины могут быть как в самой 1С (права пользователя), так и в настройках веб-сервера или некорректности запроса.
Как это ни парадоксально, но ошибка 403 может быть возвращена сервером 1С, если в запросе переданы неверные или ожидаемые параметры. Сервер может интерпретировать отсутствие или некорректность обязательных параметров как попытку несанкционированного доступа или некорректного использования сервиса, блокируя дальнейшую обработку.
Практический пример из обсуждения: Пользователь обнаружил, что ошибка 403 возвращалась "при передаче неверного параметра". Это означает, что логика HTTP-сервиса в 1С или его предобработчик на сервере 1С выявил проблему с входными данными и вместо ошибки типа 400 (Bad Request) вернул 403.
Что делать:
Ошибка 403 Forbidden часто указывает на то, что пользователь, от имени которого осуществляется вызов HTTP-сервиса, не имеет необходимых прав доступа в конфигурации 1С. Для корректной работы HTTP-сервиса пользователю должны быть предоставлены следующие права:
Что делать:
IIS предлагает различные методы аутентификации. Если в настройках публикации 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-токены.
grant_type=CLIENT_CREDENTIALS и заголовком Authorization: Basic <Base64(ClientId:ClientSecret)>), а затем использует этот токен в заголовке Authorization: Bearer <токен> при вызове HTTP-сервиса. Токен обычно действителен ограниченное время, после чего требуется получить новый.На веб-сервере могут быть настроены правила, запрещающие доступ к определенным каталогам или файлам (например, через модули URL Rewrite для IIS или `.htaccess` для Apache). Также, если веб-сервер настроен не формировать список содержимого каталога, может возникать ошибка 403.14.
Что делать: Проверьте настройки безопасности вашего веб-сервера. Убедитесь, что нет блокирующих правил для виртуального каталога с публикацией 1С.
Возникает вопрос, можно ли оформить 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-сервисами, полезно учитывать следующие аспекты:
*.wsdd (описывающие структуру базы) и *.vrd (описывающие HTTP-сервисы и веб-сервисы).curl. Они позволяют быстро формировать запросы с различными методами (GET, POST), заголовками и телами, а также анализировать ответы сервера./getyml/{версия}) и HTTP-методы (GET, POST и т.д.) с соответствующими обработчиками на языке 1С.Следуя этим рекомендациям и тщательно проверяя каждый шаг публикации и настройки, вы сможете эффективно устранять проблемы с HTTP-сервисами 1С и обеспечить стабильное взаимодействие с внешними системами.