При интеграции систем на базе 1С:Предприятие с внешними сервисами или при организации взаимодействия между двумя базами 1С через HTTP-протокол разработчики часто сталкиваются с ситуацией, когда запрос из специализированных инструментов (например, Postman) проходит успешно, а встроенный механизм 1С возвращает ошибку 405 Method Not Allowed. Рассмотрим детально, почему это происходит, и разберем по шагам все возможные причины — от синтаксических ошибок в URL до тонких настроек веб-сервера IIS.
Самая распространенная причина ошибки 405 заключается в том, что запрос направляется по адресу, который предназначен для работы веб-клиента 1С, а не для программного интерфейса. В платформе 1С существует строгое разделение между доступом к пользовательскому интерфейсу и доступом к API (HTTP и Web-сервисам).
Проанализируем структуру «правильного» URL. Если вы обращаетесь к HTTP-сервису, опубликованному в базе, ваш адрес обязательно должен содержать сегмент /hs/. Полная структура выглядит следующим образом:
http://имя_сервера/имя_базы/hs/ИмяСервиса/НазваниеМетода
Если вы обращаетесь к Web-сервису (SOAP), в адресе должен присутствовать сегмент /ws/:
http://имя_сервера/имя_базы/ws/ИмяСервиса.1сws
Выясним, что происходит, если пропустить этот префикс. Запрос вида http://имя_сервера/имя_базы/MyMethod попадает на обработчик веб-клиента. Веб-клиент ожидает либо GET-запрос для инициализации сеанса пользователя, либо специфические POST-запросы от собственного интерфейса. Внешний произвольный POST-запрос он отвергает с ошибкой 405, так как данный «ресурс» не поддерживает такой метод обработки. Важно помнить: если при переходе по ссылке из браузера у вас начинает запускаться интерфейс 1С — значит, URL указан неверно для целей API.
Если URL указан верно, но ошибка 405 сохраняется (особенно при использовании методов POST, PUT или DELETE), необходимо проверить настройки веб-сервера Internet Information Services (IIS). Одной из самых коварных причин является установленный модуль WebDAV Publishing.
Этот компонент предназначен для управления файлами на сервере, и он имеет приоритет в перехвате определенных HTTP-глаголов. Рассмотрим, как это исправить:
web.config, который находится в папке публикации вашей базы, и добавим инструкции по удалению модуля и обработчика:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
После внесения этих изменений IIS перестанет блокировать «нестандартные» для него методы, и запросы будут корректно передаваться расширению 1С.
Иногда при ручной настройке IIS или после обновлений платформы сбиваются настройки «Сопоставления обработчиков». Проанализируем ситуацию, когда обработчик для 1С настроен слишком узко.
Зайдем в настройки сайта в консоли управления IIS, выберем пункт Handler Mappings. Найдем обработчик, отвечающий за расширения 1С (обычно это 1C Web-service Extension). В его свойствах («Ограничения запроса» -> вкладка «Глаголы») может быть установлено ограничение «Только следующие глаголы: GET, POST». Если вы решите использовать PATCH или DELETE, сервер вернет 405. Рекомендуется устанавливать значение «Все глаголы».
Postman автоматически добавляет множество служебных заголовков, которые 1С в объекте HTTPСоединение сам не проставляет. Разберем пример кода, который часто приводит к ошибке на стороне сервера из-за отсутствия типа контента:
// Неправильный подход (может вызвать 405 или 415)
Соединение = Новый HTTPСоединение("myserver.ru");
Запрос = Новый HTTPЗапрос("/Base/hs/v1/data");
Запрос.УстановитьТелоИзСтроки("{'id': 1}");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Чтобы сервер корректно распознал ваш POST-запрос, необходимо явно указать Content-Type. Рассмотрим правильный пример формирования запроса:
Заголовок = Новый Соответствие;
Заголовок.Вставить("Content-Type", "application/json; charset=utf-8");
Соединение = Новый HTTPСоединение("myserver.ru");
Запрос = Новый HTTPЗапрос("/Base/hs/v1/data", Заголовок);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
// ОтправитьДляОбработки соответствует методу POST
Исключение
Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;
Важный нюанс: метод ОтправитьДляОбработки() объекта HTTPСоединение всегда инициирует POST. Если вам нужен PUT, используйте Изменить(), если GET — Получить(). Путаница в методах встроенного языка также может приводить к ошибкам на стороне веб-сервиса.
Платформа 1С крайне чувствительна к точному соответствию шаблона пути, указанному в метаданных. Рассмотрим ситуацию: в конфигурации для HTTP-сервиса задан шаблон GetStatus/.
.../hs/Service/GetStatus (без слеша), сервер может выполнить редирект.POST может «превратиться» в GET, что немедленно вызовет ошибку 405.HTTPСоединение в 1С — нет.Проанализируйте настройки вашего шаблона в конфигураторе и всегда пишите URL в коде в строгом соответствии с ними.
Если ваш код исполняется на сервере 1С:Предприятие, помните, что серверный процесс (под пользователем USR1CV8) может не иметь доступа в интернет или к определенному сегменту сети, в отличие от вашего рабочего места, где запущен Postman.
Разберем, как подключить прокси, если запрос блокируется промежуточным узлом:
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "192.168.1.1", 8080, "User", "Password");
// Если нужно использовать системные настройки прокси:
// Прокси = Новый ИнтернетПрокси(Истина);
Соединение = Новый HTTPСоединение("myserver.ru",,,, Прокси);
Также проверьте права доступа. Если HTTP-сервис требует авторизации, убедитесь, что в HTTPСоединение переданы логин и пароль пользователя 1С, у которого есть роль «Удаленный доступ (HTTP)» или соответствующие права на данный конкретный сервис.
Подводя итог, при возникновении ошибки 405 Method Not Allowed в 1С, первым делом проверьте наличие префикса /hs/ в строке адреса и убедитесь, что в системе не мешает модуль WebDAV. В 90% случаев это решает проблему.