Как исправить ошибку 405 Not Allowed при отправке POST запроса с JSON в 1С?

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

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

Постановка задачи

Рассмотрим ситуацию: нам необходимо отправить массив товаров в сторонний сервис (например, банк или интернет-магазин). Документация API требует:

  1. Метод запроса: POST.
  2. Формат данных: JSON.
  3. Авторизация: Заголовок Authorization с ключевым словом token.
  4. Структура JSON должна содержать массив products с вложенными полями (sku, name, price) и запасами (stock).

Этап 1: Формирование структуры данных JSON

Для начала нам нужно правильно подготовить данные. В 1С для работы с JSON используются объекты ЗаписьJSON и комбинация типов Структура (для объектов {}) и Массив (для списков []).

Разберем пример кода, который формирует сложный JSON с вложенными массивами:


// Инициализируем запись JSON
ЗаписьJSON = Новый ЗаписьJSON;
тПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
ЗаписьJSON.УстановитьСтроку(тПараметрыJSON);

// Основной массив данных
МассивДанныхJSON = Новый Массив;

// Предположим, мы перебираем таблицу товаров
Для Каждого Строка Из Объект.ТабличнаяЧасть Цикл
    тДанные = Новый Структура;
    тДанные.Вставить("sku", Строка.Артикул); // Убедитесь, что типы совпадают с API (строка или число)
    тДанные.Вставить("name", Строка.Наименование);
    тДанные.Вставить("price", Строка.Цена);
    
    // Формирование вложенного массива запасов (stock)
    МассивЗапасов = Новый Массив;
    тСтруктураЗапасов = Новый Структура;
    тСтруктураЗапасов.Вставить("quantity", Строка.Остаток);
    тСтруктураЗапасов.Вставить("branch_id", Строка.ФилиалID);
    МассивЗапасов.Добавить(тСтруктураЗапасов);
    
    тДанные.Вставить("stock", МассивЗапасов);
    
    МассивДанныхJSON.Добавить(тДанные);
КонецЦикла;

// Обертка в корневой объект "products"
СтруктураДанныхJSON = Новый Структура;
СтруктураДанныхJSON.Вставить("products", МассивДанныхJSON);

// Сериализация в строку
ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхJSON);
СтрокаJS = ЗаписьJSON.Закрыть();

Обратите внимание на использование метода ЗаписатьJSON. Он автоматически экранирует спецсимволы (кавычки, слэши) в строках, что избавляет от множества ошибок по сравнению с ручной склейкой строк.

Этап 2: Настройка соединения и заголовков

Критически важный момент — правильная настройка заголовков, особенно авторизации. Часто API требуют специфического формата.

В cURL запросе это может выглядеть так: --header 'Authorization: token MY_SECRET_KEY'. В 1С это реализуется через объект Соответствие.


// Настройка SSL для HTTPS соединения
SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровОС);

// Создание соединения (ТОЛЬКО ХОСТ, без путей к ресурсам!)
// Например, если API по адресу https://market.mbank.kg/api/v1/items
// То сюда пишем только market.mbank.kg
Соединение = Новый HTTPСоединение("market.mbank.kg", 443, , , , , SSL);

// Формирование заголовков
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");

// ВАЖНО: Следите за пробелом после слова token, если API этого требует
Токен = "ВашДлинныйКлючAPI";
Заголовки.Вставить("Authorization", "token " + Токен); 

Этап 3: Причина ошибки 405 и правильный HTTPЗапрос

Теперь перейдем к главному — отправке запроса. Ошибка 405 Not Allowed означает, что веб-сервер понял, к какому адресу вы обращаетесь, но метод (в данном случае POST) для этого адреса запрещен.

Распространенная ошибка:
Часто разработчики ошибаются при создании объекта HTTPЗапрос, указывая неверный путь к ресурсу или оставляя там "мусор".

Посмотрим на ошибочный код из обсуждения:


// ОШИБКА ЗДЕСЬ:
Запрос = Новый HTTPЗапрос(",,,", Заголовки); 
// Аргумент ",,," — это некорректный путь к ресурсу.

Когда сервер (часто это Nginx) получает запрос на странный адрес (например https://site.com/,,,), он может попытаться обработать его как запрос к статическому файлу или корню сайта, где метод POST запрещен. Это и вызывает 405 ошибку, вместо ожидаемой 404 (Not Found).

Правильное решение:
В конструктор HTTPЗапрос нужно передавать относительный путь к методу API, который следует после адреса домена.


// Если полный адрес: https://market.mbank.kg/shop/items/
// То ресурс для запроса: /shop/items/

ПутьКРесурсу = "/shop/items/"; // Уточните точный путь в документации API
Запрос = Новый HTTPЗапрос(ПутьКРесурсу, Заголовки);

// Устанавливаем тело запроса (наш JSON)
Запрос.УстановитьТелоИзСтроки(СтрокаJS, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);

// Выполняем метод
Попытка
    Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос); // Или Соединение.ОтправитьДляОбработки(Запрос)
    
    Сообщить("Код состояния: " + Ответ.КодСостояния);
    Сообщить("Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
Исключение
    Сообщить("Ошибка соединения: " + ОписаниеОшибки());
КонецПопытки;

Резюме по диагностике ошибок

  1. Если вы получаете 405 Not Allowed, в 99% случаев проблема не в том, что "сервер не любит POST", а в том, что вы отправляете POST не на тот адрес (URL). Проверьте первый параметр конструктора HTTPЗапрос.
  2. Если вы получаете 401 Unauthorized, проверьте заголовок Authorization. Часто забывают пробел между типом токена (Bearer/token) и самим ключом.
  3. Если вы получаете 400 Bad Request, проверьте валидность JSON (типы данных: строка вместо числа и наоборот) или обязательные поля. Ответ сервера (тело ответа) обычно содержит детальное описание ошибки.

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

← На главную