Запрос в Честный знак

1. 1cprogr_nsk 109 25.02.20 18:23 Сейчас в теме +5 $m
Здравствуйте. Кто-нибудь разбирал API Честного знака? Нужен запрос по статусу кода маркировки, в ответе важно наименование артикула и текущий владелец.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
12. 1cprogr_nsk 109 04.09.24 19:39 Сейчас в теме
см. РегистрСведений.ДанныеКлючаСессииИСМП.ФормаПросмотраИАктуализацииТокеновАвторизации там всё есть.

функция актуализации ИнтерфейсАвторизацииИСМПКлиент.ЗапроситьКлючСессии

пример моего рабочего кода. на входе ТЗ которая содержит колонку "ШтрихкодУпаковки", в которой содержатся собственно коды маркировки

Процедура ДополнитьТЗИнформациейПоЧестномуЗнаку(ТЗ, Организация, Отказ)
	Токен = ПолучитьТокен(Организация);
	Если ПустаяСтрока(Токен) Тогда  
		Отказ = Истина;             
		Возврат;
	КонецЕсли;
	
	ТЗ.Колонки.Добавить("productName");
	ТЗ.Колонки.Добавить("tnVedEaes");
	ТЗ.Колонки.Добавить("certDoc_number"); 
	ТЗ.Колонки.Добавить("certDoc_type");
	ТЗ.Колонки.Добавить("certDoc_date");
	
	Соединение = Новый HTTPСоединение("markirovka.crpt.ru", 443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
    Заголовки.Вставить("Accept", "application/json");
	  
    HTTPЗапрос = Новый HTTPЗапрос("/api/v3/true-api/cises/info",Заголовки);
    HTTPЗапрос.Заголовки.Вставить("Authorization","Bearer "+Токен);  
	
    //-- тело запроса 
	сч = 0;
	МассивУпаковок = Новый Массив;
	//Для Каждого эл из ТЗ Цикл
	//	МассивУпаковок.Добавить(эл.ШтрихкодУпаковки);
	//КонецЦикла;                  
	КоличествоКодов = ТЗ.Количество();
	Пока сч < КоличествоКодов Цикл
		МассивУпаковок.Добавить(ТЗ[сч].ШтрихкодУпаковки);
		Если сч <> 0 И сч%999 = 0 Тогда   //не больше 1000 записей в теле запроса
			ОтправитьЗапросВСервисИОбработатьРезультат(Соединение, HTTPЗапрос, МассивУпаковок, ТЗ, Отказ);
			МассивУпаковок.Очистить();
		КонецЕсли;
		сч = сч + 1;
	КонецЦикла;
	
	Если МассивУпаковок.Количество() > 0 Тогда //доотправляем еще неотправленные данные
		ОтправитьЗапросВСервисИОбработатьРезультат(Соединение, HTTPЗапрос, МассивУпаковок, ТЗ, Отказ);
	КонецЕсли;
	
КонецПроцедуры 

Процедура ОтправитьЗапросВСервисИОбработатьРезультат(Соединение, HTTPЗапрос, МассивУпаковок, ТЗ, Отказ)
	Запись_JSON = Новый ЗаписьJSON;  //ЗаписьJSON 
	Запись_JSON.УстановитьСтроку();
	ЗаписатьJSON(Запись_JSON, МассивУпаковок);
	СтрокаДляЗапроса = Запись_JSON.Закрыть();
	
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаДляЗапроса,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос); 
	
	Если Ответ.КодСостояния = 200 Тогда
		Чтение_JSON = Новый ЧтениеJSON;
		
		Чтение_JSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());	
		ОтветНаЗапрос = ПрочитатьJSON(Чтение_JSON, Ложь);
		
		Для Каждого СтруктураОтвета Из ОтветНаЗапрос Цикл
			cisInfo = СтруктураОтвета.cisInfo;
			Если cisInfo.generalPackageType <> "UNIT" Тогда
				Сообщить("Код маркировки: " + cisInfo.cis + " не является кодом маркировки индивидуально упаковки!");
				Продолжить;
			КонецЕсли;
			
			//Проверим что исходный код упаковки есть в ТЗ
			СтрокаТЗ = ТЗ.Найти(cisInfo.requestedCis, "ШтрихкодУпаковки"); 
			Если СтрокаТЗ = Неопределено Тогда
				Сообщить("Код маркировки: " + cisInfo.cis + " не найден в ТЗ из УПД!");
				Продолжить;
			КонецЕсли;	
			
			Попытка //Если перемаркировка, то сведений о сертификате соответствия может не быть
				ДекларацияМассив = cisInfo.certDoc;	
			Исключение
				ДекларацияМассив = Новый Массив;
			КонецПопытки;
			
			Если ДекларацияМассив.Количество() > 0 Тогда
				Декларация = ДекларацияМассив[0];
			Иначе
				Декларация = Неопределено;
			КонецЕсли;
			
			СтрокаТЗ.productName = cisInfo.productName;
			СтрокаТЗ.tnVedEaes  = cisInfo.tnVedEaes; 
			Если Декларация <> Неопределено Тогда
				СтрокаТЗ.certDoc_number = Декларация.number; 
				СтрокаТЗ.certDoc_type = Декларация.type;
				СтрокаТЗ.certDoc_date = Декларация.date;
			КонецЕсли;
		КонецЦикла;	
	Иначе  
		Сообщить("Код ответа на запрос: "+Ответ.КодСостояния +" - ошибка!" );
		Отказ = Истина;
		Возврат;
	КонецЕсли;	
КонецПроцедуры

Функция ПолучитьТокен(Организация)
	
	УстановитьПривилегированныйРежим(Истина);
	
	ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии(
		ИнтерфейсИСМПКлиентСервер.ИмяДанныхКлючаСессии(Перечисления.ТипыТокеновАвторизации.ИСМП));
	Если ДанныеКлючаСессии = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	Данные = ДанныеКлючаСессии[Организация];
	
	Если Данные = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	ДействуетДо = МестноеВремя(Данные.ДействуетДо, ЧасовойПоясСеанса());
	Если ДействуетДо <= ТекущаяДата() Тогда
		Сообщить("Нужно актуализировать токен для организации " + Организация.Наименование + " закончился: " + ДействуетДо);
		Возврат "";
	КонецЕсли;
	
	Возврат Данные.КлючСессии;
КонецФункции
Показать
VyacheslavShilov; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. arcadics 13 07.12.20 16:07 Сейчас в теме
(1) Возвращает структуру с текущем статусом. Скорость работы так себе.

СтруктураШтрихкода = ШтрихкодированиеИС.НоваяСтруктураОбработкиШтрихкода(ШтрихкодУпаковки.ЗначениеШтрихкода, 
        Перечисления.ВидыПродукцииИС.ЛегкаяПромышленность);
	МассивКодов        = Новый Массив;
	МассивКодов.Добавить(СтруктураШтрихкода);
	
	Результат = ИнтерфейсИСМП.СтатусыКодовМаркировки(МассивКодов, Организация);
VyacheslavShilov; clev; +2 Ответить
7. orensymrak 05.02.21 18:49 Сейчас в теме
(6)
СтруктураШтрихкода = ШтрихкодированиеИС.НоваяСтруктураОбработкиШтрихкода(ШтрихкодУпаковки.ЗначениеШтрихкода,
Перечисления.ВидыПродукцииИС.ЛегкаяПромышленность);
МассивКодов = Новый Массив;
МассивКодов.Добавить(СтруктураШтрихкода);

Результат = ИнтерфейсИСМП.СтатусыКодовМаркировки(МассивКодов, Организация);


Прекрасно сработала на тестовой базе, правда с некоторыми корректировками, просто так передать организацию не получилось, пришлось копать в ПараметрыСеанса.ДанныеКлючаСессииИСМП, дабы извлечь организацию сеанса.
Так вот на тестовой базе сработало, а в рабочей базе начало ругаться на "Попытка получения неинициализированного значения параметра сеанса". По какой причине никак не пойму. Я подозреваю сперва необходимо инициализировать саму сессию дабы получить ключ сеанса, а как?
Направьте на верный путь или пните к связанной документации, если такая существует))
9. TVA_11 04.09.24 10:23 Сейчас в теме
12. 1cprogr_nsk 109 04.09.24 19:39 Сейчас в теме
см. РегистрСведений.ДанныеКлючаСессииИСМП.ФормаПросмотраИАктуализацииТокеновАвторизации там всё есть.

