Качаем с сайта ESP драйвер и модуль, можно устанавливать на win 7x86, все работает.
В драйвере ТО в закладке свойств ККТ устанавливаем порт сервера GRPC: 4041, проверяем связь с ККТ.
Предупреждаю: это не готовый вариант для встраивания, это только демонстрация, как с этим работать!
Далее в 1С:
Процедура РазобратьСписок(Спис,Отступ="")
Для пп=1 по Спис.РазмерСписка() Цикл
Стр="";
сс=Спис.ПолучитьЗначение(пп,Стр);
Тип = ТипЗначенияСтр(сс);
Если Тип = "СписокЗначений" Тогда
Сообщить(Отступ+"Список: "+Стр+" "+сс.РазмерСписка());
РазобратьСписок(сс," ");
Иначе
Сообщить(Отступ+"Знач: "+Стр+" "+ПреобразоватьСтрокуИзУТФ8(сс));
КонецЕсли;
Конеццикла;
КонецПроцедуры
Функция ПолучитьGUID()
НТТРСистИнформ = СоздатьОбъект("AddIn.V7SysInfo");
Возврат СокрЛП(НТТРСистИнформ.СоздатьGUID());
КонецФункции
Функция КодироватьBase64(Текст)
Перем Алфавит;
Перем Группа, Символ;
Перем Значение, Разряд;
Перем Символ6, Значение6;
Перем Значение8, Символ8;
Перем Текст64;
// Подготовка алфавита и результата
Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
Текст64 = "";
Группа = "";
Для Номер=1 По СтрДлина(Текст) Цикл
Символ = Сред(Текст, Номер, 1);
Группа = Группа + Символ;
Если ((СтрДлина(Группа) = 3) или (Номер = СтрДлина(Текст))) Тогда
// Получение числового значения из 3-х символов
Значение = 0;
Разряд = 2;
Пока Разряд >= 0 Цикл
Символ8 = Сред(Группа, 3 - Разряд, 1);
Значение8 = КодСимв(Символ8);
Если Разряд = 1 Тогда
Значение8 = Значение8 * 256;
ИначеЕсли Разряд = 2 Тогда
Значение8 = Значение8 * 256 * 256;
КонецЕсли;
Значение = Значение + Значение8;
Разряд = Разряд - 1;
КонецЦикла;
// Получение 4-х символов из числового значения
Разряд = 3;
Пока Разряд >= 0 Цикл
Значение6 = Значение;
Если Разряд = 3 Тогда
Значение6 = Цел(Значение6 / 64 / 64 / 64);
Значение = Значение - Значение6 * 64 * 64 * 64;
ИначеЕсли Разряд = 2 Тогда
Значение6 = Цел(Значение6 / 64 / 64);
Значение = Значение - Значение6 * 64 * 64;
ИначеЕсли Разряд = 1 Тогда
Значение6 = Цел(Значение6 / 64);
Значение = Значение - Значение6 * 64;
КонецЕсли;
Если СтрДлина(Группа) < 3 Тогда
Если Значение6 = 0 Тогда
Значение6 = 64;
КонецЕсли;
КонецЕсли;
Символ6 = Сред(Алфавит, Значение6+1,1);
Текст64 = Текст64 + Символ6;
Разряд = Разряд - 1;
КонецЦикла;
Группа = "";
КонецЕсли;
КонецЦикла;
Возврат Текст64;
КонецФункции
Функция ЗначениеВJSON(Объект,Форматированный="")
Тип = ТипЗначенияСтр(Объект);
Если Тип = "СписокЗначений" Тогда
//то определим с ключами или без
Если Объект.РазмерСписка() = 0 Тогда
Тип = "СписокЗначенийбезКлючей";
Иначе
Ключ = "";
Значение = Объект.ПолучитьЗначение(1,Ключ);
Если ПустоеЗначение(Ключ) = 1 Тогда
Тип = "СписокЗначенийбезКлючей";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Тип = "ТаблицаЗначений" Тогда
сзКолонки = СоздатьОбъект("СписокЗначений");
Для СчЦ = 1 По Объект.КоличествоКолонок() Цикл
ИмяКолонки = Объект.ПолучитьПараметрыКолонки(СчЦ);
сзКолонки.ДобавитьЗначение(ИмяКолонки);
КонецЦикла;
КоличКолонок = сзКолонки.РазмерСписка();
Результат = "["+РазделительСтрок;
КоличСтрок = Объект.КоличествоСтрок();
Для СчСтрок = 1 По КоличСтрок Цикл
Результат = Результат + " {";
Для СчК = 1 По сзКолонки.РазмерСписка() Цикл
Ключ = сзКолонки.ПолучитьЗначение(СчК);
Значение = Объект.ПолучитьЗначение(СчСтрок,Ключ);
Результат = Результат + " " + ЗначениеВJSON(Ключ) + ": " + ЗначениеВJSON(Значение) + ?(СчК < КоличКолонок, ","+РазделительСтрок, "");
КонецЦикла;
Результат = Результат + РазделительСтрок + " }";
Если СчСтрок < КоличСтрок Тогда
Результат = Результат + ","+РазделительСтрок;
КонецЕсли;
Состояние("Обработка таблицы значений "+Окр(СчСтрок/КоличСтрок*100,2)+"%");
КонецЦикла;
Результат = Результат + РазделительСтрок + "]";
Возврат Результат;
ИначеЕсли Тип = "СписокЗначенийбезКлючей" Тогда //без ключей
Количество = Объект.РазмерСписка();
Результат = "[";
Для н = 1 ПО Количество Цикл
Результат = Результат + ЗначениеВJSON(Объект.ПолучитьЗначение(н)) + ?(н < Количество, ", ", "");
КонецЦикла;
Результат = Результат + "]";
Возврат Результат;
ИначеЕсли Тип = "СписокЗначений" Тогда //с ключами
н = 0;
Количество = Объект.РазмерСписка();
Результат = "{";
Для СчЦ = 1 По Количество Цикл
Ключ = "";
Значение = Объект.ПолучитьЗначение(СчЦ,Ключ);
Результат = Результат + ЗначениеВJSON(Ключ) + ": " + ЗначениеВJSON(Значение) + ?(СчЦ < Количество, ", ", "");
КонецЦикла;
Результат = Результат + "}";
Возврат Результат;
//ИначеЕсли (Тип = "СтрокаТаблицыЗначений") Тогда
//
// Результат = "{";
// Колонки = Объект.Владелец().Колонки;
// Количество = Колонки.Количество();
//
// Для н = 0 ПО Количество - 1 Цикл
// Ключ = Колонки[н].Имя;
// Результат = Результат + ЗначениеВJSON(Ключ) + ": " + ЗначениеВJSON(Объект[Ключ]) + ?(н < Количество - 1, ", ", "");
// КонецЦикла;
//
// Результат = Результат + "}";
// Возврат Результат;
//
//ИначеЕсли Тип = "ЭлементСпискаЗначений" Тогда
// Возврат ЗначениеВJSON(Объект.Значение);
ИначеЕсли Тип = "Строка" Тогда
Результат = СокрЛП(Объект);
Результат = СтрЗаменить(Результат, "\", "\\");
Результат = СтрЗаменить(Результат, "/", "\/");
Результат = СтрЗаменить(Результат, """", "\""");
Результат = СтрЗаменить(Результат, "'", "\u0027");//"\'"
Результат = СтрЗаменить(Результат, Симв(13), "\r");
Результат = СтрЗаменить(Результат, СимволТабуляции,"\t");
Результат = СтрЗаменить(Результат, Симв(10), "\n");
Результат = СтрЗаменить(Результат, Симв(29), "\u001D");
//Результат = СтрЗаменить(Результат, ".", "\u002E");
Возврат """" + Результат + """";
ИначеЕсли Тип = "Число" Тогда
Возврат Формат(Объект, "Ч");
//ИначеЕсли Тип = "Перечисление" Тогда
// Возврат Формат(Объект, "БЛ=false; БИ=true");
ИначеЕсли Тип = "Дата" Тогда
Возврат ЗначениеВJSON(""+ДатаГод(Объект)+"-"+ДатаМесяц(Объект)+"-"+ДатаЧисло(Объект));
ИначеЕсли Тип = "НеизвестныйОбъект" Тогда
Возврат "null";
Иначе
Возврат ЗначениеВJSON(Строка(Объект));
КонецЕсли;
КонецФункции // ЗначениеВJSON()
Функция Инициализация()
wHTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт= СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Скрипт.AddObject("wHTTP",wHTTP);
Скрипт.Eval("wHTTP.Option(2)=1251"); // установка кодировки страницы
Скрипт.Eval("wHTTP.Option(4)=13056");//intSslErrorIgnoreFlags Игноировать ошбибки при SSL соединении
Скрипт.Eval("wHTTP.Option(6)=true");//blnEnableRedirects Разрешить перенаправления
Скрипт.Eval("wHTTP.Option(12)=true");//blnEnableHttpsToHttpRedirects Разрешить перенаправления с защищенного на не защиещенное соединение
Возврат wHTTP;
КонецФункции
//*******************************************
Процедура Сформировать()
КонтрольнаяСуммаПО="d5b7df0fdfdfe745ecc0e3fe80091fc8"; //Контрольная сумма 1cv77.exe можно получить с помощью ТоталКомандера
Клиент=СоздатьОбъект("СписокЗначений");
Клиент.ДобавитьЗначение("1c Аптечная сеть","name");
Клиент.ДобавитьЗначение("7.7","version");
Клиент.ДобавитьЗначение(ПолучитьGUID(),"id");
Клиент.ДобавитьЗначение(КонтрольнаяСуммаПО,"token");
МаркаТ=СокрЛП(СтрЗаменить(Марка,Симв(10),""));
МаркаТ=СокрЛП(СтрЗаменить(МаркаТ,Симв(13),""));
МаркаТ=СокрЛП(СтрЗаменить(МаркаТ,Симв(29),""));
Разделитель=Симв(29);
Если Сред(СокрЛП(МаркаТ), 38)="" Тогда
Маркировка = Лев(СокрЛП(МаркаТ), 31) + Разделитель + Сред(СокрЛП(МаркаТ), 32, 6);
Иначе
Маркировка = Лев(СокрЛП(МаркаТ), 31) + Разделитель + Сред(СокрЛП(МаркаТ), 32, 6) + Разделитель + Сред(СокрЛП(МаркаТ), 38);
КонецЕсли;
Сообщить(""+КодироватьBase64(СокрЛП(Маркировка)));
Маркировка=КодироватьBase64(СокрЛП(Маркировка));
СпМарка=СоздатьОбъект("СписокЗначений");
СпМарка.ДобавитьЗначение(Маркировка);
Спис=СоздатьОбъект("СписокЗначений");
Спис.ДобавитьЗначение(СпМарка,"codes");
Спис.ДобавитьЗначение(Клиент,"client_info");
Параметры=ЗначениеВJSON(Спис);
тхт=СоздатьОбъект("Текст");
тхт.ДобавитьСтроку(Параметры);
тхт.Записать(КаталогИБ()+"token.json");
УРЛ="https://esm-emu.ao-esp.ru";
//УРЛ="https://tspiot.sandbox.crptech.ru";
//УРЛ="https://127.0.0.1:51401";
Метод="/api/v1/codes/checkoffline";
Соединение=Инициализация();
Соединение.Open("POST", УРЛ+Метод, 0);
Соединение.setRequestHeader("Content-Type","application/json");
Соединение.Send(СокрЛП(Параметры));
//Соединение.Send();
Статус = Соединение.status();
СтатусТекст = Соединение.statusText();
Рез = Соединение.ResponseText();
Если Статус=200 Тогда
Ответ=глРазборJSON(Рез);
СрокДействия=Ответ.Получить("accessTokenExpiration");
Иначе
Предупреждение("Авторизация не удалась!"+РазделительСтрок+СтатусТекст);
тхт=СоздатьОбъект("Текст");
тхт.ДобавитьСтроку(Рез);
тхт.Записать(КаталогИБ()+"token.txt");
КонецЕсли;
РазобратьСписок(Ответ);
КонецПроцедуры
Процедура Инфо()
УРЛ="https://esm-emu.ao-esp.ru";
УРЛ="https://tspiot.sandbox.crptech.ru";
УРЛ="https://127.0.0.1:51401";
Метод="/api/v1/info";
Соединение=Инициализация();
Соединение.Open("POST", УРЛ+Метод, 0);
Соединение.setRequestHeader("Content-Type","application/json");
Соединение.Send();
Статус = Соединение.status();
СтатусТекст = Соединение.statusText();
Рез = Соединение.ResponseText();
Если Статус=200 Тогда
Ответ=глРазборJSON(Рез);
СрокДействия=Ответ.Получить("accessTokenExpiration");
Иначе
Предупреждение("Авторизация не удалась!"+РазделительСтрок+СтатусТекст);
тхт=СоздатьОбъект("Текст");
тхт.ДобавитьСтроку(Рез);
тхт.Записать(КаталогИБ()+"token.txt");
КонецЕсли;
РазобратьСписок(Ответ);
КонецПроцедуры
Марка="0104601907002805215uNcZ0ERKH2s191F01392eIbT0hNA/vwWYACBeyx6V2l7Bb91AoYqD8HzBcGu0Qc=";
Вступайте в нашу телеграмм-группу Инфостарт
