По теме из базы знаний
- Загрузка штрихкодов в УНФ из "Честного знака"
- Загрузка штрихкодов в 1С:Розница 2.3 из "Честного знака"
- Честный знак - запрос содержания упаковки по ее коду [табачная продукция]
- Интеграция Честный Знак и 1C: обмен и синхронизация для УТ11, УНФ, КА2, ERP, Розница: Расширение для работы с СУЗ, ГИС МТ, ЦРПТ
- Инвентаризация кодов маркировки системы "Честный знак", запрос, сравнение с остатками 1С, списание, ОСУ
Найденные решения
см. РегистрСведений.ДанныеКлючаСессииИСМП.ФормаПросмотраИАктуализацииТокеновАвторизации там всё есть.
функция актуализации ИнтерфейсАвторизацииИСМПКлиент.ЗапроситьКлючСессии
пример моего рабочего кода. на входе ТЗ которая содержит колонку "ШтрихкодУпаковки", в которой содержатся собственно коды маркировки
функция актуализации ИнтерфейсАвторизацииИСМПКлиент.ЗапроситьКлючСессии
пример моего рабочего кода. на входе ТЗ которая содержит колонку "ШтрихкодУпаковки", в которой содержатся собственно коды маркировки
Процедура ДополнитьТЗИнформациейПоЧестномуЗнаку(ТЗ, Организация, Отказ)
Токен = ПолучитьТокен(Организация);
Если ПустаяСтрока(Токен) Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ТЗ.Колонки.Добавить("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;
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("Код ответа на запрос: "+Ответ.КодСостояния +" - ошибка!" );
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьТокен(Организация)
УстановитьПривилегированныйРежим(Истина);
ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии(
ИнтерфейсИСМПКлиентСервер.ИмяДанныхКлючаСессии(Перечисления.ТипыТокеновАвторизации.ИСМП));
Если ДанныеКлючаСессии = Неопределено Тогда
Возврат "";
КонецЕсли;
Данные = ДанныеКлючаСессии[Организация];
Если Данные = Неопределено Тогда
Возврат "";
КонецЕсли;
ДействуетДо = МестноеВремя(Данные.ДействуетДо, ЧасовойПоясСеанса());
Если ДействуетДо <= ТекущаяДата() Тогда
Сообщить("Нужно актуализировать токен для организации " + Организация.Наименование + " закончился: " + ДействуетДо);
Возврат "";
КонецЕсли;
Возврат Данные.КлючСессии;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Возвращает структуру с текущем статусом. Скорость работы так себе.
СтруктураШтрихкода = ШтрихкодированиеИС.НоваяСтруктураОбработкиШтрихкода(ШтрихкодУпаковки.ЗначениеШтрихкода,
Перечисления.ВидыПродукцииИС.ЛегкаяПромышленность);
МассивКодов = Новый Массив;
МассивКодов.Добавить(СтруктураШтрихкода);
Результат = ИнтерфейсИСМП.СтатусыКодовМаркировки(МассивКодов, Организация);
(6)
Прекрасно сработала на тестовой базе, правда с некоторыми корректировками, просто так передать организацию не получилось, пришлось копать в ПараметрыСеанса.ДанныеКлючаСессииИСМП, дабы извлечь организацию сеанса.
Так вот на тестовой базе сработало, а в рабочей базе начало ругаться на "Попытка получения неинициализированного значения параметра сеанса". По какой причине никак не пойму. Я подозреваю сперва необходимо инициализировать саму сессию дабы получить ключ сеанса, а как?
Направьте на верный путь или пните к связанной документации, если такая существует))
СтруктураШтрихкода = ШтрихкодированиеИС.НоваяСтруктураОбработкиШтрихкода(ШтрихкодУпаковки.ЗначениеШтрихкода,
Перечисления.ВидыПродукцииИС.ЛегкаяПромышленность);
МассивКодов = Новый Массив;
МассивКодов.Добавить(СтруктураШтрихкода);
Результат = ИнтерфейсИСМП.СтатусыКодовМаркировки(МассивКодов, Организация);
Перечисления.ВидыПродукцииИС.ЛегкаяПромышленность);
МассивКодов = Новый Массив;
МассивКодов.Добавить(СтруктураШтрихкода);
Результат = ИнтерфейсИСМП.СтатусыКодовМаркировки(МассивКодов, Организация);
Прекрасно сработала на тестовой базе, правда с некоторыми корректировками, просто так передать организацию не получилось, пришлось копать в ПараметрыСеанса.ДанныеКлючаСессииИСМП, дабы извлечь организацию сеанса.
Так вот на тестовой базе сработало, а в рабочей базе начало ругаться на "Попытка получения неинициализированного значения параметра сеанса". По какой причине никак не пойму. Я подозреваю сперва необходимо инициализировать саму сессию дабы получить ключ сеанса, а как?
Направьте на верный путь или пните к связанной документации, если такая существует))
см. РегистрСведений.ДанныеКлючаСессииИСМП.ФормаПросмотраИАктуализацииТокеновАвторизации там всё есть.
функция актуализации ИнтерфейсАвторизацииИСМПКлиент.ЗапроситьКлючСессии
пример моего рабочего кода. на входе ТЗ которая содержит колонку "ШтрихкодУпаковки", в которой содержатся собственно коды маркировки
функция актуализации ИнтерфейсАвторизацииИСМПКлиент.ЗапроситьКлючСессии
пример моего рабочего кода. на входе ТЗ которая содержит колонку "ШтрихкодУпаковки", в которой содержатся собственно коды маркировки
Процедура ДополнитьТЗИнформациейПоЧестномуЗнаку(ТЗ, Организация, Отказ)
Токен = ПолучитьТокен(Организация);
Если ПустаяСтрока(Токен) Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ТЗ.Колонки.Добавить("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;
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("Код ответа на запрос: "+Ответ.КодСостояния +" - ошибка!" );
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьТокен(Организация)
УстановитьПривилегированныйРежим(Истина);
ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии(
ИнтерфейсИСМПКлиентСервер.ИмяДанныхКлючаСессии(Перечисления.ТипыТокеновАвторизации.ИСМП));
Если ДанныеКлючаСессии = Неопределено Тогда
Возврат "";
КонецЕсли;
Данные = ДанныеКлючаСессии[Организация];
Если Данные = Неопределено Тогда
Возврат "";
КонецЕсли;
ДействуетДо = МестноеВремя(Данные.ДействуетДо, ЧасовойПоясСеанса());
Если ДействуетДо <= ТекущаяДата() Тогда
Сообщить("Нужно актуализировать токен для организации " + Организация.Наименование + " закончился: " + ДействуетДо);
Возврат "";
КонецЕсли;
Возврат Данные.КлючСессии;
КонецФункции
Показать
(4)
Надо в регламентном задании обновлять Ключ. А как?
А сертификат стоит только на сервере, под пользователем под которым крутятся регламентные задания.
Требования безопасности.
Надо в регламентном задании обновлять Ключ. А как?
А сертификат стоит только на сервере, под пользователем под которым крутятся регламентные задания.
Требования безопасности.
ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии("ДанныеКлючаСессииИСМП");
Если ДанныеКлючаСессии = Неопределено или ДанныеКлючаСессии.Получить(Справочники.Организации.НайтиПоНаименованию("Организация")).ДействуетДо < ТекущаяДата() Тогда
// Надо запрашивать ключ, в регламентном задании!
КонецЕсли;
Показать
(8)
Полагаю, переносите штатный код в боевую БД?
Что-то вышло уже?
Полагаю, переносите штатный код в боевую БД?
Что-то вышло уже?
ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии("ДанныеКлючаСессииИСМП");
Если ДанныеКлючаСессии = Неопределено или ДанныеКлючаСессии.Получить(Справочники.Организации.НайтиПоНаименованию("Организация")).ДействуетДо < ТекущаяДата() Тогда
// Надо запрашивать ключ, в регламентном задании!
КонецЕсли;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот