Часто разработчики 1С сталкиваются с загадочной ситуацией: HTTP-сервис, созданный и опубликованный в расширении конфигурации, прекрасно отвечает на запросы из внешних инструментов, таких как Postman или обычный браузер (возвращая код 200), но при попытке вызвать его программно из самой 1С с помощью объекта HTTPСоединение, система возвращает ошибку 404 Not Found. При этом аналогичный сервис в основной конфигурации работает без нареканий.
Проблема усугубляется тем, что отладчик в расширении не срабатывает при вызове из 1С, что указывает на то, что запрос даже не доходит до обработчика. Давайте вместе разберемся в причинах такого поведения и рассмотрим пошаговый план диагностики и решения этой проблемы.
Прежде чем погружаться в дебри настроек веб-сервера, давайте исключим самые простые и очевидные причины. Проанализируем ситуацию и выполним несколько начальных проверок.
/myservice/getdata и /MyService/GetData — это два разных адреса.
Если базовые проверки не помогли, проблема, скорее всего, кроется в конфигурационных файлах, которые платформа 1С генерирует при публикации на веб-сервере. Основное внимание уделим двум файлам: default.vrd и httpd.conf.
default.vrdЭтот файл описывает опубликованные сервисы для конкретной информационной базы. Он находится в каталоге публикации на веб-сервере. Откройте его и проверьте следующее:
Убедитесь, что в файле присутствует атрибут publishExtensionsByDefault="true" в теге ws. Это стандартная настройка, которая указывает веб-серверу, что нужно публиковать и сервисы из подключенных расширений.
<ws publishExtensionsByDefault="true">
Иногда, в качестве диагностического шага, можно попробовать вручную прописать сервис из расширения прямо в этот файл. Это поможет понять, видит ли его веб-сервер в принципе. Однако помните, что это временное решение. При следующей перепубликации базы из конфигуратора этот файл будет перезаписан, и ваши ручные правки пропадут.
httpd.confЭто наиболее вероятное место возникновения проблемы. Платформа 1С при публикации автоматически добавляет в конфигурационный файл Apache (обычно это httpd.conf или подключаемый файл для VHosts) блок с настройками для опубликованной базы. Иногда этот процесс происходит некорректно.
Возможная проблема: дублирование публикаций.
Откройте файл httpd.conf и найдите все упоминания пути к вашему файлу default.vrd. Встречалась ситуация, когда платформа создавала две разные секции Alias, указывающие на один и тот же каталог публикации, но с разными путями. Например:
Alias "/mybase" "C:/inetpub/wwwroot/mybase/"
Alias "/MyBaseWithUpperCase" "C:/inetpub/wwwroot/mybase/"
Такой конфликт может привести к непредсказуемой маршрутизации запросов, и запросы к сервисам расширений могут просто "теряться".
Решение — полная и чистая перепубликация:
C:/inetpub/wwwroot/mybase).httpd.conf и вручную удалите все строки, связанные с этой публикацией (блок, начинающийся с #-1C-START и заканчивающийся #-1C-END). Сохраните файл.Этот метод "выжженной земли" часто решает самые глубокие проблемы с некорректной конфигурацией, созданной платформой.
Даже если публикация настроена верно, сам код вызова может содержать нюансы, которые отличают его от запроса из Postman.
Рассмотрим стандартный код вызова:
Соединение = Новый HTTPСоединение(Публикация, , Имя, Пароль);
HTTPЗапрос = Новый HTTPЗапрос();
HTTPЗапрос.АдресРесурса = Адрес;
Результат = Соединение.ВызватьHTTPМетод(HTTPМетод, HTTPЗапрос);
В отличие от Postman, где вы полностью контролируете заголовки, объект HTTPСоединение может добавлять свои собственные, например, для аутентификации. Иногда веб-сервер или сам сервис может ожидать определенные заголовки, которые отсутствуют при вызове из 1С.
Попробуйте явно указать заголовки в объекте HTTPЗапрос. Например, если ваш сервис работает с JSON, явно укажите Content-Type и Accept.
Соединение = Новый HTTPСоединение(Публикация, , Имя, Пароль);
HTTPЗапрос = Новый HTTPЗапрос();
HTTPЗапрос.АдресРесурса = Адрес;
// Явно указываем заголовки
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.Заголовки.Вставить("Accept", "application/json");
Результат = Соединение.ВызватьHTTPМетод(HTTPМетод, HTTPЗапрос);
Это может решить проблемы, если на сервере есть правила, фильтрующие запросы без определенных заголовков.
Если ничего из вышеперечисленного не помогло, проблема может быть еще глубже.
%APPDATA%\1C\1cv8). В серверном варианте может помочь перезапуск службы агента сервера 1С:Предприятия.
access.log и error.log веб-сервера Apache. В access.log вы увидите, доходит ли запрос до сервера и с каким кодом он обрабатывается. В error.log можно найти подробную информацию о причине отказа, например, если Apache пытается найти физический файл на диске вместо того, чтобы передать запрос модулю 1С.
В заключение, отметим, что проблема с ошибкой 404 для сервисов в расширениях почти всегда носит инфраструктурный характер. Не стоит отчаиваться и отказываться от использования расширений для этой задачи. Методичная проверка всех звеньев цепи — от кода вызова в 1С до конфигурации Apache — обязательно приведет к обнаружению и устранению причины.