функция актуализации ИнтерфейсАвторизацииИСМПКлиент.ЗапроситьКлючСессии

пример моего рабочего кода. на входе ТЗ которая содержит колонку "ШтрихкодУпаковки", в которой содержатся собственно коды маркировки

Процедура ДополнитьТЗИнформациейПоЧестномуЗнаку(ТЗ, Организация, Отказ)
	Токен = ПолучитьТокен(Организация);
	Если ПустаяСтрока(Токен) Тогда  
		Отказ = Истина;             
		Возврат;
	КонецЕсли;
	
	ТЗ.Колонки.Добавить("productName");
	ТЗ.Колонки.Добавить("tnVedEaes");
	ТЗ.Колонки.Добавить("certDoc_number"); 
	ТЗ.Колонки.Добавить("certDoc_type");
	ТЗ.Колонки.Добавить("certDoc_date");
	
	Соединение = Новый HTTPСоединение("markirovka.crpt.ru", 443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
    Заголовки.Вставить("Accept", "application/json");
	  
    HTTPЗапрос = Новый HTTPЗапрос("/api/v3/true-api/cises/info",Заголовки);
    HTTPЗапрос.Заголовки.Вставить("Authorization","Bearer "+Токен);  
	
    //-- тело запроса 
	сч = 0;
	МассивУпаковок = Новый Массив;
	//Для Каждого эл из ТЗ Цикл
	//	МассивУпаковок.Добавить(эл.ШтрихкодУпаковки);
	//КонецЦикла;                  
	КоличествоКодов = ТЗ.Количество();
	Пока сч < КоличествоКодов Цикл
		МассивУпаковок.Добавить(ТЗ[сч].ШтрихкодУпаковки);
		Если сч <> 0 И сч%999 = 0 Тогда   //не больше 1000 записей в теле запроса
			ОтправитьЗапросВСервисИОбработатьРезультат(Соединение, HTTPЗапрос, МассивУпаковок, ТЗ, Отказ);
			МассивУпаковок.Очистить();
		КонецЕсли;
		сч = сч + 1;
	КонецЦикла;
	
	Если МассивУпаковок.Количество() > 0 Тогда //доотправляем еще неотправленные данные
		ОтправитьЗапросВСервисИОбработатьРезультат(Соединение, HTTPЗапрос, МассивУпаковок, ТЗ, Отказ);
	КонецЕсли;
	
КонецПроцедуры 

Процедура ОтправитьЗапросВСервисИОбработатьРезультат(Соединение, HTTPЗапрос, МассивУпаковок, ТЗ, Отказ)
	Запись_JSON = Новый ЗаписьJSON;  //ЗаписьJSON 
	Запись_JSON.УстановитьСтроку();
	ЗаписатьJSON(Запись_JSON, МассивУпаковок);
	СтрокаДляЗапроса = Запись_JSON.Закрыть();
	
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаДляЗапроса,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос); 
	
	Если Ответ.КодСостояния = 200 Тогда
		Чтение_JSON = Новый ЧтениеJSON;
		
		Чтение_JSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());	
		ОтветНаЗапрос = ПрочитатьJSON(Чтение_JSON, Ложь);
		
		Для Каждого СтруктураОтвета Из ОтветНаЗапрос Цикл
			cisInfo = СтруктураОтвета.cisInfo;
			Если cisInfo.generalPackageType <> "UNIT" Тогда
				Сообщить("Код маркировки: " + cisInfo.cis + " не является кодом маркировки индивидуально упаковки!");
				Продолжить;
			КонецЕсли;
			
			//Проверим что исходный код упаковки есть в ТЗ
			СтрокаТЗ = ТЗ.Найти(cisInfo.requestedCis, "ШтрихкодУпаковки"); 
			Если СтрокаТЗ = Неопределено Тогда
				Сообщить("Код маркировки: " + cisInfo.cis + " не найден в ТЗ из УПД!");
				Продолжить;
			КонецЕсли;	
			
			Попытка //Если перемаркировка, то сведений о сертификате соответствия может не быть
				ДекларацияМассив = cisInfo.certDoc;	
			Исключение
				ДекларацияМассив = Новый Массив;
			КонецПопытки;
			
			Если ДекларацияМассив.Количество() > 0 Тогда
				Декларация = ДекларацияМассив[0];
			Иначе
				Декларация = Неопределено;
			КонецЕсли;
			
			СтрокаТЗ.productName = cisInfo.productName;
			СтрокаТЗ.tnVedEaes  = cisInfo.tnVedEaes; 
			Если Декларация <> Неопределено Тогда
				СтрокаТЗ.certDoc_number = Декларация.number; 
				СтрокаТЗ.certDoc_type = Декларация.type;
				СтрокаТЗ.certDoc_date = Декларация.date;
			КонецЕсли;
		КонецЦикла;	
	Иначе  
		Сообщить("Код ответа на запрос: "+Ответ.КодСостояния +" - ошибка!" );
		Отказ = Истина;
		Возврат;
	КонецЕсли;	
