от 26.01.2025
В дополнение к посту https://dzen.ru/a/Z430k5P46He6_Wqd
Задача: Задача кратко если изложить то поставлена так:
1. Автоматизировать процесс создания технических карточек на остатки номенклатуры в национальном каталоге (далее по тексту "НК"). Источник Номенклатуры таблица или выборка запроса. Выполнено (с горем на пополам запросы на создание тех. карточки долетаю до НК).
2. Проверять статус карточек в НК, осуществлять подпись тех что успешно прошли модерацию.
3. Заказывать коды маркировки по присвоенным GTIN на карточки.
4. Вводить в "оборот" коды маркировки обклеенной продукции.
Напишу сразу, что с с API я работал во второй раз.
Полный код в конце поста.
Писал по методичке "API "Национального каталога" доступная пользователям ЧЗ (https://clothes.crpt.ru/help/list).
2 .1 Проверять статус карточек в НК, осуществлять подпись тех что успешно прошли модерацию.
Ранее в посту в ответ от НК мы получали feedId. У меня он сохраняется в специальный справочник с привязкой к номенклатуре. В этом справочнике и сделаем функционал по проверке статуса карточки товара.
Справочник мой выглядит пока что так
Цепляем к кнопке "Обновить статусы карточек" процедуру
Тут все стандартно записываем в структуру параметры HTTP запроса и в соответствие Заголовок.
Дальше запросом получаю не опубликованные карточки, те карточки что на модерации и те что только отправили.
По каждой найденной строки справочника делаем запрос в ЧЗ:
Ключ входа = это ключ доступа "API key" примерно такого формата "9r8eilxdfb9xbcy8" берётся в личном кабинете НК. (см. https://dzen.ru/a/Z430k5P46He6_Wqd тут).
ФидID = это тот самый фид который к нам приходит ответом при создании карточки. (см. https://dzen.ru/a/Z430k5P46He6_Wqd тут).
Преобразуем тело ответа в структуру:
В структуре ответа "два уровня" в первом можно получить ключ "status"
принимает значения:
// «Received» — запрос получен, данные на модерации;
//«Moderated» — товары прошли модерацию;
//«Signed» — одобренные модератором товары подписаны;
//«Rejected» — запрос не принят;
//«Processing» — запрос получен, ожидает обработки
Сделал под функцию чтоб возвращать расшифровку статуса.
Второй уровень это ещё одна вложенная структура под ключом "item".
Если отправляемы ранее нами запрос принят, то получим в "item" :
заветный GTIN. Сразу же записываю его в свой справочник чтоб не потерять.
Теперь статус у карточки товара "на модерации" модерация примерно +-2 дня.
Как только карточка успешно пройдет модерацию можно её подписывать.
2.2 . Подпись тех что успешно прошли модерацию.
https://dzen.ru/a/Z7VnHTb5VCZffuwB
Полный код:
Процедура ОбновитьСтатусыКарточек(Кнопка)
// 1. htpp - параметры + Заголовок
ПараметрыОтправкиHTTPЗапросов = Новый Структура;
ПараметрыОтправкиHTTPЗапросов.Вставить("ПредставлениеСервиса", НСтр("ru = 'ГИС МТ'"));
ПараметрыОтправкиHTTPЗапросов.Вставить("Сервер", "апи.национальный-каталог.рф");
ПараметрыОтправкиHTTPЗапросов.Вставить("Порт", 443);
ПараметрыОтправкиHTTPЗапросов.Вставить("Таймаут", 60);
ПараметрыОтправкиHTTPЗапросов.Вставить("ИспользоватьЗащищенноеСоединение", Истина);
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
ЗаголовокHTTP.Вставить("Accept-Charset", "utf-8");
// 2.Отбор карточек со статусом на модерации. (Был присвоен при отправке карточке).
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СправочникКарточекТовара.Ссылка КАК Ссылка,
| СправочникКарточекТовара.ФидID КАК ФидID,
| СправочникКарточекТовара.GTIN КАК GTIN,
| СправочникКарточекТовара.ОрганизацияЭксплуатант КАК Подразделение
|ИЗ
| Справочник.СправочникКарточекТовара КАК СправочникКарточекТовара
|ГДЕ
| (СправочникКарточекТовара.Статус = &Статус
| ИЛИ СправочникКарточекТовара.Статус = &Статус2
| ИЛИ СправочникКарточекТовара.Статус = &Статус3
| ИЛИ СправочникКарточекТовара.Статус = &Статус4)
| И СправочникКарточекТовара.Опубликованна = ЛОЖЬ
| И СправочникКарточекТовара.Статус <> &Статус5";
Запрос.УстановитьПараметр("Статус", "Отправлен на модерацию");
Запрос.УстановитьПараметр("Статус2", "запрос получен, данные на модерации");
Запрос.УстановитьПараметр("Статус3", "запрос получен, ожидает обработки");
Запрос.УстановитьПараметр("Статус4", "товары прошли модерацию");
Запрос.УстановитьПараметр("Статус5", "одобренные модератором, товары подписаны");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыгрузкаВыборка = РезультатЗапроса.Выгрузить(); // для отладки
// 3. Запрос в ЧЗ НК
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КлючВхода = ПОлучитьКлючВхода(ВыборкаДетальныеЗаписи.Подразделение);
URLЗапроса = "/v3/feed-status?apikey=" + КлючВхода + "&feed_id="+ВыборкаДетальныеЗаписи.ФидID;
HTTPЗапросОтвет = Новый HTTPЗапрос(URLЗапроса, ЗаголовокHTTP);
ИнтернетПрокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси("HTTPS");
ЗащищенноеСоединение = ИнтеграцияИСПовтИсп.ЗащищенноеСоединение();
Соединение = Новый HTTPСоединение(
ПараметрыОтправкиHTTPЗапросов.Сервер,
ПараметрыОтправкиHTTPЗапросов.Порт,,,
ИнтернетПрокси,
ПараметрыОтправкиHTTPЗапросов.Таймаут,
ЗащищенноеСоединение);
HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапросОтвет);
ПрочитатьОтвет = HTTPОтвет.ПолучитьТелоКакСтроку();
// Прочитать "ответ"
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ПрочитатьОтвет);
Попытка
СсылкаСправочника = ВыборкаДетальныеЗаписи.Ссылка;
ОбъектСправочника = СсылкаСправочника.ПолучитьОбъект();
СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
СтруктураОтвета = СтруктураОтвета.Получить("result"); // 1 уровень
status_ответ = СтруктураОтвета.Получить("status"); // в 1 уровне
Если status_ответ = "Rejected" ИЛИ status_ответ = "" Тогда
ОбъектСправочника.Статус = ПолучитьРасшифровкуСтатуса (status_ответ);
ОбъектСправочника.ИнфОбЗапросе = ПрочитатьОтвет;
ОбъектСправочника.Записать();
Иначе
ОбъектСправочника.Статус = ПолучитьРасшифровкуСтатуса (status_ответ);
ОбъектСправочника.ИнфОбЗапросе = ПрочитатьОтвет;
СтруктураОтвета = СтруктураОтвета.Получить("item")[0]; // 2 уровень
ОбъектСправочника.GoodID = СтруктураОтвета.Получить("good_id");
ОбъектСправочника.GTIN = СтруктураОтвета.Получить("gtin");
Месседж = СтруктураОтвета.Получить("message");
ОбъектСправочника.Записать();
КонецЕсли;
Исключение
СсылкаСправочника = ВыборкаДетальныеЗаписи.Ссылка;
ОбъектСправочника = СсылкаСправочника.ПолучитьОбъект();
ОбъектСправочника.ИнфОбЗапросе = ПрочитатьОтвет;
ОбъектСправочника.Записать();
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьРасшифровкуСтатуса(статус_ответ)
Если статус_ответ = "Received" Тогда
Статус = "запрос получен, данные на модерации" ;
ИначеЕсли статус_ответ = "Moderated" Тогда
Статус = "товары прошли модерацию";
ИначеЕсли статус_ответ = "Signed" Тогда
Статус = "одобренные модератором, товары подписаны";
ИначеЕсли статус_ответ = "Rejected" Тогда
Статус = "запрос не принят";
Иначе
Статус = "запрос получен, ожидает обработки"
КонецЕсли;
Возврат Статус;
КонецФункции