Демонстрация взаимодействия системы учета на 1С и АПИ Вайлдберриз. Готовое решение, которое можно доработать под ваши запросы. Новая версия API 1.0.2, расскажу, как получить supplierID, как создать карточки товара на вайлдберриз, как получить остатки и задать цены.
Прошлую статью по интеграции с Wildberries я писал в конце 2020 и с тех пор многое поменялось. Работа с API стала чуть проще, однако нюансы взаимодействия с Вайлдберриз никуда не делись. В этой статье я покажу как взаимодействовать с АПИ из 1С и представленную мной обработку можно взять за пример и доработать.
Если вы программист: Здравствуйте, коллега! В статье расскажу некоторые нюансы схемы данных у WB и дам примеры кода. У Вайлдберриз теперь есть для тестирования запросов Swagger, и по сути главное для интеграции правильно сформировать JSON на стороне 1С. Но будьте аккуратны, тестовой среды больше нет и все запросы сразу попадают в продакшн и в ЛК вашего Заказчика. Не забудьте поставить плюсик статье!
Получение токена АПИ и supplierId для запросов.
Токен для АПИ получить легко. В разделе «настройки» в ЛК есть вкладка «доступ к новому API» где этот токен и получается. Токен нужно передавать в каждом запросе в HTTP заголовке Authorization
Как получить supplierId в личном кабинете Wildberries
Проще всего для этого в ЛК открыть список ваших юрлиц в правом верхнем углу (там где в меню Профиль и Настройки), кликнуть правой кнопкой мыши и нажать «просмотреть код» в Chrome.
Там сразу в HTML коде видна метка «FOR» где прописан ваш идентификатор supplierID.
Еще можно написать запрос в поддержку, с просьбой отправить вам supplierID, но они долго отвечают.
Этот самый идентификатор нужен для многих запросов к АПИ, хотя некоторые запросы и без него работают — видимо, есть связь между Токеном доступа к АПИ и supplierID.
Получение списка существующих карточек
Чаще всего бывает так, что карточки товара уже созданы вручную или загружены из Ексель, и их надо получить на стороне 1С. Делаем для этого запрос «/card/list» к АПИ. Важно убрать все из параметра filter и поставить limit побольше. Впрочем, я в обработке сделал пример где limit 100 и получение идет в цикле, увеличивая offset. Вот код в функции СписокКарточекВБ:
На вкладке «служебное» всегда можно посмотреть отправленный и полученный текст JSON
Сопоставление данных Вайлдберриз и 1С. Нюансы схемы данных.
У Wildberries есть следующие сущности: Карточка (Card) и ее идентификатор imtId и supplierVendorCode (Артикул Поставщика), Номенклатура (массив nomenclatures в карточке) и ее идентификатор nmId и vendorCode (Артикул Цвета).
Еще у Карточки есть дополнения (addin) где указывается Бренд и ТНВЭД.
А у Номенклатуры есть variations где указывается Размер (идентификатор chrtId) и его Штрихкоды (barcodes). Внутри variations есть еще addin где указывается цена товара (целое число без копеек).
Для примера рассмотрим поиск по штрихкоду, а затем если не нашли, по артикулу номенклатуры (vendorCode) в базе 1С. Вот код:
Запишем идентификаторы nmId в регистр Дополнительные сведения, чтобы связать с номенклатурой 1С. Вот код:
&НаСервере
Процедура ЗаписатьДопСвойство(НоменклатураСсылка,ИмяСвойства,ЗначениеСвойства)
ПВХСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяСвойства,Истина);
Если ПВХСвойство.Пустая() Тогда
ПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
ПВХ.Наименование = ИмяСвойства;
ПВХ.Заголовок = ИмяСвойства;
ПВХ.ТипЗначения = Типзнч(ЗначениеСвойства);
ПВХ.Записать();
ПВХСвойство = ПВХ.Ссылка;
КонецЕсли;
Набор = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
Набор.Период = ТекущаяДата();
Набор.Объект = НоменклатураСсылка;
Набор.Свойство = ПВХСвойство;
Набор.Значение = ЗначениеСвойства;
Набор.Записать(Истина);
КонецПроцедуры
Получение цен
Делаем GET Запрос на ресурс АПИ «/public/api/v1/info?quantity=0». В запросе нам возвращаются идентификаторы номенклатуры nmId, поэтому важно на шаге 3 понять как эти nmId сопоставлены с вашей базой 1С. Я в своей обработке предположил, что сначала получаются Карточки, и поэтому делаю поиск по табличке которая там есть. Цены беру в регистре ЦеныНоменклатуры. Поля discount и promoCode я не использую в расчете, просто храню и отображаю их в таблице в обработке.
Изменение цен
Для примера я взял УТ 11 на платформе 8.3.18, где цены лежат в регистре ЦеныНоменклатуры. Для своей конфигурации можно модифицировать запрос цен нужным образом. Отправляется POST запрос на ресурс «/public/api/v1/prices». Из таблички на форме отправляю те строки, где есть цена 1С и стоит галочка «Обновить цену». Чтобы не отправлять HTTP запрос по каждой строке с ценами, собираю в JSON запрос массив номенклатур.
&НаСервере
Процедура ЗадатьЦеныИз1СНаСервере()
//задаем цены в ВБ из 1С — Таблички на форме
Адрес = «/public/api/v1/prices»;
МассивЗапроса = Новый Массив;
Для Каждого СтрТ из Объект.Товары Цикл
Если СтрТ.ОбновитьЦену Тогда
СтруктураЦены = Новый Структура;
СтруктураЦены.Вставить(«nmId»,СтрТ.nmID);//число!
СтруктураЦены.Вставить(«price»,СтрТ.Цена1С);
КонецЕсли;
КонецЦикла;
Жсон = СтруктураВJson(МассивЗапроса);
ОтветАПИ = ВыполнитьМетодАПИ(Жсон,Адрес,»POST»);
КонецПроцедуры
Получение и обновление остатков
Для получения остатков — делаем GET Запрос на ресурс АПИ «/api/v2/stocks?skip=0&take=1000». Кстати, по примеру видно что программисты в Вайлдберриз фанаты Властелина колец. Их пример:
Для обновления же остатков нужен POST запрос на ресурс «/api/v2/stocks» и там еще надо знать warehouseId. Где же его взять? Только из предыдущего запроса по получению остатков, либо сделать GET запрос к АПИ «/api/v2/warehouses».
Получение списка заказов
Делаем GET Запрос на ресурс АПИ «/api/v2/orders?date_start=2022-01-01T13:00:00Z&status=2&take=10&skip=0». Тут главное форматировать дату по RFC3339 в формате «yyyy-MM-ddTHH:mm:ssZ». Пример, который должен получиться из ответа АПИ:
Для обработки 1С я предполагаю, что структура заказа такая же, как в примере у Вайлдберриз. Нюанс обработки заказов в том, что Вайлдберриз выдают очередные левые идентификаторы в описании OrdersAPIResponse вместо привычного уже идентификатора номенклатуры nmID выдают идентификатор размера chrtId, ну и штрихкод тоже есть.
Как реализовать поиск в 1С заказов по данным штрихкода и chrtId оставляю на ваше усмотрение. Лично я решил в процессе получения карточек (вкладка 2 Карточки ВБ) записывать для Номенклатуры все ее ид размеров chrtId в регистр ДопСведений. И, таким образом, есть сопоставление chrtId и Номенклатуры 1С. Можно еще искать по Штрихкоду в регистре штрихкодов, но у ВБ могут быть свои штрихкоды, отличные от 1С.
Скриншоты интерфейса обработки:
По просьбам в комментариях добавил скриншоты интерфейса обработки.
Остальные функции
Думаю, что вышеприведенных примеров достаточно, чтобы дальше доработать остальное самостоятельно. Если есть вопросы, можно написать мне в телеграм, поискав меня по имени. Не забудьте поставить плюсик статье!
Также в конце статьи приведу список ошибок АПИ, с которыми я сталкивался в процессе тестирования, для того чтобы их могли найти в поисковике и прочитать эту статью. Обычно эти ошибки были следствием некорректного JSON, хотя иногда я был уверен что и баги в АПИ тоже есть.
list of cards: (BadValue) $and must be an array
Следующие комбинации характеристик «Артикул поставщика» и «Бренд» уже используются
Характеристика: tech_size. Ошибка: Артикул с таким размером уже создан! Удалите позицию из спецификации и загрузите на нее баркод в разделе Загрузки — Загрузки баркодов
Следующие комбинации характеристик «Артикул поставщика», «Артикул цвета» и «Бренд» уже используются
Такая комбинация бренда и артикула поставщика уже используется
Характеристика: sa_nm. Ошибка: Артикул принадлежит другому поставщику
Категория из выбранной карточки товара запрещена к реализации, возможность работать с такой карточка закрыта
Удаление номенклатуры невозможно, ввиду наличия поставок по ней
Благодарю за прочтение!