КонецПроцедуры

Функция ПолучитьТокен(Организация)
	
	УстановитьПривилегированныйРежим(Истина);
	
	ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии(
		ИнтерфейсИСМПКлиентСервер.ИмяДанныхКлючаСессии(Перечисления.ТипыТокеновАвторизации.ИСМП));
	Если ДанныеКлючаСессии = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	Данные = ДанныеКлючаСессии[Организация];
	
	Если Данные = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	ДействуетДо = МестноеВремя(Данные.ДействуетДо, ЧасовойПоясСеанса());
	Если ДействуетДо <= ТекущаяДата() Тогда
		Сообщить("Нужно актуализировать токен для организации " + Организация.Наименование + " закончился: " + ДействуетДо);
		Возврат "";
	КонецЕсли;
	
	Возврат Данные.КлючСессии;
КонецФункции
Показать
VyacheslavShilov; +1 Ответить
2. avlanskih 25.02.20 21:37 Сейчас в теме
api какого сервиса? Вроде как есть документация тыц По поводу api лучше общаться с ТП сервиса, к которому обращаетесь.
3. 1cprogr_nsk 109 26.02.20 09:54 Сейчас в теме
Имеется ввиду: реализовал ли кто-нибудь проверку статуса кода маркировки в 1С, посредством HTTP запросов
4. Xershi 1545 26.02.20 11:31 Сейчас в теме
(3) а что у вас с этим проблемы? Отписал в ТП, открыл документацию и через час уже все написано.
11. TVA_11 04.09.24 10:43 Сейчас в теме
(4)

Надо в регламентном задании обновлять Ключ. А как?

А сертификат стоит только на сервере, под пользователем под которым крутятся регламентные задания.
Требования безопасности.


ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии("ДанныеКлючаСессииИСМП");
    
    Если ДанныеКлючаСессии = Неопределено или ДанныеКлючаСессии.Получить(Справочники.Организации.НайтиПоНаименованию("Организация")).ДействуетДо < ТекущаяДата() Тогда
              // Надо запрашивать ключ, в регламентном задании!
    КонецЕсли;

Показать
5. СимволКристоффеля 26.02.20 23:09 Сейчас в теме
В модуле ИнтерфейсИСМП есть функция, которая получает статусы кодов маркировки.
А вообще проверка по статусу встроена в УТ из коробки. Только включить нужно в настройках.
8. edyardg 23 24.03.24 08:32 Сейчас в теме
Получилось реализовать получение статусов кодов маркировке? Не понятно как обновить ключь сесии он имеет ограниченный срок действия, Подскажите какая функция в типовой его обновляет?
10. TVA_11 04.09.24 10:25 Сейчас в теме
(8)

Полагаю, переносите штатный код в боевую БД?
Что-то вышло уже?



	ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии("ДанныеКлючаСессииИСМП");
	
	Если ДанныеКлючаСессии = Неопределено или ДанныеКлючаСессии.Получить(Справочники.Организации.НайтиПоНаименованию("Организация")).ДействуетДо < ТекущаяДата() Тогда

              // Надо запрашивать ключ, в регламентном задании!
	
	КонецЕсли;


Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот