При интеграции систем 1С со сторонними сервисами по методологии REST API разработчики регулярно сталкиваются с необходимостью отправки различных HTTP-запросов. Если выполнение запросов GET и POST обычно не вызывает затруднений, то при попытке использовать метод DELETE для удаления данных в сторонней системе программисты часто получают неожиданную ошибку с кодом состояния 405 Method Not Allowed (Метод не разрешен). В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно настроить веб-сервер и как написать отказоустойчивый код в 1С для отправки запросов на удаление.
Код ответа 405 (Method Not Allowed) означает, что целевой веб-сервер распознал отправленный метод (в нашем случае DELETE), но данный метод заблокирован для указанного ресурса или запрещен глобальными настройками безопасности сервера. При интеграции с 1С эта проблема чаще всего обусловлена двумя факторами:
WebDAVModule, предназначенный для совместной работы с файлами. Этот модуль перехватывает все входящие запросы с методами PUT и DELETE, пытается обработать их самостоятельно и, не найдя соответствующих конфигураций для авторизованного доступа к файловой системе, возвращает ошибку 405. Запрос при этом даже не доходит до вашей конфигурации 1С или целевого скрипта API.GET и POST). Если запросы проходят через прокси-серверы, методы PUT и DELETE могут отбрасываться на этапе предварительной фильтрации трафика.Давайте рассмотрим подробнее, как решить проблему на уровне инфраструктуры сервера и как обойти ее программно на стороне 1С.
Если вы имеете доступ к администрированию веб-сервера IIS, на котором опубликован ваш собственный HTTP-сервис 1С, проблему с ошибкой 405 можно решить путем отключения мешающего модуля. Сделать это можно через редактирование файла конфигурации web.config, который находится в корневом каталоге публикации базы 1С.
Откроем файл web.config и добавим директивы для принудительного удаления модуля и обработчика WebDAV в секции <system.webServer>:
<system.webServer>
<modules>
<!-- Удаляем модуль WebDAV, чтобы он не перехватывал DELETE и PUT -->
<remove name="WebDAVModule" />
</modules>
<handlers>
<!-- Удаляем обработчик WebDAV -->
<remove name="WebDAV" />
</handlers>
</system.webServer>
После внесения этих изменений и перезапуска пула приложений IIS сервер перестанет блокировать запросы DELETE и корректно передаст их обработчику платформы 1С.
Что делать, если вы интегрируетесь со сторонней системой (например, облачным сервисом логистики или CRM) и не имеете доступа к настройкам их веб-сервера, а сервер упорно возвращает ошибку 405? В индустрии веб-разработки существует стандартный обходной путь, называемый туннелированием методов.
Суть метода заключается в том, что мы отправляем стандартный и гарантированно разрешенный запрос POST, но добавляем в заголовки специальный маркер, указывающий серверу, что на самом деле мы хотим выполнить операцию DELETE. Большинство современных REST-архитектур поддерживают такое поведение.
Для реализации этого подхода в 1С нам потребуется добавить в объект HTTPЗапрос следующий заголовок:
// Задаем стандартный заголовок для подмены метода
HTTPЗапрос.Заголовки.Вставить("X-HTTP-Method-Override", "DELETE");
В некоторых API альтернативным вариантом является передача специального параметра непосредственно в строке запроса (Query Parameter), например: /api/v1/goods/1233?_method=DELETE. Перед началом разработки обязательно изучите документацию внешнего сервиса на предмет поддержки таких заголовков.
При работе с REST API крайне важно соблюдать стандарты проектирования интерфейсов. Рассмотрим ключевые правила подготовки запроса на удаление данных.
Правило 1. Передача идентификатора в пути URL (Path Parameters). В классическом REST API идентификатор удаляемого объекта передается непосредственно в строке адреса (URI), а не в виде параметров запроса. Например:
/api/v1/goods/1233 (где 1233 — уникальный ID товара)./api/v1/goods?id=1233 (хотя в некоторых кастомных API может использоваться и такой формат).Правило 2. Тело запроса и Content-Type. Согласно спецификации протокола HTTP, запрос DELETE не должен содержать тело запроса (Request Body). Сервер имеет право проигнорировать переданные в теле данные. Следовательно, если тела запроса нет, указывать заголовок Content-Type не требуется. Однако, если ваше целевое API спроектировано нетипично и требует передачи списка удаляемых объектов в формате JSON в теле запроса, вам обязательно нужно установить соответствующий заголовок:
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Платформа 1С:Предприятие версии 8.3 предоставляет разработчикам два удобных механизма отправки запросов с методом DELETE. Рассмотрим их по очереди.
Этот метод появился в платформе начиная с версии 8.3.6 и является наиболее логичным и лаконичным решением для выполнения данной задачи.
Разберем готовый пример кода:
// Шаг 1. Создаем защищенное соединение, если целевой сервер работает по протоколу HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Шаг 2. Инициализируем подключение к серверу
// Указываем адрес хоста (без протокола https://) и порт (для HTTPS по умолчанию 443)
Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 15, ЗащищенноеСоединение);
// Шаг 3. Формируем запрос, передавая ID удаляемого объекта в пути ресурса
ИдентификаторТовара = "1233";
АдресРесурса = "/api/v1/goods/" + ИдентификаторТовара;
Запрос = Новый HTTPЗапрос(АдресРесурса);
// Шаг 4. Добавляем необходимые заголовки (например, авторизационный токен)
Запрос.Заголовки.Вставить("Authorization", "Bearer " + "Ваш_Токен_Доступа");
Попытка
// Шаг 5. Отправляем запрос методом Удалить()
Ответ = Соединение.Удалить(Запрос);
// Шаг 6. Анализируем код состояния ответа
// Успешным удалением в REST API обычно считается код 200 (OK), 204 (No Content) или 202 (Accepted)
Если Ответ.КодСостояния = 200 Или Ответ.КодСостояния = 204 Тогда
Сообщить("Объект успешно удален в сторонней системе.");
ИначеЕсли Ответ.КодСостояния = 405 Тогда
ВызватьИсключение "Ошибка 405: Метод DELETE запрещен сервером! Проверьте настройки WebDAV или используйте туннелирование.";
Иначе
Сообщить("Не удалось выполнить удаление. Код ответа сервера: " + Ответ.КодСостояния);
Сообщить("Текст ответа: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Произошла ошибка при отправке запроса: " + ОписаниеОшибки());
КонецПопытки;
Если вам требуется создать универсальный модуль интеграции, в котором имя метода передается динамически в виде переменной, рекомендуется использовать метод ВызватьHTTPМетод(). С точки зрения работы сети этот вариант полностью эквивалентен предыдущему.
Проанализируем пример реализации данного подхода:
// Шаг 1. Настройка соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 15, ЗащищенноеСоединение);
// Шаг 2. Создание запроса
ИдентификаторТовара = "1233";
Запрос = Новый HTTPЗапрос("/api/v1/goods/" + ИдентификаторТовара);
Запрос.Заголовки.Вставить("Authorization", "Bearer " + "Ваш_Токен_Доступа");
Попытка
// Шаг 3. Вызываем HTTP-метод с явным указанием строки "DELETE"
Ответ = Соединение.ВызватьHTTPМетод("DELETE", Запрос);
// Шаг 4. Обработка полученных результатов
Если Ответ.КодСостояния = 200 Или Ответ.КодСостояния = 204 Тогда
Сообщить("Удаление выполнено успешно через ВызватьHTTPМетод.");
Иначе
Сообщить("Код ответа: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Ошибка при вызове метода: " + ОписаниеОшибки());
КонецПопытки;
Подводя итоги, при интеграции 1С с REST-сервисами по методу DELETE придерживайтесь следующей последовательности действий:
web.config.POST с заголовком X-HTTP-Method-Override: DELETE.Соединение.Удалить() или универсальный Соединение.ВызватьHTTPМетод("DELETE", Запрос).Используя данные рекомендации, вы сможете легко настроить стабильный обмен данными между 1С и любыми внешними веб-сервисами, корректно обрабатывая удаление объектов без возникновения непредвиденных системных сбоев.