Для 1С 7.7: //infostart.ru/1c/tools/2077143/
Согласно документации, находящейся по ссылке:
https://честныйзнак.рф/business/projects/retail/checkout/regulations/ описал методику работы. Учел временные блокировки серверов (по умолчанию на 15 мин.), то, что запросы доступных площадок нужно делать раз в шесть часов, то, что может быть аварийный режим в самом ЦРПТ,...... , все эти ситуации работают в автоматическом режиме:
Функция ВыполнитьОнлайнПроверкуЦРПТ(ВходныеПараметры,ВыходныеПараметры,ПовторЗапроса=0) Экспорт
Рез = Истина;
Если ПолучитьКонстанту("ОнлайнПроверкаМарокЧерезЦРПТ") И Не ПолучитьКонстанту("АварийнаяБлокировкаОнлайнПроверокМарокЧерезЦРПТ") Тогда
//Если ПроверитьТипМаркируемойПродукцииДляОнлайнПроверкиВЦРПТ(ВходныеПараметры.ТекНом)=1 Тогда //Здесь проверяем, а нужно ли вообще делать проверку данного тимпа продукции
Если Не ЗначениеЗаполнено(ВходныеПараметры.Токен) Тогда
ВыходныеПараметры.ОписаниеРезультата = "Ошибка! Не заполнен Токен в Константах для онлайн проверки ЦРПТ!";
Рез = Ложь;
Иначе
РезПроверки = ОбновитьДанныеПлощадокЦРПТ(ВходныеПараметры);
ТекущийСерверОнлайнПроверкиЦРПТ = РезПроверки.Получить("ТекущийСерверОнлайнПроверкиЦРПТ");
КоличествоДоступныхСерверовОнлайнПроверкиЦРПТ = РезПроверки.Получить("КоличествоДоступныхСерверовОнлайнПроверкиЦРПТ");
КодОтвета = РезПроверки.Получить("КодОтвета");
ТекстОшибки = РезПроверки.Получить("ТекстОшибки");
Если КодОтвета=203 Тогда
//Включили аварийный режим!
ИначеЕсли КодОтвета=401 Тогда
ВыходныеПараметры.ОписаниеРезультата = ТекстОшибки;
Рез = Ложь;
ИначеЕсли Не ЗначениеЗаполнено(ТекущийСерверОнлайнПроверкиЦРПТ) Тогда
ВыходныеПараметры.ОписаниеРезультата = "Ошибка! Нет доступных серверов для онлайн проверки в ЦРПТ!";
ВыходныеПараметры.ПроверитьОфлайн = Истина;
Рез = Ложь;
Иначе
ВходныеПараметры.Вставить("ТекущийСерверОнлайнПроверкиЦРПТ",ТекущийСерверОнлайнПроверкиЦРПТ);
РезПроверки = ВыполнитьОнлайнКонтрольМаркиВЦРПТ(ВходныеПараметры);
ТекстОшибки = РезПроверки.Получить("ТекстОшибки");
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
Рез = Ложь;
КодОтвета = РезПроверки.Получить("КодОтвета");
ВыходныеПараметры.ОписаниеРезультата = ТекстОшибки;
Если (КодОтвета<>200) Тогда
Если (КодОтвета=203) или ((КодОтвета=5000) и (ПовторЗапроса=1)) Тогда //203 - Включена Аварийная ситуация! 5000 - просто можно пробивать далее без проверки!
Если (КодОтвета=203) Тогда
УстановитьСнятьАварийнуюБлокировкуОнлайнПроверкиЦРПТ(ТекущаяДата());
КонецЕсли;
Рез = Истина;
ВыходныеПараметры.ОписаниеРезультата = "";
ЗаписатьЛогОшибкиОнлайнПроверкиЦРПТ(ВходныеПараметры.ТекНом,ВходныеПараметры.текКМ,ТекстОшибки,КодОтвета);
Иначе
Если (КодОтвета=429) или (КодОтвета>=500) Тогда
Если ПовторЗапроса = 0 Тогда
ПовторЗапроса = 1;
Иначе
ПовторЗапроса = 0;
КонецЕсли;
Иначе
ПовторЗапроса = 0;
КонецЕсли;
Если ПовторЗапроса = 0 и КоличествоДоступныхСерверовОнлайнПроверкиЦРПТ>1 Тогда //Последний оставшийся сервер блокировать не будем, смысла особого не вижу!
УстановитьБлокировкуСервераОнлайнПроверкиЦРПТ(ТекущаяДата(),ТекущийСерверОнлайнПроверкиЦРПТ);
КонецЕсли;
Функция ВыполнитьОнлайнКонтрольМаркиВЦРПТ(ВходныеПараметры)
Токен = ВходныеПараметры.Токен;
Марка = ВходныеПараметры.текКМ;
НомерФН = ВходныеПараметры.НомерФН;
ИНН = ВходныеПараметры.ИНН;
ТестовыйКонтур = ВходныеПараметры.ТестовыйКонтур; //С первого апреля 2024г. Тестовый контур работать не будет!!! //АдресТестовый = "markirovka.sandbox.crptech.ru";
ТекущийСерверОнлайнПроверкиЦРПТ = ВходныеПараметры.ТекущийСерверОнлайнПроверкиЦРПТ;
Рез = Новый Соответствие();
Рез.Вставить("ИдЗапроса","");
Рез.Вставить("ВременнаяМетка","");
Рез.Вставить("ТекстОшибки","");
Рез.Вставить("ВремяЗапроса",0);
Рез.Вставить("КодОтвета",0);
Марка = JSONСтрока(СокрЛП(Марка));
Марка = СтрЗаменить(Марка, "(Код29)", "\u001d");
Марка = СтрЗаменить(Марка, Символ(29), "\u001d");
Если ЗначениеЗаполнено(ТекущийСерверОнлайнПроверкиЦРПТ) Тогда
ДанныеУРЛ = РазобратьСерверПортИзСтроки(СокрЛП(ТекущийСерверОнлайнПроверкиЦРПТ));
АдресРесурса = ДанныеУРЛ.Адрес;
ПортРесурса = ДанныеУРЛ.Порт;
Если ПортРесурса = 0 Тогда
ПортРесурса = 443;
КонецЕсли;
ИспШифрование = ДанныеУРЛ.Шифрование;
Иначе
Рез.Вставить("ТекстОшибки", "Ошибка! Не выбран сервер онлайн проверки ЦРПТ!");
Возврат Рез;
КонецЕсли;
Если ПустаяСтрока(ИНН)=0 Тогда
ЧастьЗапросаИНН = ",""inn"":"""+СокрЛП(ИНН)+"""";
Иначе
ЧастьЗапросаИНН = "";
КонецЕсли;
Если ПустаяСтрока(НомерФН)=0 Тогда
ЧастьЗапросаФН = ",""fiscalDriveNumber"":"""+СокрЛП(НомерФН)+"""";
Иначе
ЧастьЗапросаФН = "";
КонецЕсли;
ТелоЗапросаJSON = "{""codes"":["""+Марка+"""]"+ЧастьЗапросаИНН+ЧастьЗапросаФН+"}";
ТаймаутОжидания = ПолучитьКонстанту("ТаймаутОжиданияОтветаОтЦРПТ");
Если ТаймаутОжидания=0 Тогда
ТаймаутОжидания = 2;
КонецЕсли;
Если ПолучитьКонстанту("СпособЗапросаВЦРПТ")=0 Тогда
//Запрос средствами 1С --->
Заголовки = Новый Соответствие();
Заголовки.Вставить("X-API-KEY",Токен);
Заголовки.Вставить("Accept-Charset","utf-8");
Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
HTTPЗапрос = Новый HTTPЗапрос("api/v4/true-api/codes/check",Заголовки);
Реализован механизм офлайн проверки КИ через ЛМ ЧЗ (Локальный модуль «Честный ЗНАК»), который начинает действовать с 01.03.2025г. Также через 1С можно произвести первоначальную инициализацию ЛМ ЧЗ, произвести проверку статуса ЛМЧЗ и дату последнего обновления БД.
Функция ОфлайнПроверкаКИ_ЛМЧЗ(ВходныеПараметры)
АдресРесурса = ВходныеПараметры.АдресРесурса;
ПортРесурса = ВходныеПараметры.ПортРесурса;
ЛогинПароль = ВходныеПараметры.ЛогинПароль;
НомерФН = ВходныеПараметры.НомерФН;
КИ = ВходныеПараметры.КИ;
Если АдресРесурса="" Тогда
АдресРесурса = "127.0.0.1";
КонецЕсли;
Если ПортРесурса=0 Тогда
ПортРесурса = 5995;
КонецЕсли;
Если ЛогинПароль="" Тогда
ЛогинПароль = "admin:admin";
КонецЕсли;
ЛогинПароль = "Basic "+Base64_Закодировать(ЛогинПароль);
Рез = Новый Соответствие();
Рез.Вставить("ИдЗапроса","");
Рез.Вставить("ВременнаяМетка","");
Рез.Вставить("ТекстОшибки","");
Рез.Вставить("ВремяЗапроса",0);
Рез.Вставить("КодОтвета",0);
ТаймаутОжидания = ПолучитьКонстанту("ТаймаутОжиданияОтветаОтЦРПТ");
Если ТаймаутОжидания=0 Тогда
ТаймаутОжидания = 2;
КонецЕсли;
Если ПолучитьКонстанту("СпособЗапросаВЦРПТ")=0 Тогда
//Запрос средствами 1С --->
Заголовки = Новый Соответствие();
Заголовки.Вставить("Accept-Charset","utf-8");
Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
Заголовки.Вставить("Authorization",ЛогинПароль);
Заголовки.Вставить("X-ClientId",НомерФН);
HTTPЗапрос = Новый HTTPЗапрос("api/v1/cis/check?cis="+КИ,Заголовки);
Попытка
Соединение = Новый HTTPСоединение(АдресРесурса,ПортРесурса,,,,ТаймаутОжидани
Если произвести публикацию (достаточно только HTTP сервисы), то данную конфигурацию можно использовать как собственный сервис онлайн и офлайн проверки. Таким образом можно минимизировать изменение программного кода основной базы. Внутри конфигурации находиться обработка "ОнлайнПроверкаЧерезСобственныйСервис", которую можно сохранить как внешнюю и использовать в других программах 1С.
Во всех вариантах, происходит сначала Онлайн проверка и если возможно - Офлайн проверка. В качестве ответа получаем готовый результат UUID для передачи на кассу Тега: 1265 (при положительном результате))))) ):
UUID=638f669e-7e8e-85a9-3453-2c429d001150&Time=1731658318006
В качестве примера все написанные запросы реализованы двумя вариантами: стандартными средствами 1С и через Curl.exe
Весь код программы выведен в отдельную подсистему.
Код полностью открыт.
Тестировалось все на платформе: 8.3.17. (но думаю, проблем не будет, если даже опуститься до 8.2 и до 8.1 без управляемых форм) Конфигурация: любая!!!
Данный механизм можно взять как готовую основу для внедрения в свою программу. Логика работы с ЦРПТ реализована (согласно документации), думаю, почти вся. Как минимум можно сэкономить немало времени на внедрении.
Марки нужно вводить с экранированным символом GS в виде: "(Код29)"
Пример: ...........DEh8o1(Код29)918039(Код29)92nONJn6nwAm................
Обратите внимание: представленный механизм не производит проверку правильности вводимой марки и КИ!!!! Прежде чем задать вопрос, проверьте, что вводимая марка и КИ правильные.
Обновление: 13.02.2025 - Архив с данными 006.zip
Если КИ не заполнен, то будет выделен из Марки.