Как исправить ошибку 404 и 403 Forbidden «OAuth token is invalid» при запросе остатков через API Яндекс Маркета в 1С?

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

При интеграции 1С с маркетплейсом Яндекс Маркет разработчики часто сталкиваются с ошибками авторизации при отправке HTTP-запросов. Наиболее распространенные из них — это 403 Forbidden (OAuth token is invalid) и 404 Not Found при попытке получить или обновить остатки товаров. В этой статье мы подробно разберем причины возникновения этих ошибок, выясним разницу между идентификаторами кабинета и напишем отказоустойчивый код на языке 1С для работы с актуальной версией API Яндекс Маркета. Если синхронизацию остатков и заказов необходимо выполнить в 1С:УТ 11, КА 2 или ERP 2 без ручной разработки HTTP-запросов, применяется модуль интеграции 1С с Яндекс.Маркетом, Ozon и Wildberries.

В чем причина ошибок 403 Forbidden и 404?

Для начала проанализируем ситуацию и выделим две основные архитектурные ошибки, которые допускают разработчики при первоначальной настройке интеграции:

  1. Путаница между Business ID и Campaign ID. В API Яндекс Маркета эти понятия строго разделены. Business ID (идентификатор бизнеса) объединяет все ваши магазины и склады в рамках одного юридического лица. Однако конечные операции (такие как запрос остатков, получение заказов или обновление цен) всегда выполняются в контексте конкретного магазина — для этого используется Campaign ID (идентификатор кампании/магазина). Если в URL запроса подставить Business ID вместо Campaign ID, сервер вернет ошибку 404 Not Found или 403 Forbidden, так как запрашиваемый ресурс по указанному пути просто не существует.
  2. Использование устаревшего метода авторизации OAuth. Исторически Яндекс Маркет поддерживал авторизацию через стандартный протокол OAuth с передачей токена в заголовке Authorization: Bearer [токен]. На сегодняшний день для большинства партнерских методов этот способ является устаревшим или требует строгого соответствия прав учетной записи. Актуальный и наиболее стабильный способ авторизации для серверных интеграций (включая 1С) — использование заголовка Api-Key с постоянным ключом доступа.

Рассмотрим подробнее, как исправить эти ошибки по шагам.

Шаг 1. Получаем правильные идентификаторы в кабинете Яндекс Маркета

Прежде чем переходить к написанию кода в 1С, необходимо собрать корректные параметры подключения в личном кабинете продавца:

  1. Перейдите в личный кабинет партнера Яндекс Маркета.
  2. В меню выберите раздел «Настройки», затем перейдите в подраздел «Настройки API».
  3. Найдите поле «Номер кампании» (это и есть ваш Campaign ID). Он уникален для каждой модели работы (FBS, FBY, DBS) и каждого конкретного магазина. Запишите его.
  4. В этом же разделе сгенерируйте Ключ API (Api-Key). Этот ключ создается под конкретного пользователя. Обратите внимание: логин, под которым создается ключ, должен обладать правами «Администратор» или «Оператор» в кабинете маркетплейса, иначе сервер будет возвращать ошибку прав доступа.

Шаг 2. Настраиваем заголовки HTTP-запроса в 1С

Вместо использования стандартного заголовка Authorization, мы будем использовать специальный заголовок Api-Key. Это позволит избежать проблем с валидацией токенов OAuth.

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


Заголовки = Новый Соответствие;
Заголовки.Вставить("Api-Key", СокрЛП(ПараметрыПодключения.КлючAPI));
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("Accept", "application/json");

Если вам все же необходимо использовать именно OAuth-авторизацию (например, при интеграции через стороннее приложение-посредник), убедитесь, что заголовок формируется строго по стандарту, без лишних кавычек и с одним пробелом после ключевого слова:

Заголовки.Вставить("Authorization", "Bearer " + СокрЛП(OAuth_Токен));

Шаг 3. Пишем код для запроса остатков товаров

