Как исправить ошибку 405 (Method Not Allowed) при отправке запроса к API в 1С

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

При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда запрос, казалось бы, составлен верно, но сервер возвращает ошибку КодСостояния 405. В этой статье мы подробно разберем, что означает этот код, почему он возникает при работе с API (на примере системы EKF) и как правильно перестроить логику взаимодействия в 1С, чтобы данные успешно загружались.

Разбор причины ошибки 405: Method Not Allowed

Для начала проанализируем саму суть ошибки. Код 405 Method Not Allowed означает, что метод HTTP, который вы используете (в нашем случае POST), не разрешен для указанного ресурса (URL). Сервер понимает запрос, но запрещает выполнение конкретного действия именно этим способом.

Рассмотрим ситуацию из практики: разработчик пытается отправить POST запрос для получения файлов каталога. Однако, если мы посмотрим на заголовки ответа сервера (которые можно получить через Результат.Заголовки), мы увидим важный параметр allow. В данном случае сервер прямо говорит: "allow" : "GET, HEAD". Это означает, что эндпоинт ожидает только запросы типа GET для получения данных или HEAD для проверки существования ресурса.

Шаг 1: Смена метода запроса в 1С

В платформе 1С метод HTTPСоединение.ОтправитьДляОбработки() по умолчанию инициирует POST запрос. Если API требует GET, нам необходимо использовать метод HTTPСоединение.Получить(). Выясним причину, по которой POST может быть заблокирован: часто API для получения списков или файлов (Read-only операции) проектируются строго под GET, чтобы параметры фильтрации передавались прямо в адресной строке.

Проанализируем пример кода, который вызывает ошибку:


// Ошибочный вариант с использованием POST
Запрос = Новый HTTPЗапрос("/api/1/ekf/catalog/files", Заголовки);
Запрос.УстановитьТелоИзСтроки("vendorCode=mcb4763-1-01C-pro", КодировкаТекста.UTF8);
Результат = Соединение.ОтправитьДляОбработки(Запрос); // Здесь получаем 405

Для исправления ситуации нам нужно перенести параметры из тела запроса непосредственно в строку URL и изменить метод вызова.

Шаг 2: Правильное формирование URL с параметрами

Когда мы переходим на GET, тело запроса (Body) игнорируется большинством серверов или приводит к ошибкам. Все параметры должны быть закодированы и добавлены в Query String (часть URL после знака вопроса).

Рассмотрим правильный алгоритм формирования запроса:

  1. Определяем базовый путь к методу API.
  2. Добавляем символ "?" для начала списка параметров.
  3. Добавляем пары "ключ=значение", разделяя их символом "&".
  4. Важно: Все значения параметров должны быть обработаны функцией КодироватьСтроку, чтобы спецсимволы не нарушили структуру URL.

Пример правильного формирования запроса в 1С:


Артикул = "mcb4763-1-01C-pro";
// Кодируем параметр для безопасной передачи в URL
ТекстЗапроса = "/api/1/ekf/catalog/files?vendorCode=" + КодироватьСтроку(Артикул, СпособКодированияСтроки.КодировкаURL);

Запрос = Новый HTTPЗапрос(ТекстЗапроса, Заголовки);
// Используем Получить() вместо ОтправитьДляОбработки()
Результат = Соединение.Получить(Запрос); 

Шаг 3: Настройка заголовков авторизации Bearer

Многие современные API (включая EKF) используют протокол OAuth 2.0 или аналогичную схему с токенами доступа. Заголовок Authorization должен быть заполнен строго по стандарту. Рассмотрим подробнее формат: Bearer [Ваш_Ключ].

Проанализируем типичную ошибку в оформлении этого заголовка. Иногда в документации ключ указывается в кавычках для выделения, и разработчики буквально вставляют кавычки в код 1С. В 99% случаев кавычки внутри значения заголовка не нужны.


// Правильное заполнение заголовка
Заголовки = Новый Соответствие;
APIKey = "ваш_длинный_ключ_из_личного_кабинета";
Заголовки.Вставить("Authorization", "Bearer " + APIKey);
Заголовки.Вставить("Accept", "application/json"); // Явно указываем, что ждем JSON

Шаг 4: Учет особенностей SSL и современных протоколов

Если после смены метода на GET вы начали получать ошибку 404 или ошибки соединения, следует обратить внимание на инфраструктурные изменения API. Со временем многие компании выносят API на отдельные поддомены, например, с ekfgroup.com/api/... на api.ekfgroup.com/....

Также важно помнить о безопасности. Современные серверы требуют протокол TLS 1.2 или выше. Если ваша база работает на старой версии платформы 1С (ниже 8.3.10), могут возникнуть проблемы с установкой защищенного соединения. Всегда используйте объект ЗащищенноеСоединениеOpenSSL() при инициализации HTTPСоединение.


// Рекомендуемая инициализация соединения
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.ekfgroup.com", , , , , , SSL);

Шаг 5: Использование инструментов отладки (Postman)

Если проблема сохраняется, мы рекомендуем проверить запрос через внешние утилиты, такие как Postman. Это позволит изолировать проблему: дело в коде 1С или в самом ключе/доступе к API.

Пошаговая проверка в Postman:

  1. Выберите тип запроса GET.
  2. Введите полный URL: https://api.ekfgroup.com/api/1/ekf/catalog/files?vendorCode=mcb4763-1-01C-pro.
  3. Во вкладке Headers добавьте ключ Authorization со значением Bearer [ваш_ключ].
  4. Нажмите Send и проанализируйте тело ответа.

Если в Postman запрос проходит успешно, а в 1С нет — проверьте кодировку строки запроса и корректность передачи заголовков. В 1С объекты Соответствие для заголовков чувствительны к именам ключей (иногда серверы требуют строго Content-Type, а не content-type, хотя по стандарту они регистронезависимы).

Резюме и рекомендации

Подведем итог. Чтобы победить ошибку 405 при работе с API в 1С, следуйте этим правилам:

Соблюдение этих структурных правил позволит избежать большинства ошибок при интеграции 1С с внешними информационными системами и обеспечит стабильный обмен данными.

← На главную