Ситуация, когда база данных 1С успешно опубликована на веб-сервере Apache, веб-клиент открывается без проблем, но при попытке обращения к API внешние системы получают ошибку 404 Not Found, является классической при настройке интеграций. Особенно часто это происходит после прохождения этапа авторизации: логин и пароль принимаются сервером, но вместо ожидаемых данных система сообщает, что ресурс не найден. Разберем пошагово, почему это происходит и как обеспечить корректную работу HTTP-сервисов.
Первое, что нам необходимо уяснить: работа веб-клиента 1С и работа его же HTTP-сервисов — это разные механизмы маршрутизации запросов. Как справедливо замечено в обсуждении, если после ввода логина и пароля в браузере открывается интерфейс 1С, это подтверждает работоспособность расширения веб-сервера и корректность подключения к MS SQL. Однако это никак не гарантирует, что точка входа для API (HTTP-сервис) доступна извне.
Проанализируем структуру URL. Для HTTP-сервисов в платформе 1С:Предприятие 8.3 путь строится по строго заданному шаблону: http://имя_сервера/имя_публикации/hs/ИмяСервиса/КорневойURL/Метод. Разберем составляющие этого пути:
имя_публикации — это имя, которое вы задали в конфигураторе или в параметре base файла публикации.hs — обязательный префикс, указывающий веб-серверу, что запрос должен быть передан именно модулю HTTP-сервисов (HTTP Services).ИмяСервиса — имя объекта метаданных в дереве конфигурации.КорневойURL — свойство, указанное в свойствах этого HTTP-сервиса в конфигураторе.Если разработчик внешней системы пытается обратиться к корню публикации или пропускает префикс /hs/, он неизбежно получит ошибку 404, даже если авторизация прошла успешно.
Даже если при публикации в конфигураторе вы проставили «все галочки», необходимо вручную убедиться в корректности формирования файла default.vrd. Этот файл находится в каталоге, который был указан при публикации базы на Apache. Рассмотрим его структуру.
Выясним, присутствует ли внутри тега point секция, разрешающая работу HTTP-сервисов. Она должна выглядеть примерно так:
<httpServices publishByDefault="true">
<service name="ИмяВашегоСервиса" rootUrl="api" enable="true" reuseSessions="autouse" />
</httpServices>
Обратим внимание на параметр publishByDefault. Если он установлен в значение false, а конкретный сервис не прописан явно ниже, то доступ к нему будет закрыт, и сервер вернет 404. Также проверьте параметр reuseSessions. В некоторых случаях использование сеансов (autouse) может конфликтовать со специфическими запросами API, и для диагностики его можно временно переключить в dontuse.
Проанализируем настройки самого Apache. Файл httpd.conf должен позволять расширению 1С корректно обрабатывать пути. Рассмотрим критически важные директивы в блоке Directory, относящемся к папке публикации 1С:
AllowOverride None, Apache может блокировать перенаправление запросов на внутренние обработчики платформы.AgisIntegration, а в запросе указано agisintegration, результатом будет 404 ошибка.mod_auth_basic. Если авторизация проходит, значит модули работают, но стоит проверить, не настроена ли в Apache дополнительная фильтрация URL-адресов через mod_rewrite, которая может отсекать запросы с определенными паттернами.Предположим, что публикация верна и URL правильный. Почему всё равно 404? В платформе 1С 8.3 существует особенность безопасности: если у пользователя нет прав на конкретный HTTP-сервис, система в целях безопасности может не выдавать ошибку 403 (Доступ запрещен), а возвращать 404 (Не найдено), чтобы не раскрывать структуру доступных сервисов потенциальному злоумышленнику.
Выполним следующие шаги по проверке прав:
RemoteDesktop или специфические HTTP-права).Если визуальный осмотр настроек не помог, перейдем к активной диагностике. Разберем три основных инструмента:
1. Журнал регистрации 1С. Это первое место, куда стоит заглянуть. Если в журнале после попытки обращения нет события «Сеанс. Начало» или «HTTP. Запрос» для данного пользователя, значит, запрос не дошел до логики 1С и был «отбит» на уровне Apache или расширения mod_1c. Если же запись о сеансе есть, но запрос завершился ошибкой, ищите детали в теле события журнала.
2. Логи Apache (access.log). Посмотрим на точную строку запроса, которую отправляет внешняя программа. Часто выясняется, что программа добавляет лишний слэш в конце или подставляет префикс локализации (например, /ru_RU/), который мешает правильному сопоставлению URL.
Пример нормального лога:
"GET /BaseName/hs/v1/getdata HTTP/1.1" 200 ...
Пример лога с ошибкой:
"GET /BaseName/ru_RU/hs/v1/getdata HTTP/1.1" 404 ...
3. Отладка HTTP-сервиса. Установим точку останова в модуле HTTP-сервиса внутри метода-обработчика (например, ПриПолученииДанных). Чтобы отладка сработала на веб-сервере, не забудьте включить режим отладки в настройках Apache (параметр -debug в строке запуска модуля 1С или соответствующие флаги в httpd.conf). Если точка останова не срабатывает — проблема в маршрутизации (Apache/VRD). Если срабатывает — проблема в коде самого сервиса, который может возвращать HTTPОтвет со статусом 404 программно.
Подводя итог: в большинстве случаев проблема решается либо добавлением префикса /hs/ в строку запроса, либо корректной настройкой секции <httpServices> в файле default.vrd, либо назначением необходимых ролей пользователю в базе данных.