Добрый день, недавно разбирался и ждал порцию новых транзакций от WB.
Как оказалось, на стороне сервиса была произведена смена версии api, старая v1 остается работать, но только для получения данных до 29 января.
Не буду долго лить воду, начнем по коду.
Интеграцию делаю через стандартные функции 1С без БСП, только код платформы.
1. Первое, что необходимо для получения статистики - получить токен на доступ к этой самой статистике.
Для этого необходимо войти в личный кабинет ВБ Партнеры под Владельцем кабинета, Профиль -
Настройки - Доступ к API, добавить новый ключ и указать ему право на доступ к статистике.
2. Соответственно сам код
Ограничения
Максимальный период запроса данных не более 30 дней
Каждый понедельник с 00.00 до 16.00 данный метод на профилактике =)
Входные данные:
У нас есть переменная КлючАПИ - здесь будет храниться наш ключ к апи
ДатаНачала - дата начала получения данных
ДатаОкончания - дата окончания получения данных
Сам код обхода периодов с учетом ограничений выглядеть в моем случае будет так:
&НаСервере
Процедура ЗагрузитьНаСервере()
СекундВОдномДне = 86400;
ОграничениеВДнях = 30;
врДатаНачала = ДатаНачала;
ДатаПереходаНаНовуюВерсиюАПИ = Дата("20240129");
ИспользованиеНовойВерсииАПИ = Истина;
Пока врДатаНачала <= ДатаОкончания Цикл
ДатаНачалаТранзакций = НачалоДня(врДатаНачала);
ДатаОкончанияТранзакций = ДатаНачалаТранзакций + ОграничениеВДнях * СекундВОдномДне;
Если ДатаОкончанияТранзакций > ДатаОкончания Тогда
ДатаОкончанияТранзакций = ДатаОкончания;
КонецЕсли;
Если ДатаНачалаТранзакций <= ДатаПереходаНаНовуюВерсиюАПИ Тогда
ИспользованиеНовойВерсииАПИ = Ложь;
Если ДатаОкончанияТранзакций > ДатаПереходаНаНовуюВерсиюАПИ Тогда
ДатаОкончанияТранзакций = ДатаПереходаНаНовуюВерсиюАПИ;
КонецЕсли;
КонецЕсли;
ДатаОкончанияТранзакций = КонецДня(ДатаОкончанияТранзакций);
СписокТранзакций = МаркетПолучитьСтатистикуЗаПериод(ДатаНачалаТранзакций, ДатаОкончанияТранзакций, ИспользованиеНовойВерсииАПИ);
// обрабатываем или перемещаем в единый массив транзакции
врДатаНачала = ДатаОкончанияТранзакций + 1;// добавляем 1 секунду для перехода в следующий день
КонецЦикла;
КонецПроцедуры
Для загрузки данных через апи "МаркетПолучитьСтатистикуЗаПериод" код привожу ниже.
// GET https://statistics-api.wildberries.ru/api/v5/supplier/reportDetailByPeriod
Функция МаркетПолучитьСтатистикуЗаПериод(Знач ПериодНачало, Знач ПериодОкончание, ИспользованиеНовойВерсииАПИ = Истина) Экспорт
ОтветМассивТранзакций = Новый Массив();
// создаем http соединение с таймаутом в 60 секунд
Хост = "statistics-api.wildberries.ru";
Таймаут = 60;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
СоединениеHttp = Новый HTTPСоединение(Хост, , , , , Таймаут, ЗащищенноеСоединение);
КодОтветаУспех = 200;
Заголовки = Новый Соответствие();
Заголовки.Вставить("Authorization", КлючАПИ);
Заголовки.Вставить("Content-Type", "application/json");
rrdid = 0; // Уникальный идентификатор строки отчета из предыдущего запроса для продолжения получения данных
limit = 100000; // максимально не может быть более 100000
Если ИспользованиеНовойВерсииАПИ = Истина Тогда
АдресРесурсаСтатический = "api/v5/supplier/reportDetailByPeriod";
Иначе
АдресРесурсаСтатический = "api/v1/supplier/reportDetailByPeriod";
КонецЕсли;
Пока Истина Цикл
АдресРесурса = АдресРесурсаСтатический
+ "?dateFrom=" + Формат(ПериодНачало, "ДФ=гггг-ММ-ддTЧЧ:мм:сс")
+ "&dateTo=" + Формат(ПериодОкончание, "ДФ=гггг-ММ-ддTЧЧ:мм:сс")
+ "&rrdid=" + Формат(rrdid, "ЧН=0; ЧГ=") + "&limit=" + Формат(limit, "ЧГ=");
ЗапросHttp = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Попытка
ОтветHttp = СоединениеHttp.Получить(ЗапросHttp);
Исключение
ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ВызватьИсключение ТекстОшибки;
КонецПопытки;
Если Не ОтветHttp.КодСостояния = КодОтветаУспех Тогда
ТекстОшибки = ОтветHttp.ПолучитьТелоКакСтроку();
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветHttp.ПолучитьТелоКакСтроку());
МассивТранзакций = ПрочитатьJSON(ЧтениеJSON, Ложь);
ЧтениеJSON.Закрыть();
Если ЗначениеЗаполнено(МассивТранзакций) Тогда
Для Каждого Транзакция Из МассивТранзакций Цикл
ОтветМассивТранзакций.Добавить(Транзакция);
rrdid = Транзакция.rrd_id;
КонецЦикла;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ОтветМассивТранзакций;
КонецФункции
Теперь про сами транзакции, какие поля обрабатываю, какие виды транзакций.
В данный момент мои загрузчики сходятся полностью с детализированной сводкой по отчету внутри личного кабинета WB. (P.S. но так было не всегда, ох уж это разнообразие типов транзакций)
Внутри ответа в каждой строке для идентификации типа транзакции использую поле
"supplier_oper_name"
Единственное, все перевожу в верхний регистр, так как в старой версии были названия с большой буквы, в новой все с маленькой
НаименованиеТранзакции = ВРег(Транзакция.supplier_oper_name);
// список транзакций, которые встречал на данный момент
"ПРОДАЖА" - сама продажа
"ВОЗВРАТ" - начисление за возврат
"ЛОГИСТИКА" - оплата доставки до клиента и обратно при возврате
"ВОЗМЕЩЕНИЕ ИЗДЕРЖЕК ПО ПЕРЕВОЗКЕ" - внутренняя транзакция WB, не влияющая в данный момент на суммы выплат (на всякий случай проверяю в данный момент суммы внутри, вдруг что изменится)
"ЧАСТИЧНАЯ КОМПЕНСАЦИЯ БРАКА" - начисление за брак/потерю товара
"КОМПЕНСАЦИЯ ПОДМЕНЕННОГО ТОВАРА" - начисление за брак/потерю товара
"УДЕРЖАНИЕ" - разновидность штрафов
"ШТРАФ" - разновидность штрафов
"ШТРАФЫ" - разновидность штрафов
"ХРАНЕНИЕ" - хранение товара
"КОРРЕКЦИЯ ПРОДАЖ" - корректировка для продажи
"КОРРЕКТНЫЙ ВОЗВРАТ" - корректировка для возврата
"АВАНСОВАЯ ОПЛАТА ЗА ТОВАР БЕЗ ДВИЖЕНИЯ" - начисления за товар который лежит на складах и не продается
Поля с суммами
Транзакция.ppvz_for_pay - сумма продажи, в рублях
Транзакция.delivery_rub - сумма которую вб забирает за доставку (приходит как положительная)
Транзакция.penalty - сумма штрафов (приходит как положительная)
Транзакция.additional_payment - доплаты (приходит как положительная)
Транзакция.storage_fee - стоимость хранения (приходит как положительная, в некоторых транзакциях может отсутствовать поле)
Транзакция.deduction - прочие удержания/выплаты (приходит как положительная, в некоторых транзакциях может отсутствовать поле)
Поля которые использую при загрузке
Транзакция.shk_id - штрихкод отправления числом
Транзакция.rr_dt - дата начисления
Транзакция.realizationreport_id - уникальный номер отчета
Транзакция.rrd_id - уникальный номер транзакции внутри отчета
Транзакция.supplier_oper_name - тип транзакции (продажа/возврат)
Транзакция.barcode - код номенклатуры
Не рассчитываю на уникальность или супер знания, но верю, что данная статья поможет кому-то сократить время разбора ответов и получения данных по апи от сервиса WB.
Спасибо всем за внимание.
Дополнение от 08.05.2024
Все остается прежним, кроме того что теперь у метода v5
// GET https://statistics-api.wildberries.ru/api/v5/supplier/reportDetailByPeriod
Готовое решение
Загрузка отчета о продажах WildBerries для бухгалтера
Загрузка данных детализированного отчета о продажах WildBerries в 1С документ "Отчет комиссионера" для бухгалтера для следующих конфигураций 1С: БП 3.0; УНФ 3.0; УТ 10.3; УТ 11.4/11.5, КА 2.4/2.5 и ERP 2.4/2.5