Здравствуйте. Кто-нибудь разбирал API Честного знака? Нужен запрос по статусу кода маркировки, в ответе важно наименование артикула и текущий владелец.
---
см. РегистрСведений.ДанныеКлючаСессииИСМП.ФормаПросмотраИАктуализацииТокеновАвторизации там всё есть.

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

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

```1c
    Процедура ДополнитьТЗИнформациейПоЧестномуЗнаку(ТЗ, Организация, Отказ)
    Токен = ПолучитьТокен(Организация);
    Если ПустаяСтрока(Токен) Тогда
    Отказ = Истина;
    Возврат;
    КонецЕсли;

    ТЗ.Колонки.Добавить("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;
    КонецЕсли;
    КонецЦикла;
    Иначе
    Сообщить("Код ответа на запрос: "+Ответ.КодСостояния +" - ошибка!" );
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    КонецПроцедуры

    Функция ПолучитьТокен(Организация)

    УстановитьПривилегированныйРежим(Истина);

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

    Данные = ДанныеКлючаСессии[Организация];

    Если Данные = Неопределено Тогда
    Возврат ";
    КонецЕсли;

    ДействуетДо = МестноеВремя(Данные.ДействуетДо, ЧасовойПоясСеанса());
    Если ДействуетДо <= ТекущаяДата() Тогда
    Сообщить("Нужно актуализировать токен для организации " + Организация.Наименование + " закончился: " + ДействуетДо);
    Возврат ";
    КонецЕсли;

    Возврат Данные.КлючСессии;
    КонецФункции
```
---
Возвращает структуру с текущем статусом. Скорость работы так себе.

```1c
    СтруктураШтрихкода = ШтрихкодированиеИС.НоваяСтруктураОбработкиШтрихкода(ШтрихкодУпаковки.ЗначениеШтрихкода,
    Перечисления.ВидыПродукцииИС.ЛегкаяПромышленность);
    МассивКодов = Новый Массив;
    МассивКодов.Добавить(СтруктураШтрихкода);

    Результат = ИнтерфейсИСМП.СтатусыКодовМаркировки(МассивКодов, Организация);
```
---
СтруктураШтрихкода = ШтрихкодированиеИС.НоваяСтруктураОбработкиШтрихкода(ШтрихкодУпаковки.ЗначениеШтрихкода,
        Перечисления.ВидыПродукцииИС.ЛегкаяПромышленность);
    МассивКодов = Новый Массив;
    МассивКодов.Добавить(СтруктураШтрихкода);

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

Прекрасно сработала на тестовой базе, правда с некоторыми корректировками, просто так передать организацию не получилось, пришлось копать в ПараметрыСеанса.ДанныеКлючаСессииИСМП, дабы извлечь организацию сеанса.
Так вот на тестовой базе сработало, а в рабочей базе начало ругаться на "Попытка получения неинициализированного значения параметра сеанса". По какой причине никак не пойму. Я подозреваю сперва необходимо инициализировать саму сессию дабы получить ключ сеанса, а как?
Направьте на верный путь или пните к связанной документации, если такая существует))
---
1
---
см. РегистрСведений.ДанныеКлючаСессииИСМП.ФормаПросмотраИАктуализацииТокеновАвторизации там всё есть.

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

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

```1c
    Процедура ДополнитьТЗИнформациейПоЧестномуЗнаку(ТЗ, Организация, Отказ)
    Токен = ПолучитьТокен(Организация);
    Если ПустаяСтрока(Токен) Тогда
    Отказ = Истина;
    Возврат;
    КонецЕсли;

    ТЗ.Колонки.Добавить("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;
    КонецЕсли;
    КонецЦикла;
    Иначе
    Сообщить("Код ответа на запрос: "+Ответ.КодСостояния +" - ошибка!" );
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    КонецПроцедуры

    Функция ПолучитьТокен(Организация)

    УстановитьПривилегированныйРежим(Истина);

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

    Данные = ДанныеКлючаСессии[Организация];

    Если Данные = Неопределено Тогда
    Возврат ";
    КонецЕсли;

    ДействуетДо = МестноеВремя(Данные.ДействуетДо, ЧасовойПоясСеанса());
    Если ДействуетДо <= ТекущаяДата() Тогда
    Сообщить("Нужно актуализировать токен для организации " + Организация.Наименование + " закончился: " + ДействуетДо);
    Возврат ";
    КонецЕсли;

    Возврат Данные.КлючСессии;
    КонецФункции
```
---
api какого сервиса? Вроде как есть документация тыц По поводу api лучше общаться с ТП сервиса, к которому обращаетесь.
---
Имеется ввиду: реализовал ли кто-нибудь проверку статуса кода маркировки в 1С, посредством HTTP запросов
---
а что у вас с этим проблемы? Отписал в ТП, открыл документацию и через час уже все написано.
---
Надо в регламентном задании обновлять Ключ. А как?

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

```1c
    ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии("ДанныеКлючаСессииИСМП");

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

```1c
    ДанныеКлючаСессии = ИнтерфейсАвторизацииИСМПСлужебный.ПолучитьСохраненныеДанныеКлючаСессии("ДанныеКлючаСессииИСМП");

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

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

    КонецЕсли;
```