Прежде всего о модели работы. Предполагается, что номенклатура на маркетплейсе создается и заполняется в личном кабинете, то есть его средствами, синхронизация номенклатуры осуществляется по штрихкодам, это также позволяет работать с характеристиками в базе. Новые заказы загружаются в базу и переходят в статус "Принят к обработке", их обработка происходит также в личном кабинете маркетплейса. После обработки и закрытия заказа, в базе по нему создается реализация, заказ закрывается. Таким образом, в базе отражаются продажи по маркетплейсу. Продажи осуществляются обезличенно, контрагенту Wildberries. Заказы могут загружаться фоновым заданием по расписанию, а также вручную из формы обработки . Расписание выгрузки остатков и загрузки заказов определяется при подключении дополнительной обработки.
В обработке имеется возможность сохранить настройки, необходимые для обмена: токен авторизации (получается в личном кабинете), идентификатор склада (также из личного кабинета), отборы номенклатуры, по которой требуется выгружать остатки.
Интерфейс обработки прост и практичен, в шапке указывается токен, идентификатор склада (Warehouse id), и расположены 3 кнопки: Загрузить заказы, Обработать закрытые заказы, Обновить остатки. Полагаю, что действия кнопок очевидны и не нуждаются в дополнительном описании.
Чуть ниже расположены 2 закладки: Заказы вайлдбериз и Отборы номенклатуры для выгрузки. На закладке "Заказы вайлдбериз" отображается список новых заказов полученных с маркетплейса Вайлдбериз после нажатия на кнопку "Загрузить заказы". Таким образом, можно просмотреть результат работы обработки по получению новых заказов.
На закладке "Отборы номенклатуры для выгрузки" можно произвольно настроить отбор номенклатуры для выгрузки по ее реквизитам и при этом сохранить эти настройки.
При сохранении настроек сохраняются не только сделанные отборы, но и токен, и идентификатор склада.
В дальнейшем эти настройки используются при работе обработки по расписанию, также они считываются и при открытии формы. Сохранение настроек работает только в случае, когда обработка подключена как дополнительная внешняя обработка. Поля возможные для отборов определяются макетом схемы компоновки данных обработки, в которой описаны данные получаемые из базы для выгрузки остатков на маркетплейс. Программист может переопределить в макете получаемые данные, соответствующим образом изменятся и возможные поля для отбора. Вот и все что касается интерфейса обработки.
Теперь немного о реализации. При выгрузке остатков сначала получаются данные об имеющихся остатках на маркетплейсе. Это делается для того, чтобы в случае отсутствия данных по остаткам какой-либо номенклатуры, передавались нулевые остатки. Форматы передаваемых запросов, получаемых ответов с маркетплейса были взяты отсюда: https://suppliers-api.wildberries.ru/swagger/index.html. Вкратце, вся суть запросов, передающих данные на маркетплейс, заключается в том, что в его тело помещается строка в формате json (Java script object notation). Платформа имеет средства для работы с этим форматом. Один из способов создания строки в данном формате является предварительная подготовка массива структур. Поля структуры станут полями формата. Если поля формата json будут иметь названия, неприменимые для именования ключа структуры, то можно подготовить не структуру, а соответствие. В нашем случае структура вполне подходит. Рассмотрим пример выгрузки остатков. На ресурсе https://suppliers-api.wildberries.ru/swagger/index.html описан запрос отправляемый для выгрузки остатков:
Мы видим, что это должен быть POST запрос содержащий список в формате json с полями barcode, stock и wharehouseId (штрихкод, количество и идентификатор склада соответственно). В случае успешной обработки запроса возвращается код ответа 200 и список ошибок загрузки остатков (если ошибок нет, то список будет пустой).
На вкладке schema тела запроса можно посмотреть типы данных для каждого поля:
Для поля barcode это строка, для остальных - число. Соответственно, наша задача подготовить массив структур с ключами barcode, stock и warehouseId с данными остатков по каждой позиции. Получив данные остатков по каждой позиции номенклатуры (или номенклатуры с характеристикой, если учет по ним ведется), мы обходим результат выборки и добавляем наши структуры в массив.
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
МассивОстатков = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтруктураДанных = Новый Структура("barcode,stock,warehouseId" );
ЗаполнитьЗначенияСвойств(СтруктураДанных,ВыборкаДетальныеЗаписи);
//идентификатор вашего склада на Вайлдберриз, необходимо его заполнить предварительно и сохранить в настройках обработки
СтруктураДанных.warehouseId = warehouseId;
МассивОстатков.Добавить(СтруктураДанных);
КонецЦикла;
После того как массив структур подготовлен, нам надо преобразовать его в формат json это делается при помощи объекта ЗаписьJSON.
//формируем строку в формате json
//поля и их формат подробно описаны на https://suppliers-api.wildberries.ru/swagger/index.html
ЗаписьДжейсон = Новый ЗаписьJSON;
Пар = новый ПараметрыЗаписиJSON;
ЗаписьДжейсон.УстановитьСтроку(Пар);
ЗаписатьJSON(ЗаписьДжейсон,МассивОстатков);
СтрокаДжейсон = ЗаписьДжейсон.Закрыть();
Когда тело запроса в виде строки json готово, приступим к созданию самого запроса:
Сервер = "suppliers-api.wildberries.ru";
SSLСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Метод = "/api/v2/stocks";
HTTPСоединение = Новый HTTPСоединение(Сервер,443,,,,,SSLСоединение);
ИмяФайла = ПолучитьИмяВременногоФайла("json");
Запрос = СформироватьHTTPЗапрос(Метод);
Запрос.УстановитьТелоИзСтроки(СтрокаДжейсон,КодировкаТекста.UTF8);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(Запрос,ИмяФайла);
Куда отправлять запросы и как называется метод мы посмотрели на сваггере (https://suppliers-api.wildberries.ru/swagger/index.html). Для всех запросов сервер будет одинаков: suppliers-api.wildberries.ru, для отправки остатков используем метод /api/v2/stocks. Сам запрос формируется у нас в функции СформироватьHTTPЗапрос(Метод). Они приведена ниже:
Функция СформироватьHTTPЗапрос(Метод) Экспорт
Запрос = Новый HTTPЗапрос(Метод);
//Токен выдается в личном кабинете, надо подставить свой
Запрос.Заголовки.Вставить("Authorization", Токен);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Возврат Запрос;
КонецФункции
Обратите внимание, мы должны отправить Post запрос, поэтому для нашего соединения выполняем метод ОтправитьДляОбработки. Соответствие методов соединения можно посмотреть во встроенной справке по объекту HTTPСоединение. Для того, чтобы поместить нашу строку в формате json в тело запроса, используем метод запроса УстановитьТелоИзСтроки, где вторым параметром указываем кодировку. Для того, чтобы обработать ответ от маркетплейса, нам потребуется передать в запросе имя файла куда он будет помещен, для этих целей получаем имя временного файла, а затем читаем его при помощи объекта Чтениеjson. Функция глобального контекста Прочитатьjson возвращает нам в виде структуры данные из файла и мы можем работать с ними привычными нам методами. Коллекции данных в этой структуре существуют в виде массивов структур. После этого, обрабатываем ответ от маркетплейса :
Если HTTPОтвет.КодСостояния = 200 Тогда
ЧтениеДжейсон = Новый ЧтениеJSON;
ЧтениеДжейсон.ОткрытьФайл(ИмяФайла);
ДанныеОтвета = ПрочитатьJSON(ЧтениеДжейсон);
Сообщить("Остатки обновлены, количество обновленных элементов:"+ МассивОстатков.Количество());
МассивОшибок = ДанныеОтвета.data.errors;
Если ТипЗнч(МассивОшибок) = Тип("Массив") И МассивОшибок.Количество()>0 Тогда
Для каждого СтруктураОшибки Из МассивОшибок Цикл
ТекстСообщения = "штрихкод:" + СтруктураОшибки.barcode+ " ошибка:"+ СтруктураОшибки.err;
Сообщить(ТекстСообщения);
КонецЦикла;
Иначе
Сообщить("Количество ошибок при обновлении остатков: 0" );
КонецЕсли;
Иначе
Сообщить ("Ошибка выполнения запроса, код ошибки "+ HTTPОтвет.КодСостояния );
КонецЕсли;
На примере выгрузки остатков показан принцип работы с api маркетплейса, способ формирования данных в требуемом формате, обработки полученного ответа. Надеюсь, что рассмотренный пример даст понимание, каким образом можно получать и отправлять данные для маркетплейса Wildberries из прикладного решения на платформе 1С. Возможно, также кому-то пригодится и сама обработка или ее код в качестве основы для дальнейшей модификации под свои нужды.
Обработка тестировалась на редакции 2.3.9.37, платформа 8.3.18.1741, на редакции 2.2 не тестировалась, но может быть адаптирована, доработок потребуется минимум.
Проверено на следующих конфигурациях и релизах:
- Розница, редакция 2.3, релизы 2.3.9.37