Для начала вы должны быть зарегистрированы в Честном знаке(https://shoes.crpt.ru/) и иметь сертификат для входа. Честный знак нам предлагает воспользоватся инструкцией по ссылке https://shoes.crpt.ru/docs/API_Track_and_Trace_Government_Information_System_v18_en.pdf она вам поможет, но обращайте внимание, что там довольно много неточностей и устаревших данных.
Начнем с того что нам нужно получить токен для работы с API честного знака. Для этого нам нужно сделать GET запрос в ответ на который мы получим поля GUID(Уникальный идентификатор) и DATA(Данные).
GET Запрос из 1с выглядит следующим образом:
сайт = "ismp.crpt.ru";
хСоединение = Новый HTTPСоединение(Сайт,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
Запрос = новый HTTPЗапрос("/api/v3/auth/cert/key");
хОтвет = хСоединение.ВызватьHTTPМетод("GET",Запрос);
Если хОтвет.КодСостояния <> 200 Тогда
Сообщить("Ошибка. Код ответа " + хОтвет.КодСостояния);
Возврат;
КонецЕсли;
Сообщение = хОтвет.ПолучитьТелоКакСтроку("UTF-8");
//десериализуем данные о клиенте из JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Сообщение);
ОборудованиеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
УИД = ОборудованиеJSON.uuid;
Данные = ОборудованиеJSON.data;
Файл = Новый ЗаписьТекста("C:\1\test.txt");
Файл.ЗаписатьСтроку(Данные);
Файл.Закрыть();
Данные нам необходимо подписать нашей электронной подписью и прислать в ответ ЧЗ. Для того что бы подписать данные воспользуемся сайтом КриптоПРО https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html Там нам нужно выбрать наш сертификат, а в поле "Данные для подписи" вставить полученные данные(в моем случае текст из файла test.txt).
Сформированную подпись копируем в текстовый файл и с помощью Notepad избавляемся от пробелов и переносов строки. Выделяем весь текст жмем Ctrl+H в поле поиска пишем \n затем \r поле замены оставляем пустым. Жмем заменить все.
GUID и текст из получившегося файла нам нужно отправить POST запросом в ЧЗ.
Процедура ПолучитьТокенНаСервере()
Текст = Новый ТекстовыйДокумент;
ПолноеИмяФайла = "C:\1\out.txt";
Текст.Прочитать(ПолноеИмяФайла);
КоличествоСтрок = Текст.КоличествоСтрок();
Данные = "";
Для Счетчик = 1 по КоличествоСтрок Цикл
ТекСтрока = Текст.ПолучитьСтроку(Счетчик);
Данные = Данные + ТекСтрока;
КонецЦикла;
Соединение = Новый HTTPСоединение("ismp.crpt.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
Заголовки.Вставить("Accept", "application/json");
Запрос = Новый HTTPЗапрос("/api/v3/auth/cert/",Заголовки);
ЗаписьJOIN = Новый ЗаписьJSON;
ЗаписьJOIN.УстановитьСтроку();
ДанныеДляЗапроса = Новый Структура;
ДанныеДляЗапроса.Вставить("uuid",УИД);
ДанныеДляЗапроса.Вставить("data",Данные);
ЗаписатьJSON(ЗаписьJOIN,ДанныеДляЗапроса);
СтрокаДляЗапроса = ЗаписьJOIN.Закрыть();
//Формируем ответ клиенту
Запрос.УстановитьТелоИзСтроки(СтрокаДляЗапроса,КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
Сообщить("Ошибка. Код ответа " + Ответ.КодСостояния);
ЧтениеJSON = Новый ЧтениеJSON;
Сообщение = Ответ.ПолучитьТелоКакСтроку("UTF-8");
ЧтениеJSON.УстановитьСтроку(Сообщение);
СообщениеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить(СообщениеJSON.error_message);
Возврат;
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Токен = ПрочитатьJSON(ЧтениеJSON, Ложь).token;
КонецПроцедуры
В ответ мы получим токен который нужно будет использовать в любых дальнейших запросах.
После получения токена можно использовать любые методы работы с документами и маркировками описанными в документации. Вот мой пример получения маркировок находящихся в обороте.
сайт = "ismp.crpt.ru";
хСоединение = Новый HTTPСоединение(Сайт,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
Запрос = новый HTTPЗапрос("/api/v3/facade/identifytools/listV2?cisStatus=INTRODUCED&limit=10000");
запрос.Заголовки.Вставить("Authorization","Bearer "+Токен);
хОтвет = хСоединение.ВызватьHTTPМетод("GET",Запрос);
Если хОтвет.КодСостояния <> 200 Тогда
Сообщить("Ошибка. Код ответа " + хОтвет.КодСостояния);
ЧтениеJSON = Новый ЧтениеJSON;
Сообщение = хОтвет.ПолучитьТелоКакСтроку("UTF-8");
ЧтениеJSON.УстановитьСтроку(Сообщение);
СообщениеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить(СообщениеJSON.error_message);
Возврат;
КонецЕсли;
Сообщение = хОтвет.ПолучитьТелоКакСтроку("UTF-8");
//десериализуем данные о клиенте из JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Сообщение);
ОборудованиеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Результат = ОборудованиеJSON.results;
Для Каждого Строка Из Результат Цикл
НоваяСтрока = ТаблицаВыбывших.Добавить();
НоваяСтрока.Маркировка = Строка.cis;
КонецЦикла;
Теперь нам необходимо отгрузить маркировки другому юр.лицу. Изначально я пытался создать документ с помощью API в формате JSON, но постоянные ошибки заставили меня сделать это через XML. Выглядело это следующим образом. Сначала я создаю JSON документ
РеквизитыДокумента = Новый Структура;
РеквизитыДокумента.Вставить("trade_participant_inn_sender",ИННСобственника); //ИНН собственника
РеквизитыДокумента.Вставить("trade_participant_inn_receiver",ИННПолучателя); //ИНН получателя
РеквизитыДокумента.Вставить("trade_participant_inn_owner",ИННСобственника); //ИНН собственника
РеквизитыДокумента.Вставить("transfer_date",Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy")); //Дата передачи маркированных товаров
РеквизитыДокумента.Вставить("move_document_number",НомерДокумента); //Номер первичного документа
РеквизитыДокумента.Вставить("move_document_date",Формат(ДатаДокумента,"ДФ=dd.MM.yyyy")); //Дата первичного документа
РеквизитыДокумента.Вставить("turnover_type","SELLING"); //Код типа отгрузки
Товары = Новый Массив;
Для Каждого Строка ИЗ ТаблицаМаркировок Цикл
Отбор = Новый Структура;
Отбор.Вставить("Маркировка",Строка.Маркировка);
Если ТаблицаВыбывших.НайтиСтроки(Отбор).Количество() > 0 Тогда
СтруктураТоваров = Новый Структура;
СтруктураТоваров.Вставить("ki","<![CDATA["+Строка.Маркировка+"]]>"); //Уникальный идентификатор товара
СтруктураТоваров.Вставить("cost",Строка.Цена);
СтруктураТоваров.Вставить("vat_value",Строка.НДС);
Товары.Добавить(СтруктураТоваров);
КонецЕсли;
КонецЦикла;
РеквизитыДокумента.Вставить("product",Товары); //ИНН собственника
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\1\pills.json");
ЗаписатьJSON(ЗаписьJSON,РеквизитыДокумента);
ЗаписьJSON.Закрыть();
На структуру полей можно ориентироваться с помощью документации и данного шаблона XML
<?xml version="1.0" encoding="UTF-8"?>
<shipment version="4" action_id="10">
<trade_participant_inn_sender>6317136467</trade_participant_inn_sender>
<trade_participant_inn_receiver>7721546864</trade_participant_inn_receiver>
<trade_participant_inn_owner>6317136467</trade_participant_inn_owner>
<transfer_date>05.12.2019</transfer_date>
<move_document_number>123</move_document_number>
<move_document_date>05.12.2019</move_document_date> <!-- Комментарий -->
<turnover_type>SELLING</turnover_type>
<products_list>
<product>
<ki><![CDATA[0147012334793726213D6uKeCK7LtuO]]></ki>
<cost>33030.5</cost>
<vat_value>270.85</vat_value>
</product>
</products_list>
</shipment>
Полученный JSON файл мы загружаем в конвентер JSON-XML. Я использовал этот https://www.convertjson.com/json-to-xml.htm Он немного криво конвентирует поэтому после конвертации приводим вид файла по шаблону.
Полученный xml файл нам остается загрузить в честный знак. Для этого заходим в список документов в ЧЗ. Внизу нажимаем кнопку загрузить, выбираем пункт отгрузка и загружаем наш XML файл. После успешной загрузки без единой ошибки другое юр. лицо может принят себе отгруженные маркировки с помощью создания документа приемки.
Обработка тестировалась на платформе: 8.3.11.3034.