При интеграции 1С:Предприятие с внешними API (маркетплейсы, банки, сервисы доставки) часто возникает необходимость отправки данных в формате JSON методом POST. Нередко разработчики сталкиваются с ошибкой сервера 405 Not Allowed (Метод не дозволен), даже если код кажется верным. В этой статье мы подробно разберем, как правильно сформировать HTTP-запрос, создать сложный JSON и, главное, выясним истинную причину появления ошибки 405 в типовых реализациях на 1С.
Рассмотрим ситуацию: нам необходимо отправить массив товаров в сторонний сервис (например, банк или интернет-магазин). Документация API требует:
Authorization с ключевым словом token.products с вложенными полями (sku, name, price) и запасами (stock).Для начала нам нужно правильно подготовить данные. В 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. Он автоматически экранирует спецсимволы (кавычки, слэши) в строках, что избавляет от множества ошибок по сравнению с ручной склейкой строк.
Критически важный момент — правильная настройка заголовков, особенно авторизации. Часто 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 " + Токен);
Теперь перейдем к главному — отправке запроса. Ошибка 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", Запрос); // Или Соединение.ОтправитьДляОбработки(Запрос)
Сообщить("Код состояния: " + Ответ.КодСостояния);
Сообщить("Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
Исключение
Сообщить("Ошибка соединения: " + ОписаниеОшибки());
КонецПопытки;
HTTPЗапрос.Authorization. Часто забывают пробел между типом токена (Bearer/token) и самим ключом.Используйте этот подход, чтобы структурно находить ошибки в интеграциях, разделяя процесс на формирование данных, настройку транспорта и проверку адресации ресурса.