При работе с API Wildberries для обновления цен из 1С программисты часто сталкиваются с общей и малоинформативной ошибкой {"errors":["incorrect data"]} с кодом состояния 400. Это происходит при отправке POST-запроса на эндпоинт /public/api/v1/prices, даже когда кажется, что тело JSON-запроса и заголовки сформированы в точном соответствии с документацией. Разберем по шагам, какие неочевидные моменты могут приводить к этой проблеме и как ее решить.
Проанализируем ситуацию, когда у нас есть рабочий код для GET-запросов, но POST-запрос на изменение цены не проходит. В первую очередь, необходимо проверить сам код формирования HTTP-запроса.
Первоначальная задача — отправить на сервер массив номенклатур с новыми ценами. Рассмотрим типичный пример кода на 1С для этой задачи и сразу выявим потенциальную ошибку.
Неверный вариант кода:
Данные = Новый Структура(); // !!! Ошибка: структура создается один раз вне цикла
МассивЦен = новый массив();
Для каждого стр из Тз_Цен цикл
Данные.Вставить("nmId", стр.nmId);
Данные.Вставить("price", стр.price);
МассивЦен.Добавить(Данные); // В массив добавляется ссылка на один и тот же объект
конеццикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивЦен);
ТелоЗапроса = ЗаписьJSON.Закрыть();
Ключевая проблема здесь в том, что объект Структура создается один раз до начала цикла. Внутри цикла мы не создаем новый объект, а лишь меняем значения в уже существующем. Поскольку в массив МассивЦен добавляется ссылка на этот единственный объект, в итоге массив будет состоять из N одинаковых элементов, содержащих данные последней строки из таблицы Тз_Цен. Если в таблице всего одна строка, эта ошибка не проявится, но при отправке нескольких цен приведет к некорректным данным.
Правильный вариант кода:
Чтобы исправить это, необходимо создавать новый объект Структура на каждой итерации цикла.
МассивЦен = новый массив();
Для каждого стр из Тз_Цен цикл
// Создаем новую структуру для каждой номенклатуры
Данные = Новый Структура();
Данные.Вставить("nmId", стр.nmId);
Данные.Вставить("price", стр.price);
МассивЦен.Добавить(Данные);
конеццикла;
// Дальнейший код сериализации в JSON остается без изменений
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивЦен);
ТелоЗапроса = ЗаписьJSON.Закрыть();
Эта поправка обеспечивает корректное формирование массива объектов для отправки.
Даже с правильно сформированным JSON ошибка 400 может оставаться. Следующий критически важный момент — кодировка, в которой 1С передает тело запроса. По умолчанию она может не соответствовать тому, что ожидает сервер Wildberries (UTF-8). Неправильная кодировка — одна из самых частых причин ошибки "incorrect data".
Чтобы это исправить, нужно явно указать кодировку при установке тела запроса. Используем метод УстановитьТелоИзСтроки с дополнительными параметрами.
HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
HTTPЗапрос.Заголовки.Вставить("Authorization", Строка(Ключ));
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
// ... код формирования ТелоЗапроса ...
// Устанавливаем тело запроса с явным указанием кодировки UTF-8 и без BOM-маркера
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Почему это важно?
КодировкаТекста.UTF8 — стандарт для большинства современных API.ИспользованиеByteOrderMark.НеИспользовать — указывает не добавлять в начало строки специальный маркер последовательности байтов (BOM), который некоторые серверы могут неверно интерпретировать, что тоже приводит к ошибкам парсинга JSON.После этого изменения сервер, скорее всего, начнет возвращать более осмысленные ответы вместо общего "incorrect data".
После исправления кодировки вы можете получить новый ответ от сервера:
{"errors":["No goods for process"],"error_code":1}
На первый взгляд это выглядит как ошибка, но на самом деле это специфический ответ API Wildberries. Проанализируем его возможные причины.
nmId). API Wildberries не считает это ошибкой, а просто информирует, что для указанных товаров обработка не требуется. Чтобы запрос прошел успешно и вернул код 200, нужно отправить новую, отличающуюся цену.
nmId), для которого вы меняете цену, действительно относится к тому кабинету, от которого сгенерирован API-токен.
Собрав все исправления вместе, получаем надежный фрагмент кода для изменения цен на 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С необходимо выполнить четыре ключевых шага:
Выполнение этих рекомендаций поможет избежать неочевидных ошибок и наладить стабильный обмен данными с популярным маркетплейсом.