Как исправить ошибку 400 "incorrect data" при изменении цен на Wildberries через API из 1С?

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

При работе с API Wildberries для обновления цен из 1С программисты часто сталкиваются с общей и малоинформативной ошибкой {"errors":["incorrect data"]} с кодом состояния 400. Это происходит при отправке POST-запроса на эндпоинт /public/api/v1/prices, даже когда кажется, что тело JSON-запроса и заголовки сформированы в точном соответствии с документацией. Разберем по шагам, какие неочевидные моменты могут приводить к этой проблеме и как ее решить.

Проанализируем ситуацию, когда у нас есть рабочий код для GET-запросов, но POST-запрос на изменение цены не проходит. В первую очередь, необходимо проверить сам код формирования HTTP-запроса.

Шаг 1. Проверка и корректировка кода формирования JSON-тела запроса

Первоначальная задача — отправить на сервер массив номенклатур с новыми ценами. Рассмотрим типичный пример кода на 1С для этой задачи и сразу выявим потенциальную ошибку.

Неверный вариант кода:


Данные = Новый Структура(); // !!! Ошибка: структура создается один раз вне цикла
МассивЦен = новый массив();
Для каждого стр из Тз_Цен цикл
    Данные.Вставить("nmId", стр.nmId);
    Данные.Вставить("price", стр.price);
    МассивЦен.Добавить(Данные); // В массив добавляется ссылка на один и тот же объект
конеццикла;

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивЦен);
ТелоЗапроса = ЗаписьJSON.Закрыть();

Ключевая проблема здесь в том, что объект Структура создается один раз до начала цикла. Внутри цикла мы не создаем новый объект, а лишь меняем значения в уже существующем. Поскольку в массив МассивЦен добавляется ссылка на этот единственный объект, в итоге массив будет состоять из N одинаковых элементов, содержащих данные последней строки из таблицы Тз_Цен. Если в таблице всего одна строка, эта ошибка не проявится, но при отправке нескольких цен приведет к некорректным данным.

Правильный вариант кода:

Чтобы исправить это, необходимо создавать новый объект Структура на каждой итерации цикла.


МассивЦен = новый массив();
Для каждого стр из Тз_Цен цикл
    // Создаем новую структуру для каждой номенклатуры
    Данные = Новый Структура(); 
    Данные.Вставить("nmId", стр.nmId);
    Данные.Вставить("price", стр.price);
    МассивЦен.Добавить(Данные);
конеццикла;

// Дальнейший код сериализации в JSON остается без изменений
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивЦен);
ТелоЗапроса = ЗаписьJSON.Закрыть();

Эта поправка обеспечивает корректное формирование массива объектов для отправки.

Шаг 2. Установка правильной кодировки для тела запроса

Даже с правильно сформированным JSON ошибка 400 может оставаться. Следующий критически важный момент — кодировка, в которой 1С передает тело запроса. По умолчанию она может не соответствовать тому, что ожидает сервер Wildberries (UTF-8). Неправильная кодировка — одна из самых частых причин ошибки "incorrect data".

Чтобы это исправить, нужно явно указать кодировку при установке тела запроса. Используем метод УстановитьТелоИзСтроки с дополнительными параметрами.


HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере); 
HTTPЗапрос.Заголовки.Вставить("Authorization", Строка(Ключ));
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");

// ... код формирования ТелоЗапроса ...

// Устанавливаем тело запроса с явным указанием кодировки UTF-8 и без BOM-маркера
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Почему это важно?

После этого изменения сервер, скорее всего, начнет возвращать более осмысленные ответы вместо общего "incorrect data".

Шаг 3. Расшифровка ответа API и проверка прав токена

После исправления кодировки вы можете получить новый ответ от сервера:

{"errors":["No goods for process"],"error_code":1}

На первый взгляд это выглядит как ошибка, но на самом деле это специфический ответ API Wildberries. Проанализируем его возможные причины.

  1. Отправляемая цена равна текущей.
    Самая частая причина этого сообщения — вы пытаетесь установить цену, которая уже установлена для данной номенклатуры (nmId). API Wildberries не считает это ошибкой, а просто информирует, что для указанных товаров обработка не требуется. Чтобы запрос прошел успешно и вернул код 200, нужно отправить новую, отличающуюся цену.
  2. Недостаточно прав у API-токена.
    Система токенов Wildberries имеет гранулярную настройку прав. Если ваш токен был создан без права на управление ценами, сервер также может вернуть подобную ошибку или ошибку доступа. Что нужно проверить:
    • Зайдите в личный кабинет поставщика Wildberries.
    • Перейдите в раздел управления API-токенами.
    • Убедитесь, что для вашего токена предоставлены права на запись (write) в разделе "Цены и скидки".
    • Если прав нет, создайте новый токен с необходимыми разрешениями. Старым токенам права добавить нельзя, нужно создавать новый.
  3. Товар не принадлежит вашему кабинету.
    Убедитесь, что артикул (nmId), для которого вы меняете цену, действительно относится к тому кабинету, от которого сгенерирован API-токен.
  4. Ограничения на изменение цен.
    API может временно блокировать изменение цены по внутренним правилам, например:
    • Резкое повышение цены (например, более чем на 30% за короткий период).
    • Карточка товара создана недавно и еще не прошла модерацию или первую поставку.
    • Товар участвует в акции, во время которой изменение цены заблокировано.
    В этих случаях ответ может быть иным, но ошибку 400 тоже нельзя исключать.

Итоговый рабочий код и резюме

Собрав все исправления вместе, получаем надежный фрагмент кода для изменения цен на Wildberries.


// Функция получения ключа API
Ключ = ВБ_Ключ(); 

// Адрес ресурса
ПолныйАдресРесурса = "https://suppliers-api.wildberries.ru/public/api/v1/prices";
СтруктураURI = СтруктураURI(ПолныйАдресРесурса);

// Создание защищенного соединения
SSL = Новый ЗащищенноеСоединениеOpenSSL();
HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, 443, , , , , SSL);

// Формирование массива цен (ПРАВИЛЬНЫЙ вариант)
МассивЦен = Новый Массив();
Для Каждого стр Из Тз_Цен Цикл
    Данные = Новый Структура;
    Данные.Вставить("nmId", стр.nmId);
    Данные.Вставить("price", стр.price);
    МассивЦен.Добавить(Данные);
КонецЦикла;

// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивЦен);
ТелоЗапроса = ЗаписьJSON.Закрыть();

// Формирование HTTP-запроса
HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
HTTPЗапрос.Заголовки.Вставить("Authorization", Строка(Ключ));
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json; charset=utf-8");

// Установка тела с правильной кодировкой
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

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

// Обработка ответа
Если Ответ.КодСостояния = 200 Тогда
    Сообщить("Цены успешно обновлены!");
    // Здесь можно разобрать ответ, если он что-то содержит
Иначе
    Сообщить("Ошибка при обновлении цен. Код состояния: " + Ответ.КодСостояния);
    Сообщить("Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

Подведем итог. Для успешного изменения цен на Wildberries через API из 1С необходимо выполнить четыре ключевых шага:

  1. Корректно формировать массив данных, создавая новый объект для каждого элемента внутри цикла.
  2. Явно указывать кодировку UTF-8 без BOM-маркера для тела POST-запроса.
  3. Проверить права API-токена в личном кабинете Wildberries — он должен иметь доступ на запись к ценам.
  4. Помнить о логике API: отправлять только изменившиеся цены, чтобы избежать ответа "No goods for process".

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

← На главную