Разберем по шагам создание процедуры на платформе 1С для отправки GET-запроса к API Яндекс Маркета. Мы будем использовать встроенные механизмы работы с HTTP-соединением и защищенным SSL-соединением. В качестве готового альтернативного решения можно использовать обработку для синхронизации FBS-остатков между Озон и Яндекс.Маркет.

Ниже представлен готовый листинг кода, который вы можете использовать в своих обработках:


&НаСервере
Процедура ПолучитьОстаткиНаМаркете()

    // 1. Установка параметров подключения
    АдресСервера = "api.partner.market.yandex.ru";
    CampaignId   = "12345678"; // Сюда подставляем реальный Campaign ID (идентификатор магазина)
    КлючAPI      = "Ваш_Api_Key_Из_Кабинета_Маркета"; 
    
    // Формируем ресурс согласно документации API v2 или v3
    // Обратите внимание: метод GET /v2/campaigns/{campaignId}/stocks.json возвращает остатки самого Маркета
    Ресурс = "/v2/campaigns/" + CampaignId + "/stocks.json";
    
    // 2. Формирование заголовков запроса
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Api-Key", КлючAPI);
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("Accept", "application/json");
    
    // 3. Инициализация защищенного SSL-соединения
    // Для работы с современными протоколами TLS рекомендуется использовать дефолтные настройки ОС
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
    
    Попытка
        HTTPСоединение = Новый HTTPСоединение(АдресСервера, , , , , 30, ЗащищенноеСоединение);
        HTTPЗапрос = Новый HTTPЗапрос(Ресурс, Заголовки);
    Исключение
        ЗаписьЖурналаРегистрации("ИнтеграцияЯндексМаркет", УровеньЖурналаРегистрации.Ошибка, , , 
            "Ошибка создания HTTP-соединения: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // 4. Выполнение GET-запроса к серверу
    Попытка
        Ответ = HTTPСоединение.Получить(HTTPЗапрос);
    Исключение
        ЗаписьЖурналаРегистрации("ИнтеграцияЯндексМаркет", УровеньЖурналаРегистрации.Ошибка, , , 
            "Ошибка отправки запроса: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // 5. Обработка полученного ответа
    Если Ответ.КодСостояния = 200 Тогда
        ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
        
        // Разбор JSON ответа от сервера
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(ОтветСтрокой);
        ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON, Истина);
        ЧтениеJSON.Закрыть();
        
        // Анализируем структуру полученных данных
        Если ДанныеОтвета.Свойство("result") И ДанныеОтвета.result.Свойство("stocks") Тогда
            Для Каждого СтрокаОстатка Из ДанныеОтвета.result.stocks Цикл
                // Извлекаем SKU товара на Маркете и доступный остаток
                ИдентификаторТовара = СтрокаОстатка.marketSku;
                ДоступныйОстаток    = СтрокаОстатка.count;
                
                Сообщить(СтрШаблон("Товар SKU: %1, Доступный остаток: %2", ИдентификаторТовара, ДоступныйОстаток));
            КонецЦикла;
        Иначе
            Сообщить("Ответ получен, но структура данных пуста или неверна.");
        КонецЕсли;
        
    Иначе
        // Обрабатываем ошибки сервера
        Сообщить("Не удалось получить данные. Код состояния: " + Ответ.КодСостояния);
        Сообщить("Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;

КонецПроцедуры

Дополнительные рекомендации по диагностике

Если после внесения изменений в код 1С вы все еще продолжаете получать ошибку 403, проанализируйте следующие факторы:

Применяя современный метод авторизации через заголовок Api-Key и указывая точный идентификатор кампании магазина вместо общего идентификатора бизнеса, вы полностью избавитесь от ошибок авторизации и обеспечите стабильный обмен данными между 1С и маркетплейсом. Для автоматизации сопутствующих задач можно использовать обработку для загрузки заказов из Яндекс.Маркет и создания документов реализации.

← На главную