При разработке интеграций между двумя базами 1С через HTTP-сервисы программисты часто сталкиваются с ситуацией, когда запрос из внешней программы (например, Postman) проходит успешно, а аналогичный вызов из кода 1С возвращает ошибку 405 Method Not Allowed. Эта ошибка означает, что веб-сервер понимает запрос, но метод (GET, POST, PUT), указанный в запросе, не разрешен для данного ресурса.
В этой статье мы подробно разберем, почему возникает эта проблема, как проанализировать заголовки и как настроить веб-сервер, чтобы взаимодействие между базами 1С работало стабильно.
Для начала проанализируем ситуацию: если Postman возвращает корректный XML-ответ, значит, сам HTTP-сервис в базе-приемнике опубликован и работоспособен. Ошибка 405 при вызове из кода 1С сигнализирует о том, что запрос формируется или передается иначе, чем в стороннем клиенте. Давайте рассмотрим основные причины и способы их устранения по шагам.
В 1С для отправки POST-запросов часто используются методы ОтправитьДляОбработки или ВызватьHTTPМетод. Выясним причину возможного несоответствия. Если в шаблоне вашего HTTP-сервиса в метаданных указан метод POST, а в коде по какой-то причине вызывается GET, сервер вернет 405. Однако бывает и более тонкая проблема: использование метода, который перехватывается веб-сервером до того, как он попадет в 1С.
Посмотрим на пример правильной инициализации запроса:
Соединение = Новый HTTPСоединение("server.com",,,,, 30, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/base/hs/v1/exchange");
Запрос.Заголовки.Вставить("Content-Type", "application/xml; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(ТекстЗапросаXML, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Одной из скрытых причин ошибки 405 (или 400) является наличие BOM (Byte Order Mark) в начале тела запроса. BOM — это специальные невидимые символы в начале текстового файла, указывающие на порядок байтов. Многие веб-серверы при получении XML с BOM не могут правильно сопоставить запрос с шаблоном URL или методом.
Проанализируем ситуацию: когда вы используете Записать() для XML или просто формируете строку, 1С может добавить BOM по умолчанию. Чтобы этого избежать, при установке тела запроса необходимо явно указывать параметр ИспользованиеByteOrderMark.НеИспользовать, как показано в примере выше.
Часто программисты забывают, что Postman автоматически добавляет множество служебных заголовков, таких как User-Agent, Host, Accept. Веб-сервер или прокси-сервер (например, Nginx), стоящий перед 1С, может блокировать запросы без этих заголовков, возвращая 405.
Разберем, какие заголовки стоит добавить в 1С для имитации работы полноценного браузера или Postman:
application/xml.1C+Enterprise/8.3.application/xml или */*.Если ваша база опубликована на веб-сервере Internet Information Services (IIS), это самая вероятная причина ошибки 405. Модуль WebDAV, который часто устанавливается в IIS по умолчанию, "перехватывает" HTTP-методы POST, PUT и DELETE. В итоге запрос даже не доходит до расширения 1С (isapi или fastcgi).
Выясним, как это исправить. Вам необходимо отредактировать файл web.config, который находится в папке с публикацией базы. В раздел system.webServer нужно добавить инструкции по удалению модуля WebDAV:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
После внесения этих изменений и перезапуска веб-сервера запросы POST должны начать беспрепятственно проходить к вашему HTTP-сервису.
Рассмотрим ситуацию с маршрутизацией. В 1С в шаблоне URL путь может быть прописан как /submit. Если в коде 1С вы вызываете адрес /submit/ (с закрывающим слэшем), веб-сервер может попытаться выполнить внутренний редирект. Во время редиректа метод POST часто заменяется на GET. Поскольку для вашего ресурса метод GET не определен, сервер закономерно возвращает 405 Method Not Allowed.
Рекомендация: Всегда проверяйте строгое соответствие URL в коде 1С и в настройках метаданных HTTP-сервиса.
Если ошибка сохраняется, воспользуйтесь методом ПолучитьТелоКакСтроку() у объекта HTTPСервисОтвет (на стороне приемника, если запрос доходит) или проанализируйте подробности ошибки на стороне клиента. Важным диагностическим признаком является заголовок Allow, который сервер присылает вместе с ошибкой 405. В нем перечислены методы, которые сервер разрешает использовать для данного URL.
Пример анализа заголовков ответа:
Для Каждого Заголовок Из Ответ.Заголовки Цикл
Сообщить(Заголовок.Ключ + ": " + Заголовок.Значение);
КонецЦикла;
Если в заголовке Allow указано только OPTIONS или GET, а вы отправляете POST, значит, проблема либо в публикации (файл default.vrd), либо в настройках безопасности веб-сервера.
Подводя итог, для устранения ошибки 405 при работе с HTTP-сервисами 1С выполните следующие действия:
Content-Type и убедитесь, что он совпадает с тем, что ожидает приемник.Следуя этим шагам, мы сможем добиться стабильной работы интеграции и избежать стандартных ошибок при обмене данными между информационными базами.