Как правильно отправить HTTP-запрос DELETE в 1С и исправить ошибку 405?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции систем 1С со сторонними сервисами по методологии REST API разработчики регулярно сталкиваются с необходимостью отправки различных HTTP-запросов. Если выполнение запросов GET и POST обычно не вызывает затруднений, то при попытке использовать метод DELETE для удаления данных в сторонней системе программисты часто получают неожиданную ошибку с кодом состояния 405 Method Not Allowed (Метод не разрешен). В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно настроить веб-сервер и как написать отказоустойчивый код в 1С для отправки запросов на удаление.

Выясняем причину: почему возникает ошибка 405?

Код ответа 405 (Method Not Allowed) означает, что целевой веб-сервер распознал отправленный метод (в нашем случае DELETE), но данный метод заблокирован для указанного ресурса или запрещен глобальными настройками безопасности сервера. При интеграции с 1С эта проблема чаще всего обусловлена двумя факторами:

  1. Блокировка модулем WebDAV в IIS (Internet Information Services): Если принимающий веб-сервис опубликован на веб-сервере IIS, это самая распространенная причина ошибки. По умолчанию в IIS активирован модуль WebDAVModule, предназначенный для совместной работы с файлами. Этот модуль перехватывает все входящие запросы с методами PUT и DELETE, пытается обработать их самостоятельно и, не найдя соответствующих конфигураций для авторизованного доступа к файловой системе, возвращает ошибку 405. Запрос при этом даже не доходит до вашей конфигурации 1С или целевого скрипта API.
  2. Ограничения на уровне Nginx, Apache или Брандмауэра: В целях безопасности системные администраторы часто отключают «лишние» HTTP-методы (оставляя только GET и POST). Если запросы проходят через прокси-серверы, методы PUT и DELETE могут отбрасываться на этапе предварительной фильтрации трафика.

Давайте рассмотрим подробнее, как решить проблему на уровне инфраструктуры сервера и как обойти ее программно на стороне 1С.

Решение проблемы на стороне IIS: отключение WebDAV

Если вы имеете доступ к администрированию веб-сервера 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С.

Обходной путь: туннелирование методов (X-HTTP-Method-Override)

Что делать, если вы интегрируетесь со сторонней системой (например, облачным сервисом логистики или CRM) и не имеете доступа к настройкам их веб-сервера, а сервер упорно возвращает ошибку 405? В индустрии веб-разработки существует стандартный обходной путь, называемый туннелированием методов.

Суть метода заключается в том, что мы отправляем стандартный и гарантированно разрешенный запрос POST, но добавляем в заголовки специальный маркер, указывающий серверу, что на самом деле мы хотим выполнить операцию DELETE. Большинство современных REST-архитектур поддерживают такое поведение.

Для реализации этого подхода в 1С нам потребуется добавить в объект HTTPЗапрос следующий заголовок:


// Задаем стандартный заголовок для подмены метода
HTTPЗапрос.Заголовки.Вставить("X-HTTP-Method-Override", "DELETE");

В некоторых API альтернативным вариантом является передача специального параметра непосредственно в строке запроса (Query Parameter), например: /api/v1/goods/1233?_method=DELETE. Перед началом разработки обязательно изучите документацию внешнего сервиса на предмет поддержки таких заголовков.

Как правильно составить HTTPЗапрос для удаления ресурса

При работе с REST API крайне важно соблюдать стандарты проектирования интерфейсов. Рассмотрим ключевые правила подготовки запроса на удаление данных.

Правило 1. Передача идентификатора в пути URL (Path Parameters). В классическом REST API идентификатор удаляемого объекта передается непосредственно в строке адреса (URI), а не в виде параметров запроса. Например:

Правило 2. Тело запроса и Content-Type. Согласно спецификации протокола HTTP, запрос DELETE не должен содержать тело запроса (Request Body). Сервер имеет право проигнорировать переданные в теле данные. Следовательно, если тела запроса нет, указывать заголовок Content-Type не требуется. Однако, если ваше целевое API спроектировано нетипично и требует передачи списка удаляемых объектов в формате JSON в теле запроса, вам обязательно нужно установить соответствующий заголовок:


HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

Программная реализация DELETE-запроса в 1С 8.3

Платформа 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Метод()

Если вам требуется создать универсальный модуль интеграции, в котором имя метода передается динамически в виде переменной, рекомендуется использовать метод Вызвать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 придерживайтесь следующей последовательности действий:

Используя данные рекомендации, вы сможете легко настроить стабильный обмен данными между 1С и любыми внешними веб-сервисами, корректно обрабатывая удаление объектов без возникновения непредвиденных системных сбоев.

← На главную