Вход | Регистрация
    1  2   
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Запрос к API МОТП, возвращает html вместо json - ?

v7: Запрос к API МОТП, возвращает html вместо json - ?
Я
   MWWRuza
 
24.01.20 - 01:03
Добрый день!
Пытаюсь авторизоваться через API "Честного знака", табак...

Описание API: https://xn--80ajghhoc2aj1c8b.xn--p1ai/upload/iblock/056/Polnyy-spisok-API-true_api_v3.4.pdf

Делаю:

wHTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
wHTTP.Option(2,"utf-8");
wHTTP.SetTimeouts(0, 0, 0, 0);

Url = "https://ismotp.crptech.ru/v3/true-api/auth/key";;
wHTTP.Open("GET", Url, 1);
wHTTP.SetRequestHeader("Content-Type", "application/json");
wHTTP.SetRequestHeader("Accept-Charset", "utf-8");
wHTTP.Send();
    
RequestTimeout = 40;
Попытка
    Рез = wHTTP.WaitForResponse(RequestTimeout);
Исключение
    Рез = 0;
    Ответ = ОписаниеОшибки();
КонецПопытки;

Ответ = "";
Если Рез = -1 Тогда
    Статус = wHTTP.status();
        Ответ = СокрЛП(wHTTP.ResponseText());
КонецЕсли;

Статус = 200, вроде все нормально, но!!! Должна вернуться пара строк "uuid" и "data" в json... А в Ответе какая-то web-страница в html, вместо ответа json...
Что-то я совсем запутался в трех соснах, вроде все элементарно... Что я не так делаю?
   palsergeich
 
1 - 24.01.20 - 01:09
(0) web-страница в html - вот и прочитай что там написано. Любят некоторые ошибки красиво выдавать, но с кодом 200.
   MWWRuza
 
2 - 24.01.20 - 01:43
(1)Да пробовал... html не открывается, глазами просто в тексте, тоже ничего не вижу...

Судя по всему, что-то с адресом не так.

    Url = "https://int01.gismt.crpt.tech/api/v3/true-api/auth/key";;
//    Url = "https://ismotp.crptech.ru/v3/true-api/auth/key";;
//    Url = "https://ismotp.crptech.ru/api/v3/true-api/auth/key";;

Первый работает, выдает нормально, то что должен, в json, но, это типа "тестовая площадка".
Второй выдает что-то не понятное в html,
а третий не верный адрес шлюза, ошибка 502...

Из описания:

Url (интеграционный стенд): https://int01.gismt.crpt.tech/api/v3/true-api
Url (промышленный стенд): https://ismotp.crptech.ru/api/v3/true-api
   MWWRuza
 
3 - 24.01.20 - 01:58
+(2)html не открывается, глазами просто в тексте, тоже ничего не вижу...

На самом деле, там конечно что-то написано, но как прочитать... Строка около 7000 символов, естественно в табло отладчика не лезет... А сохранить в файл, так:

Тхт = СоздатьОбъект("Текст");
Тхт.ДобавитьСтроку(Ответ);
Тхт.Сохранить("C:\Temp\Otvet.txt");

Сохраняет, но с кодировкой проблемы. Там одна строка на человеческом языке, и то по русски :-( , соответственно вопросиками выводится... Остальное, похоже тело web-страницы... Не понятно, чего ему надо...
   MWWRuza
 
4 - 24.01.20 - 02:05
+(3)Не Тхт.Сохранить, а Тхт.Записать конечно, просто уже спать хочу...
   Сергиус
 
5 - 24.01.20 - 02:42
(0)При переходе по ссылке https://ismotp.crptech.ru/api/v3/true-api/ выдает 502 Bad Gateway, походу на серваке проблемы.
   MWWRuza
 
6 - 24.01.20 - 02:44
+(2) Из этих трех адресов, если их из браузера открывать:

"https://int01.gismt.crpt.tech/api/v3/true-api/auth/key";; - Работает, прилетает XML в браузер, но это тестовая площадка. Из запроса возвращается json.

"https://ismotp.crptech.ru/v3/true-api/auth/key";;         - Попадает в web-интерфейс личного кабинета клиента, как просто при вводе адреса.

"https://ismotp.crptech.ru/api/v3/true-api/auth/key";;     - а тут, 502, как из браузера так и из запроса...
   MWWRuza
 
7 - 24.01.20 - 02:46
(5) Ага... Надо будет завтра попробовать.
   big
 
8 - 24.01.20 - 05:46
В продолжение темы вопрос ТС-у.

А как вы будете формировать строку data для получения ключа сессии? Если я правильно понял, это необходимо для юридически значимых операций. Или таких операций у вас не будет, или можно без них обойтись?
   victuan1
 
9 - 24.01.20 - 07:28
(3) Ну выведи строку в цикле в табло сообщений, разбив по 500 символов в строке.
   MWWRuza
 
10 - 24.01.20 - 09:20
(9) Да, можно, но уже и так понятно - там в адресе нет "/api/", оно идет на страничку web-интерфейса ЛК, ну, и что-то там не сростается,запрашивает авторизацию наверно... Но это уже не принципиально - правильный адрес который третий - https://ismotp.crptech.ru/api/v3/true-api/auth/key%22 . А по нему - 502...

(8) Строка "data" должна прилетать с сервера, в ответ на этот запрос, вместе с ключом "uuid", в json. Мне ее нужно подписать ЭЦП и отправить обратно, подписанную, вместе с этим-же ключом, запросом "POST", так-же в json. В ответ, сервер должен вернуть токен, сроком жизни один час. Его нужно использовать во всех последующих запросах. Как-то так... Или я чего-то не правильно понимаю из описания API - ???
   MWWRuza
 
11 - 24.01.20 - 09:26
+(10)
Вот, только что:

"[{"uuid":"9d1184fc-bd6d-4006-9942-55db77b2f575","data":"UJNMDZDNNHQMITAPBOCNWAWVFVNRMK"},{"uuid":"9b1751f4-32a5-4ec9-80a2-1c0e335d3019","data":"UBIEOYRKNMUXDBKWMMOFXMHEZKYAIU"}]"

Такое возвращается по первому, тестовому адресу. По третьему, все так-же, 502, хоть из запроса, хоть из браузера...
   big
 
12 - 24.01.20 - 10:03
(10) Вот меня и интересует - как в 7.7 подписать ЭЦП? Через какой "инструмент" можно это сделать?
   big
 
13 - 24.01.20 - 10:08
(12) + 1 час "живет" пара uuid-data из (11), а вот то, что вернётся из запроса "/auth/simpleSignIn" уже будет "ключом сессии" (токеном) и будет "жить" 10 часов.

з.ы. сам только начал разбираться, читаю по документации
   big
 
14 - 24.01.20 - 10:09
(13) + и подписывать ЭЦП-шкой надо будет строку "data" из каждой полученной пары.
   MWWRuza
 
15 - 24.01.20 - 10:15
(12) Подписывается нормально, с помощью CAPICOM. Вот была публикация на ИС: http://catalog.mista.ru/public/156973/ , от туда взял алгоритм, успешно работает, и для деклараций алкогольных, и эти данные подписывает. Только, единственное - с "аппраратными ключами", с криптографией "на борту" не дружит. ДжаКарту или Рутокен ЭЦП 2.0 использовать не получается. А с Крипто-прошными или VIP-Net ЭЦП, работает отлично.
   MWWRuza
 
16 - 24.01.20 - 10:36
Вот мне пока не понятно, если клиент с ЭЦП зареген в "Честном знаке", на площадке табака... ЛК у него работает, чеки с касс прилетают. Нужно дополнительно регистрироваться для получения доступа через API, плюс внешний статический IP адрес, который надо указать при доп. регистрации, или и так должно работать? Встречал такое в описании регламента, но, там почему-то конкретно про лекарства... Для табака тоже так?
   big
 
17 - 24.01.20 - 10:39
(15) Спасибо за информацию!!! )
   MWWRuza
 
18 - 24.01.20 - 10:43
(13)читаю по документации

Какой адрес "боевой" площадки указан в Вашей документации? А то документаций версий много, и адреса разные, я уже как минимум два видел:

"https://ismotp.crptech.ru/api/v3/true-api";
и
"https://ismotp.crptech.ru/private-office-api/private/v2";

Ни тот ни другой у меня не работает, только тестовый:

"https://int01.gismt.crpt.tech/api/v3/true-api";
   big
 
19 - 24.01.20 - 10:50
(18) Я читаю, что у вас в первом посте. До самих запросов у меня ещё не дошло
   MWWRuza
 
20 - 24.01.20 - 22:38
Вот так: Url = "https://ismotp.crptech.ru/api/v3/auth/cert/key";
Пару получаю, подписываю, токен возвращается...
А дальше - глухо... То, ради чего я это затевал, упорно не работает...
Хочу агрегацию получить, из кода коробки вытащить все коды пачек...
Явно что-то с адресом опять не то, в разных вариантах пробовал - 405, 401, 404 возвращается...
   MWWRuza
 
21 - 24.01.20 - 22:39
(20)все коды пачек...

Все коды блоков...
   MWWRuza
 
22 - 25.01.20 - 01:13
Победил... В бухгалтерии 3.0 подсмотрел :-)
Вот так должно быть: "https://ismotp.crptech.ru/private-office-api/private/v2/cis/aggregated?cis="; + СокрЛП(КодМаркировки)
КодМаркировки, это код агрегации с коробки, или блока, в зависимости от того, что нужно получить.
   MWWRuza
 
23 - 25.01.20 - 01:30
   MWWRuza
 
24 - 27.01.20 - 00:13
Вот, скриншот в принципе, "финального" варианта: https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-288.jpg
Запрос по ШК короба, выводит 50 ШК блоков, каждый ШК блока расшифровывается в список пачек, всего 500 пачек в коробе.
Не знаю, будет ли это иметь какое-нибудь "прикладное" значение, но, пусть будет.
Сейчас пытаюсь список документов клиента с сервера МОТП получить, пока безрезультатно - то-ли по тому, что их там просто нет, то-ли опять что-то не так описано в описании API(ну, или я не так понял :-))
   MWWRuza
 
25 - 27.01.20 - 00:19
+(24) Если сделать запрос по ШК блока, то выводит список пачек, 10 кодов.
Только пришлось "нормализовать" ШК перед передачей на сервер - оставить только часть до первого спец-символа разделителя, и заменить "недопустимые" с их точки зрения символы, согласно таблице замены из описания API.
   РоманВ_К
 
26 - 28.01.20 - 12:04
(0) А в Ответе какая-то web-страница в html, вместо ответа json...
Я для отладки Фидлер использую, очень удобно. Бесплатный. https://www.telerik.com/fiddler
   igel1969
 
27 - 17.03.20 - 13:49
(22) так в итоге пришлось авторизоваться или без авторизации выдает?
потому что я без авторизации попробвал Ваш вариант, мне выдает ответ:
<UnauthorizedException><error>unauthorized</error><error_description>Full authentication is required to access this resource</error_description></UnauthorizedException>
   MWWRuza
 
28 - 17.03.20 - 14:07
(27) Да нет, авторизуюсь, нормально все, и после авторизации работает запрос вложений в упаковку(агрегации)...
Без авторизации, скорее всего и не должно работать.
   igel1969
 
29 - 17.03.20 - 14:13
а после подписания date у Вас тоже становится длиной около 5000 знаков? просто в документации по API в примере подписанная date такой же длины как и не подписанная.
   MWWRuza
 
30 - 17.03.20 - 20:55
Да, после подписания становится значительно длиннее, сколько символов, я не считал, но много, наверное так и есть...
 
 Рекламное место пустует
   igel1969
 
31 - 18.03.20 - 09:35
(((((((((( ну никак не могу получить токен.
все делаю по инструкции в описании API, который прислала техподдержка:
WinHttp2 = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

WinHttp2.Open("POST", "https://ismotp.crptech.ru/api/v3/true-api/auth/simpleSignIn",0);
WinHttp2.setRequestHeader("Content-Type","application/json; charset=utf-8");
//WinHttp2.setRequestHeader("Postman-Token","5325d8aa-ba27-44c5-9b10-c02da19f1b0c");  // тут непонятно что писать
WinHttp2.setRequestHeader("cache-control","no-cache");
СтрокаЗапроса = "{""uuid"": """+СокрЛП(Uuid)+""",""data"": """ + ТекстОтвета + """}";
Сообщить(СтрокаЗапроса);
WinHttp2.Send(СтрокаЗапроса);
РезультатСтр = WinHttp2.ResponseText();
Сообщить(РезультатСтр);

получаю ответ:
Ошибка при выполнении запроса
   Garykom
 
32 - 18.03.20 - 10:14
(31) Обычно запрос токена идет по http (без s) а уже дальше по https
   Garykom
 
33 - 18.03.20 - 10:14
(32)+ Но я могу ошибаться, проверь в мануале
   ДенисЧ
 
34 - 18.03.20 - 10:18
(32) Ну, у меня (точнее, у того сервиса, что я использую) например авторизация идёт по хттпс...
   MWWRuza
 
35 - 18.03.20 - 10:18
Вот так получаю пару:

// Возвращает пары идентификатор-данные для запроса токена

Функция ВернутьПаруЗапрТокена(УРЛ, ПрефиксВерсии)
//    WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.Option(2,"utf-8");
    WinHttp.SetTimeouts(0, 0, 0, 0);
    Url = "https://"; + УРЛ + ПрефиксВерсии + "auth/cert/key";    
    WinHttp.Open("GET", Url, 1);
    WinHttp.SetRequestHeader("Content-Type", "application/json");
    WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
    WinHttp.Send();
    RequestTimeout = 40;
    Попытка
        Рез = WinHttp.WaitForResponse(RequestTimeout);
    Исключение
        Рез = 0;
        Ответ = ОписаниеОшибки();
    КонецПопытки;
    Ответ = "";
    Если Рез = -1 Тогда
        Статус = WinHttp.status();
        Ответ = СокрЛП(WinHttp.ResponseText());
    КонецЕсли;
    СЗ = глРазборJSON(Ответ);
    Возврат СЗ;
КонецФункции

СзКей    = ВернутьПаруЗапрТокена(СокрЛП(Константа.АдресСервисаМОТП), ПрефиксВерсии);

ПрефиксВерсии = "/api/v3/";
   Garykom
 
36 - 18.03.20 - 10:19
   MWWRuza
 
37 - 18.03.20 - 10:22
Константа адрес сервера: "ismotp.crptech.ru"
   igel1969
 
38 - 18.03.20 - 10:25
(35) это я уже прошел, получаю, подписываю.
не могу послать запрос с подписанным data на получения токена ((((
   MWWRuza
 
39 - 18.03.20 - 10:27
//******************************************************************************

// ПолучитьКлючСессии(code)
//
// Параметры:
//  code
// Возвращаемое значение:
//  token
//
// Описание:
Функция ПолучитьТокенЦРПТ(ВыбЭЦП, ПрефиксВерсии, СтрОшибка="",life_time=0) Экспорт
    Перем Сигнатура;
    Перем uuid;
    Перем code;
    СзКей            = ВернутьПаруЗапрТокена(СокрЛП(Константа.АдресСервисаМОТП), ПрефиксВерсии);
    сзJSONЗапрос    = СоздатьОбъект("СписокЗначений");
    Сч = 0;
    Для Сч = 1 По СзКей.РазмерСписка() Цикл
        uuid         = СзКей.Получить("uuid");
        code        = СзКей.Получить("data");
        Сигнатура     = ПодписатьТекст(code,СокрЛП(ВыбЭЦП.Отпечаток),1);
        Если ПустоеЗначение(Сигнатура) = 1 Тогда
            Возврат "";
        КонецЕсли;
        Сигнатура     = ПолучитьPublic_cert(Сигнатура);
        сзJSONЗапрос.Установить("uuid",uuid);
        сзJSONЗапрос.Установить("data",Сигнатура);        
    КонецЦикла;
    Ответ             = глHTPP_ВыполнитьЗапрос("POST","https://"; + СокрЛП(Константа.АдресСервисаМОТП) + ПрефиксВерсии + "auth/cert/", сзJSONЗапрос,,,СтрОшибка);
    Если ПустоеЗначение(Ответ) = 0 Тогда
        сзОтвет     = глРазборJSON(Ответ);
    КонецЕсли;
    Если ПустоеЗначение(сзОтвет) = 1 Тогда
        Возврат 0;
    КонецЕсли;
    Возврат сзОтвет.Получить("token");
КонецФункции // ПолучитьКлючСессии()

Сам запрос у меня универсальный, много под что... Нужен?
   MWWRuza
 
40 - 18.03.20 - 10:29
Вот:

//******************************************************************************

// ВыполнитьЗапрос()
//

// Параметры: 
//  ТипЗапроса="POST",Url,сзJSONЗапрос,КлючСессии="",сзЗаголовки="",СтрОшибка=""

//
// Возвращаемое значение:

//  Ответ
//

// Описание:
//

Функция глHTPP_ВыполнитьЗапрос(ТипЗапроса="POST",Url,сзJSONЗапрос,КлючСессии="",сзЗаголовки="",СтрОшибка="", НеОбр429 = 0) Экспорт
//    WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");

    WinHttp.Option(2,"utf-8");
    WinHttp.SetTimeouts(0, 0, 0, 0);    
    Если ТипЗначенияСтр(сзJSONЗапрос) = "СписокЗначений" Тогда
        ЗапросJSON    = ЗначениеВJSON(сзJSONЗапрос);
    Иначе
        ЗапросJSON    = "";
    КонецЕсли;
    WinHttp.Open(ТипЗапроса,Url,1);
    WinHttp.SetRequestHeader("Content-Type", "application/json");
    WinHttp.SetRequestHeader("Accept-Charset", "utf-8"); 
    Если ПустоеЗначение(КлючСессии) = 0 Тогда
        WinHttp.SetRequestHeader ("Authorization", "Bearer " + КлючСессии);
    КонецЕсли;
    Если ПустоеЗначение(сзЗаголовки) = 0 Тогда
        СчЦикла = 0;
        Для СчЦикла = 1 По сзЗаголовки.РазмерСписка() Цикл
            ИмяЗаголовка = "";
            ЗначениеЗаголовка = сзЗаголовки.ПолучитьЗначение(СчЦикла,ИмяЗаголовка);
            Если (ПустоеЗначение(ИмяЗаголовка) = 0) И (ПустоеЗначение(ЗначениеЗаголовка) = 0) Тогда
                WinHttp.SetRequestHeader (ИмяЗаголовка, ЗначениеЗаголовка);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    WinHttp.Send(ЗапросJSON); 
    RequestTimeout = 40;
    Попытка
        Рез = WinHttp.WaitForResponse(RequestTimeout);
    Исключение
        //ошибка

        Рез = 0;
        Ответ = ОписаниеОшибки(); 
        Возврат Ответ;
    КонецПопытки;
//    Ответ = "";

    Если Рез = -1 Тогда
        Статус = WinHttp.status();
        СтатусТекст = WinHttp.statusText();
        Ответ = СокрЛП(WinHttp.ResponseText());
        Если Статус <> 200 Тогда
            Если Статус = 307 Тогд//перенаправление

                Url = WinHttp.GetResponseHeader("Location");
                Если ПустоеЗначение(Url) = 0 Тогда
                    Возврат глHTPP_ВыполнитьЗапрос(ТипЗапроса,Url,сзJSONЗапрос,КлючСессии,сзЗаголовки,СтрОшибка);
                КонецЕсли;
            КонецЕсли;
            Если (Статус = 429) И (НеОбр429 = 0) Тогд//слишком много запросов

                глЗадержка(5);
                Возврат глHTPP_ВыполнитьЗапрос(ТипЗапроса,Url,сзJSONЗапрос,КлючСессии,сзЗаголовки,СтрОшибка);
            КонецЕсли;
            Если ПустоеЗначение(Ответ) = 0 Тогда
                Если Лев(Ответ,1) = "{" Тогда
                    сзОтвет     = глРазборJSON(Ответ);
                    СтрОшибка     = сзОтвет.Получить("error_description");
                    Возврат Ответ;
                КонецЕсли;
            Иначе
                Возврат "";
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Возврат Ответ;
КонецФункции// ВыполнитьЗапрос()
   igel1969
 
41 - 18.03.20 - 10:38
(40) я дико прошу прощения,  а ЗапросJSON    = ЗначениеВJSON(сзJSONЗапрос); ?
там просто перевод в {"uuid": "dfghdfgg", "date": "dfhdfgh"} или что-то другое?
   big
 
42 - 18.03.20 - 10:41
(31)(41)  Опять не на тот сервис запрос шлёшь!  )))

Я ещё в прошлой ветке на это внимание обращал!!

должно быть auth/cert , а у тебя SimplSignIn
   igel1969
 
43 - 18.03.20 - 10:47
(42) пробовал, тоже пока не смог
   big
 
44 - 18.03.20 - 10:59
(43) Кстати, а в ЧЗ зарегистрированы? А то м.б. там просто не понимают кто к ним стучится?
   igel1969
 
45 - 18.03.20 - 11:03
(44) вот вчера зарегистрировался
   igel1969
 
46 - 18.03.20 - 11:04
кое-что подправил. теперь пишет:
{Форма.Форма.Форма(384)}: Ошибка при вызове метода контекста (ResponseText): Произошла исключительная ситуация (WinHttp.WinHttpRequest): Данные, необходимые для завершения этой операции еще не доступны.
   big
 
47 - 18.03.20 - 11:06
(46) Попробуй отправлять запрос через curl с параметром v - там можно увидеть какие ошибки вылазят.
   igel1969
 
48 - 18.03.20 - 11:11
(47) Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Users\admin>d:

D:\>cd 111

D:\111>curl.exe -X POST int01.gismt.crpt.tech/api/v3/auth/cert -H "content-type:
 application/json;charset=UTF-8" --data "{"uuid": "71e8c0eb-8eaf-4195-b1bd-37379
a3f02c9","data": "MIIWKwYJKoZIhvcNAQcCoIIWHDCCFhgCAQExDjAMBggqhQMHAQECAgUAMAsGCS
qGSIb3DQEHAaCCEZ0wggfPMIIHfKADAgECAgsAmS9RJwAAAAAC7DAKBggqhQMHAQEDAjCCASQxHjAcBg
kqhkiG9w0BCQEWD2RpdEBtaW5zdnlhei5ydTELMAkGA1UEBhMCUlUxGDAWBgNVBAgMDzc3INCc0L7Rgd
C60LLQsDEZMBcGA1UEBwwQ0LMuINCc0L7RgdC60LLQsDEuMCwGA1UECQwl0YPQu9C40YbQsCDQotCy0L
XRgNGB0LrQsNGPLCDQtNC+0LwgNzEsMCoGA1UECgwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoNC+0Y
HRgdC40LgxGDAWBgUqhQNkARINMTA0NzcwMjAyNjcwMTEaMBgGCCqFAwOBAwEBEgwwMDc3MTA0NzQzNz
UxLDAqBgNVBAMMI9Cc0LjQvdC60L7QvNGB0LLRj9C30Ywg0KDQvtGB0YHQuNC4MB4XDTE5MTAwMjEwMz
c1OFoXDTM0MTAwMjEwMzc1OFowggF6MSAwHgYJKoZIhvcNAQkBFhF1Y0BzZWNyZXQtbmV0Lm5ldDEYMB
YGBSqFA2QBEg0xMTAyMjI1MDExMDIwMRowGAYIKoUDA4EDAQESDDAwMjIyNTExMzA5MjELMAkGA1UEBh
MCUlUxJzAlBgNVBAgMHjIyINCQ0LvRgtCw0LnRgdC60LjQuSDQutGA0LDQuTEXMBUGA1UEBwwO0JHQsN
GA0L3QsNGD0LsxUTBPBgNVBAkMSNC/0YDQvtGB0L/QtdC60YIg0KHRgtGA0L7QuNGC0LXQu9C10LksIN
C00L7QvCAxMTcsINC/0L7QvNC10YnQtdC90LjQtSA2MDEwMC4GA1UECwwn0KPQtNC+0YHRgtC+0LLQtd
GA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMSUwIwYDVQQKDBzQntCe0J4gItCm0JjQkS3QodC10YDQstC40Y
EiMSUwIwYDVQQDDBzQntCe0J4gItCm0JjQkS3QodC10YDQstC40YEiMGYwHwYIKoUDBwEBAQEwEwYHKo
UDAgIjAQYIKoUDBwEBAgIDQwAEQMeCHyPOMgYpCckYLi46EqL/hB1axhdQHWU3QXocOtn0OQGrZVk2Hn
kWxkwi2IJYu8I3RS3ebRfLSRf80rFfzaKjggQsMIIEKDALBgNVHQ8EBAMCAYYwHQYDVR0OBBYEFPmf1b
B+wUz+7lXnaKmFGLiBvddnMBQGCSsGAQQBgjcUAgQHDAVTdWJDQTASBgNVHRMBAf8ECDAGAQH/AgEAMC
UGA1UdIAQeMBwwBgYEVR0gADAIBgYqhQNkcQEwCAYGKoUDZHECMFQGBSqFA2RvBEsMSSLQmtGA0LjQv9
GC0L7Qn9GA0L4gQ1NQIiAo0LLQtdGA0YHQuNGPIDQuMCkgKNC40YHQv9C+0LvQvdC10L3QuNC1IDItQm
FzZSkwEgYJKwYBBAGCNxUBBAUCAwEAATCCAWUGA1UdIwSCAVwwggFYgBTCVPG0a9RMt+BtNrQjkPH+wz
ybBqGCASykggEoMIIBJDEeMBwGCSqGSIb3DQEJARYPZGl0QG1pbnN2eWF6LnJ1MQswCQYDVQQGEwJSVT
EYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYDVQQHDBDQsy4g0JzQvtGB0LrQstCwMS4wLAYDVQ
QJDCXRg9C70LjRhtCwINCi0LLQtdGA0YHQutCw0Y8sINC00L7QvCA3MSwwKgYDVQQKDCPQnNC40L3Qut
C+0LzRgdCy0Y/Qt9GMINCg0L7RgdGB0LjQuDEYMBYGBSqFA2QBEg0xMDQ3NzAyMDI2NzAxMRowGAYIKo
UDA4EDAQESDDAwNzcxMDQ3NDM3NTEsMCoGA1UEAwwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoNC+0Y
HRgdC40LiCEE5tR4sm8n1lf3aOAlzj05MwgZgGA1UdHwSBkDCBjTAtoCugKYYnaHR0cDovL3JlZXN0ci
1wa2kucnUvY2RwL2d1Y19nb3N0MTIuY3JsMC2gK6AphidodHRwOi8vY29tcGFueS5ydC5ydS9jZHAvZ3
VjX2dvc3QxMi5jcmwwLaAroCmGJ2h0dHA6Ly9yb3N0ZWxlY29tLnJ1L2NkcC9ndWNfZ29zdDEyLmNybD
BDBggrBgEFBQcBAQQ3MDUwMwYIKwYBBQUHMAKGJ2h0dHA6Ly9yZWVzdHItcGtpLnJ1L2NkcC9ndWNfZ2
9zdDEyLmNydDCB9QYFKoUDZHAEgeswgegMNNCf0JDQmtCcIMKr0JrRgNC40L/RgtC+0J/RgNC+IEhTTc
K7INCy0LXRgNGB0LjQuCAyLjAMQ9Cf0JDQmiDCq9CT0L7Qu9C+0LLQvdC+0Lkg0YPQtNC+0YHRgtC+0L
LQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAwrsMNdCX0LDQutC70Y7Rh9C10L3QuNC1IOKEliAxNDkvMy
8yLzIvMjMg0L7RgiAwMi4wMy4yMDE4DDTQl9Cw0LrQu9GO0YfQtdC90LjQtSDihJYgMTQ5LzcvNi8xMD
Ug0L7RgiAyNy4wNi4yMDE4MAoGCCqFAwcBAQMCA0EAaGjWDl7JZCpMI0Cjx6cR0l0MrrQ+EERYil6UL4
Wpl+v2S8AT+3/jU6mDDiglUBWAOE7N7c0hDeXsnu4nqTkQ1jCCCcYwgglzoAMCAQICEQErH+EALas6mU
gjadWlHATlMAoGCCqFAwcBAQMCMIIBejEgMB4GCSqGSIb3DQEJARYRdWNAc2VjcmV0LW5ldC5uZXQxGD
AWBgUqhQNkARINMTEwMjIyNTAxMTAyMDEaMBgGCCqFAwOBAwEBEgwwMDIyMjUxMTMwOTIxCzAJBgNVBA
YTAlJVMScwJQYDVQQIDB4yMiDQkNC70YLQsNC50YHQutC40Lkg0LrRgNCw0LkxFzAVBgNVBAcMDtCR0L
DRgNC90LDRg9C7MVEwTwYDVQQJDEjQv9GA0L7RgdC/0LXQutGCINCh0YLRgNC+0LjRgtC10LvQtdC5LC
DQtNC+0LwgMTE3LCDQv9C+0LzQtdGJ0LXQvdC40LUgNjAxMDAuBgNVBAsMJ9Cj0LTQvtGB0YLQvtCy0L
XRgNGP0Y7RidC40Lkg0YbQtdC90YLRgDElMCMGA1UECgwc0J7QntCeICLQptCY0JEt0KHQtdGA0LLQuN
GBIjElMCMGA1UEAwwc0J7QntCeICLQptCY0JEt0KHQtdGA0LLQuNGBIjAeFw0xOTEyMjQxMzI5MzlaFw
0yMTAzMjQxMzI5MzlaMIIB8jEYMBYGCCqFAwOBDQEBEgoxNjA2NjE1NDEwMTAwLgYJKoZIhvcNAQkCDC
ExNjYxMDM0ODY4LTEyMTUwMTAwMS0wMDMxNjQzNzQ2MzMxJTAjBgkqhkiG9w0BCQEWFnZlcm9uaWthMj
AwNjc4QG1haWwucnUxGjAYBggqhQMDgQMBARIMMDAxNjYxMDM0ODY4MRYwFAYFKoUDZAMSCzAzMTY0Mz
c0NjMzMRgwFgYFKoUDZAESDTExMjE2OTAwODY4MjUxGTAXBgNVBAwMENCU0LjRgNC10LrRgtC+0YAxHj
AcBgNVBAoMFdCe0J7QniAi0JDQm9Cs0K/QndChIjEyMDAGA1UECQwp0KPQmyDQn9Cj0KjQmtCY0J3QkC
wg0JTQntCcIDMwLCDQn9Ce0JwgMTQxHDAaBgNVBAcME9CZ0L7RiNC60LDRgC3QntC70LAxMDAuBgNVBA
gMJzEyINCg0LXRgdC/0YPQsdC70LjQutCwINCc0LDRgNC40Lkg0K3QuzELMAkGA1UEBhMCUlUxKjAoBg
NVBCoMIdCS0LvQsNC00LjQvNC40YAg0JjQstCw0L3QvtCy0LjRhzEXMBUGA1UEBAwO0JzQsNGI0LDQvd
C40L0xHjAcBgNVBAMMFdCe0J7QniAi0JDQm9Cs0K/QndChIjBmMB8GCCqFAwcBAQEBMBMGByqFAwICJA
AGCCqFAwcBAQICA0MABEBYmBAKPpLuQvLp1BsvO5erVQbccvI9+iGifZMadMrw63o9pWFQbR6/n53bNf
jEpbQ/8VTaTmDmxvd92I0gt0hpo4IFTzCCBUswDgYDVR0PAQH/BAQDAgTwMD8GA1UdEQQ4MDaBFnZlcm
9uaWthMjAwNjc4QG1haWwucnWkHDAaMRgwFgYIKoUDA4ENAQESCjE2MDY2MTU0MTAwEwYDVR0gBAwwCj
AIBgYqhQNkcQEwSgYDVR0lBEMwQQYIKwYBBQUHAwIGByqFAwICIgYGCCsGAQUFBwMEBgcqhQMDB4N0Bg
cqhQMDBwgBBggqhQMDBwEBAQYGKoUDAwcBMIGKBggrBgEFBQcBAQR+MHwwPAYIKwYBBQUHMAKGMGh0dH
A6Ly9jaWItc2VydmljZS5ydS9maWxlcy9jaWItc2VydmljZS0yMDE5LmNydDA8BggrBgEFBQcwAoYwaH
R0cDovL3NlY3JldC1uZXQubmV0L2ZpbGVzL2NpYi1zZXJ2aWNlLTIwMTkuY3J0MCsGA1UdEAQkMCKADz
IwMTkxMjI0MTMyOTM4WoEPMjAyMTAzMjQxMzI5MzhaMIIBMwYFKoUDZHAEggEoMIIBJAwrItCa0YDQuN
C/0YLQvtCf0YDQviBDU1AiICjQstC10YDRgdC40Y8gNC4wKQxTItCj0LTQvtGB0YLQvtCy0LXRgNGP0Y
7RidC40Lkg0YbQtdC90YLRgCAi0JrRgNC40L/RgtC+0J/RgNC+INCj0KYiINCy0LXRgNGB0LjQuCAyLj
AMT9Ch0LXRgNGC0LjRhNC40LrQsNGCINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDihJYg0KHQpC8xMj
QtMzM4MCDQvtGCIDExLjA1LjIwMTgMT9Ch0LXRgNGC0LjRhNC40LrQsNGCINGB0L7QvtGC0LLQtdGC0Y
HRgtCy0LjRjyDihJYg0KHQpC8xMjgtMzU5MiDQvtGCIDE3LjEwLjIwMTgwIwYFKoUDZG8EGgwYItCa0Y
DQuNC/0YLQvtCf0YDQviBDU1AiMHkGA1UdHwRyMHAwNqA0oDKGMGh0dHA6Ly9jaWItc2VydmljZS5ydS
9maWxlcy9jaWItc2VydmljZS0yMDE5LmNybDA2oDSgMoYwaHR0cDovL3NlY3JldC1uZXQubmV0L2ZpbG
VzL2NpYi1zZXJ2aWNlLTIwMTkuY3JsMIGCBgcqhQMCAjECBHcwdTBlFkBodHRwczovL2NhLmtvbnR1ci
5ydS9hYm91dC9kb2N1bWVudHMvY3J5cHRvcHJvLWxpY2Vuc2UtcXVhbGlmaWVkDB3QodCa0JEg0JrQvt
C90YLRg9GAINC4INCU0JfQngMCBeAEDEXBtDNdLNgECHMe3DCCAWAGA1UdIwSCAVcwggFTgBT5n9Wwfs
FM/u5V52iphRi4gb3XZ6GCASykggEoMIIBJDEeMBwGCSqGSIb3DQEJARYPZGl0QG1pbnN2eWF6LnJ1MQ
swCQYDVQQGEwJSVTEYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYDVQQHDBDQsy4g0JzQvtGB0L
rQstCwMS4wLAYDVQQJDCXRg9C70LjRhtCwINCi0LLQtdGA0YHQutCw0Y8sINC00L7QvCA3MSwwKgYDVQ
QKDCPQnNC40L3QutC+0LzRgdCy0Y/Qt9GMINCg0L7RgdGB0LjQuDEYMBYGBSqFA2QBEg0xMDQ3NzAyMD
I2NzAxMRowGAYIKoUDA4EDAQESDDAwNzcxMDQ3NDM3NTEsMCoGA1UEAwwj0JzQuNC90LrQvtC80YHQst
GP0LfRjCDQoNC+0YHRgdC40LiCCwCZL1EnAAAAAALsMB0GA1UdDgQWBBSYBtRn1I8J5V2ODFMBFUxrUd
yIvzAKBggqhQMHAQEDAgNBAOzE7bK5+cqKH9wvCMZuJ9yZdkS4WFPKRxGQznig9uam0gFCLD2PXIFx/Q
DvpQ6GPoyJGdgiIBOVVEeY1XqFJu8xggRTMIIETwIBATCCAZEwggF6MSAwHgYJKoZIhvcNAQkBFhF1Y0
BzZWNyZXQtbmV0Lm5ldDEYMBYGBSqFA2QBEg0xMTAyMjI1MDExMDIwMRowGAYIKoUDA4EDAQESDDAwMj
IyNTExMzA5MjELMAkGA1UEBhMCUlUxJzAlBgNVBAgMHjIyINCQ0LvRgtCw0LnRgdC60LjQuSDQutGA0L
DQuTEXMBUGA1UEBwwO0JHQsNGA0L3QsNGD0LsxUTBPBgNVBAkMSNC/0YDQvtGB0L/QtdC60YIg0KHRgt
GA0L7QuNGC0LXQu9C10LksINC00L7QvCAxMTcsINC/0L7QvNC10YnQtdC90LjQtSA2MDEwMC4GA1UECw
wn0KPQtNC+0YHRgtC+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMSUwIwYDVQQKDBzQntCe0J4gIt
Cm0JjQkS3QodC10YDQstC40YEiMSUwIwYDVQQDDBzQntCe0J4gItCm0JjQkS3QodC10YDQstC40YEiAh
EBKx/hAC2rOplII2nVpRwE5TAMBggqhQMHAQECAgUAoIICVTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQ
cBMBwGCSqGSIb3DQEJBTEPFw0yMDAzMTgwODAzNDRaMC8GCSqGSIb3DQEJBDEiBCB0V9JA8JAnEbgbok
67AMCYgTJxiGvxC1seu+xIZve4UjCCAegGCyqGSIb3DQEJEAIvMYIB1zCCAdMwggHPMIIByzAKBggqhQ
MHAQECAgQgbvs2sSgOSuXjWego1rbNpyGK2bWi7ri0TEvEQZfcv2YwggGZMIIBgqSCAX4wggF6MSAwHg
YJKoZIhvcNAQkBFhF1Y0BzZWNyZXQtbmV0Lm5ldDEYMBYGBSqFA2QBEg0xMTAyMjI1MDExMDIwMRowGA
YIKoUDA4EDAQESDDAwMjIyNTExMzA5MjELMAkGA1UEBhMCUlUxJzAlBgNVBAgMHjIyINCQ0LvRgtCw0L
nRgdC60LjQuSDQutGA0LDQuTEXMBUGA1UEBwwO0JHQsNGA0L3QsNGD0LsxUTBPBgNVBAkMSNC/0YDQvt
GB0L/QtdC60YIg0KHRgtGA0L7QuNGC0LXQu9C10LksINC00L7QvCAxMTcsINC/0L7QvNC10YnQtdC90L
jQtSA2MDEwMC4GA1UECwwn0KPQtNC+0YHRgtC+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMSUwIw
YDVQQKDBzQntCe0J4gItCm0JjQkS3QodC10YDQstC40YEiMSUwIwYDVQQDDBzQntCe0J4gItCm0JjQkS
3QodC10YDQstC40YEiAhEBKx/hAC2rOplII2nVpRwE5TAMBggqhQMHAQEBAQUABEDa3SziDTXF598f2D
07rwLAmqveC0tGrH0Az+yGL7vr057gSr9ZLpcp8mGo/k6j+eyAx/TqyuiPK2IED3ZplDlB"}" -v -k
--output D:\111\out.txt
Note: Unnecessary use of -X or --request, POST is already inferred.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*
  Trying 23.105.245.14:80...
* Connected to int01.gismt.crpt.tech (23.105.245.14) port 80 (#0)
> POST /api/v3/auth/cert HTTP/1.1
> Host: int01.gismt.crpt.tech
> User-Agent: curl/7.69.1
> Accept: */*
> content-type: application/json;charset=UTF-8
> Content-Length: 7623
>
} [7623 bytes data]
* upload completely sent off: 7623 out of 7623 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 307 Temporary Redirect
< Server: nginx
< Date: Wed, 18 Mar 2020 08:08:42 GMT
< Content-Type: text/html
< Content-Length: 180
< Connection: keep-alive
< Location: https://int01.gismt.crpt.tech/api/v3/auth/cert
<
{ [180 bytes data]
100  7803  100   180  100  7623    720  30492 --:--:-- --:--:-- --:--:-- 31337
* Connection #0 to host int01.gismt.crpt.tech left intact

D:\111>
в файле out.txt пишет:
<html>
<head><title>307 Temporary Redirect</title></head>
<body bgcolor="white">
<center><h1>307 Temporary Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>
   igel1969
 
49 - 18.03.20 - 11:12
ой, адрес не тот, сейчас исправлю
   igel1969
 
50 - 18.03.20 - 11:16
Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Users\admin>вЖ
"вЖ" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\Users\admin>d:

D:\>cd 111

D:\111>curl.exe -X POST https://ismotp.crptech.ru/api/v3/auth/cert -H "content-t
ype: application/json;charset=UTF-8" --data "{"uuid": "71e8c0eb-8eaf-4195-b1bd-3
7379a3f02c9","data": "MIIWKwYJKoZIhvcNAQcCoIIWHDCCFhgCAQExDjAMBggqhQMHAQECAgUAMA
sGCSqGSIb3DQEHAaCCEZ0wggfPMIIHfKADAgECAgsAmS9RJwAAAAAC7DAKBggqhQMHAQEDAjCCASQxHj
AcBgkqhkiG9w0BCQEWD2RpdEBtaW5zdnlhei5ydTELMAkGA1UEBhMCUlUxGDAWBgNVBAgMDzc3INCc0L
7RgdC60LLQsDEZMBcGA1UEBwwQ0LMuINCc0L7RgdC60LLQsDEuMCwGA1UECQwl0YPQu9C40YbQsCDQot
Cy0LXRgNGB0LrQsNGPLCDQtNC+0LwgNzEsMCoGA1UECgwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoN
C+0YHRgdC40LgxGDAWBgUqhQNkARINMTA0NzcwMjAyNjcwMTEaMBgGCCqFAwOBAwEBEgwwMDc3MTA0Nz
QzNzUxLDAqBgNVBAMMI9Cc0LjQvdC60L7QvNGB0LLRj9C30Ywg0KDQvtGB0YHQuNC4MB4XDTE5MTAwMj
EwMzc1OFoXDTM0MTAwMjEwMzc1OFowggF6MSAwHgYJKoZIhvcNAQkBFhF1Y0BzZWNyZXQtbmV0Lm5ldD
EYMBYGBSqFA2QBEg0xMTAyMjI1MDExMDIwMRowGAYIKoUDA4EDAQESDDAwMjIyNTExMzA5MjELMAkGA1
UEBhMCUlUxJzAlBgNVBAgMHjIyINCQ0LvRgtCw0LnRgdC60LjQuSDQutGA0LDQuTEXMBUGA1UEBwwO0J
HQsNGA0L3QsNGD0LsxUTBPBgNVBAkMSNC/0YDQvtGB0L/QtdC60YIg0KHRgtGA0L7QuNGC0LXQu9C10L
ksINC00L7QvCAxMTcsINC/0L7QvNC10YnQtdC90LjQtSA2MDEwMC4GA1UECwwn0KPQtNC+0YHRgtC+0L
LQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMSUwIwYDVQQKDBzQntCe0J4gItCm0JjQkS3QodC10YDQst
C40YEiMSUwIwYDVQQDDBzQntCe0J4gItCm0JjQkS3QodC10YDQstC40YEiMGYwHwYIKoUDBwEBAQEwEw
YHKoUDAgIjAQYIKoUDBwEBAgIDQwAEQMeCHyPOMgYpCckYLi46EqL/hB1axhdQHWU3QXocOtn0OQGrZV
k2HnkWxkwi2IJYu8I3RS3ebRfLSRf80rFfzaKjggQsMIIEKDALBgNVHQ8EBAMCAYYwHQYDVR0OBBYEFP
mf1bB+wUz+7lXnaKmFGLiBvddnMBQGCSsGAQQBgjcUAgQHDAVTdWJDQTASBgNVHRMBAf8ECDAGAQH/Ag
EAMCUGA1UdIAQeMBwwBgYEVR0gADAIBgYqhQNkcQEwCAYGKoUDZHECMFQGBSqFA2RvBEsMSSLQmtGA0L
jQv9GC0L7Qn9GA0L4gQ1NQIiAo0LLQtdGA0YHQuNGPIDQuMCkgKNC40YHQv9C+0LvQvdC10L3QuNC1ID
ItQmFzZSkwEgYJKwYBBAGCNxUBBAUCAwEAATCCAWUGA1UdIwSCAVwwggFYgBTCVPG0a9RMt+BtNrQjkP
H+wzybBqGCASykggEoMIIBJDEeMBwGCSqGSIb3DQEJARYPZGl0QG1pbnN2eWF6LnJ1MQswCQYDVQQGEw
JSVTEYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYDVQQHDBDQsy4g0JzQvtGB0LrQstCwMS4wLA
YDVQQJDCXRg9C70LjRhtCwINCi0LLQtdGA0YHQutCw0Y8sINC00L7QvCA3MSwwKgYDVQQKDCPQnNC40L
3QutC+0LzRgdCy0Y/Qt9GMINCg0L7RgdGB0LjQuDEYMBYGBSqFA2QBEg0xMDQ3NzAyMDI2NzAxMRowGA
YIKoUDA4EDAQESDDAwNzcxMDQ3NDM3NTEsMCoGA1UEAwwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoN
C+0YHRgdC40LiCEE5tR4sm8n1lf3aOAlzj05MwgZgGA1UdHwSBkDCBjTAtoCugKYYnaHR0cDovL3JlZX
N0ci1wa2kucnUvY2RwL2d1Y19nb3N0MTIuY3JsMC2gK6AphidodHRwOi8vY29tcGFueS5ydC5ydS9jZH
AvZ3VjX2dvc3QxMi5jcmwwLaAroCmGJ2h0dHA6Ly9yb3N0ZWxlY29tLnJ1L2NkcC9ndWNfZ29zdDEyLm
NybDBDBggrBgEFBQcBAQQ3MDUwMwYIKwYBBQUHMAKGJ2h0dHA6Ly9yZWVzdHItcGtpLnJ1L2NkcC9ndW
NfZ29zdDEyLmNydDCB9QYFKoUDZHAEgeswgegMNNCf0JDQmtCcIMKr0JrRgNC40L/RgtC+0J/RgNC+IE
hTTcK7INCy0LXRgNGB0LjQuCAyLjAMQ9Cf0JDQmiDCq9CT0L7Qu9C+0LLQvdC+0Lkg0YPQtNC+0YHRgt
C+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAwrsMNdCX0LDQutC70Y7Rh9C10L3QuNC1IOKEliAxND
kvMy8yLzIvMjMg0L7RgiAwMi4wMy4yMDE4DDTQl9Cw0LrQu9GO0YfQtdC90LjQtSDihJYgMTQ5LzcvNi
8xMDUg0L7RgiAyNy4wNi4yMDE4MAoGCCqFAwcBAQMCA0EAaGjWDl7JZCpMI0Cjx6cR0l0MrrQ+EERYil
6UL4Wpl+v2S8AT+3/jU6mDDiglUBWAOE7N7c0hDeXsnu4nqTkQ1jCCCcYwgglzoAMCAQICEQErH+EALa
s6mUgjadWlHATlMAoGCCqFAwcBAQMCMIIBejEgMB4GCSqGSIb3DQEJARYRdWNAc2VjcmV0LW5ldC5uZX
QxGDAWBgUqhQNkARINMTEwMjIyNTAxMTAyMDEaMBgGCCqFAwOBAwEBEgwwMDIyMjUxMTMwOTIxCzAJBg
NVBAYTAlJVMScwJQYDVQQIDB4yMiDQkNC70YLQsNC50YHQutC40Lkg0LrRgNCw0LkxFzAVBgNVBAcMDt
CR0LDRgNC90LDRg9C7MVEwTwYDVQQJDEjQv9GA0L7RgdC/0LXQutGCINCh0YLRgNC+0LjRgtC10LvQtd
C5LCDQtNC+0LwgMTE3LCDQv9C+0LzQtdGJ0LXQvdC40LUgNjAxMDAuBgNVBAsMJ9Cj0LTQvtGB0YLQvt
Cy0LXRgNGP0Y7RidC40Lkg0YbQtdC90YLRgDElMCMGA1UECgwc0J7QntCeICLQptCY0JEt0KHQtdGA0L
LQuNGBIjElMCMGA1UEAwwc0J7QntCeICLQptCY0JEt0KHQtdGA0LLQuNGBIjAeFw0xOTEyMjQxMzI5Mz
laFw0yMTAzMjQxMzI5MzlaMIIB8jEYMBYGCCqFAwOBDQEBEgoxNjA2NjE1NDEwMTAwLgYJKoZIhvcNAQ
kCDCExNjYxMDM0ODY4LTEyMTUwMTAwMS0wMDMxNjQzNzQ2MzMxJTAjBgkqhkiG9w0BCQEWFnZlcm9uaW
thMjAwNjc4QG1haWwucnUxGjAYBggqhQMDgQMBARIMMDAxNjYxMDM0ODY4MRYwFAYFKoUDZAMSCzAzMT
Y0Mzc0NjMzMRgwFgYFKoUDZAESDTExMjE2OTAwODY4MjUxGTAXBgNVBAwMENCU0LjRgNC10LrRgtC+0Y
AxHjAcBgNVBAoMFdCe0J7QniAi0JDQm9Cs0K/QndChIjEyMDAGA1UECQwp0KPQmyDQn9Cj0KjQmtCY0J
3QkCwg0JTQntCcIDMwLCDQn9Ce0JwgMTQxHDAaBgNVBAcME9CZ0L7RiNC60LDRgC3QntC70LAxMDAuBg
NVBAgMJzEyINCg0LXRgdC/0YPQsdC70LjQutCwINCc0LDRgNC40Lkg0K3QuzELMAkGA1UEBhMCUlUxKj
AoBgNVBCoMIdCS0LvQsNC00LjQvNC40YAg0JjQstCw0L3QvtCy0LjRhzEXMBUGA1UEBAwO0JzQsNGI0L
DQvdC40L0xHjAcBgNVBAMMFdCe0J7QniAi0JDQm9Cs0K/QndChIjBmMB8GCCqFAwcBAQEBMBMGByqFAw
ICJAAGCCqFAwcBAQICA0MABEBYmBAKPpLuQvLp1BsvO5erVQbccvI9+iGifZMadMrw63o9pWFQbR6/n5
3bNfjEpbQ/8VTaTmDmxvd92I0gt0hpo4IFTzCCBUswDgYDVR0PAQH/BAQDAgTwMD8GA1UdEQQ4MDaBFn
Zlcm9uaWthMjAwNjc4QG1haWwucnWkHDAaMRgwFgYIKoUDA4ENAQESCjE2MDY2MTU0MTAwEwYDVR0gBA
wwCjAIBgYqhQNkcQEwSgYDVR0lBEMwQQYIKwYBBQUHAwIGByqFAwICIgYGCCsGAQUFBwMEBgcqhQMDB4
N0BgcqhQMDBwgBBggqhQMDBwEBAQYGKoUDAwcBMIGKBggrBgEFBQcBAQR+MHwwPAYIKwYBBQUHMAKGMG
h0dHA6Ly9jaWItc2VydmljZS5ydS9maWxlcy9jaWItc2VydmljZS0yMDE5LmNydDA8BggrBgEFBQcwAo
YwaHR0cDovL3NlY3JldC1uZXQubmV0L2ZpbGVzL2NpYi1zZXJ2aWNlLTIwMTkuY3J0MCsGA1UdEAQkMC
KADzIwMTkxMjI0MTMyOTM4WoEPMjAyMTAzMjQxMzI5MzhaMIIBMwYFKoUDZHAEggEoMIIBJAwrItCa0Y
DQuNC/0YLQvtCf0YDQviBDU1AiICjQstC10YDRgdC40Y8gNC4wKQxTItCj0LTQvtGB0YLQvtCy0LXRgN
GP0Y7RidC40Lkg0YbQtdC90YLRgCAi0JrRgNC40L/RgtC+0J/RgNC+INCj0KYiINCy0LXRgNGB0LjQuC
AyLjAMT9Ch0LXRgNGC0LjRhNC40LrQsNGCINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDihJYg0KHQpC
8xMjQtMzM4MCDQvtGCIDExLjA1LjIwMTgMT9Ch0LXRgNGC0LjRhNC40LrQsNGCINGB0L7QvtGC0LLQtd
GC0YHRgtCy0LjRjyDihJYg0KHQpC8xMjgtMzU5MiDQvtGCIDE3LjEwLjIwMTgwIwYFKoUDZG8EGgwYIt
Ca0YDQuNC/0YLQvtCf0YDQviBDU1AiMHkGA1UdHwRyMHAwNqA0oDKGMGh0dHA6Ly9jaWItc2VydmljZS
5ydS9maWxlcy9jaWItc2VydmljZS0yMDE5LmNybDA2oDSgMoYwaHR0cDovL3NlY3JldC1uZXQubmV0L2
ZpbGVzL2NpYi1zZXJ2aWNlLTIwMTkuY3JsMIGCBgcqhQMCAjECBHcwdTBlFkBodHRwczovL2NhLmtvbn
R1ci5ydS9hYm91dC9kb2N1bWVudHMvY3J5cHRvcHJvLWxpY2Vuc2UtcXVhbGlmaWVkDB3QodCa0JEg0J
rQvtC90YLRg9GAINC4INCU0JfQngMCBeAEDEXBtDNdLNgECHMe3DCCAWAGA1UdIwSCAVcwggFTgBT5n9
WwfsFM/u5V52iphRi4gb3XZ6GCASykggEoMIIBJDEeMBwGCSqGSIb3DQEJARYPZGl0QG1pbnN2eWF6Ln
J1MQswCQYDVQQGEwJSVTEYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYDVQQHDBDQsy4g0JzQvt
GB0LrQstCwMS4wLAYDVQQJDCXRg9C70LjRhtCwINCi0LLQtdGA0YHQutCw0Y8sINC00L7QvCA3MSwwKg
YDVQQKDCPQnNC40L3QutC+0LzRgdCy0Y/Qt9GMINCg0L7RgdGB0LjQuDEYMBYGBSqFA2QBEg0xMDQ3Nz
AyMDI2NzAxMRowGAYIKoUDA4EDAQESDDAwNzcxMDQ3NDM3NTEsMCoGA1UEAwwj0JzQuNC90LrQvtC80Y
HQstGP0LfRjCDQoNC+0YHRgdC40LiCCwCZL1EnAAAAAALsMB0GA1UdDgQWBBSYBtRn1I8J5V2ODFMBFU
xrUdyIvzAKBggqhQMHAQEDAgNBAOzE7bK5+cqKH9wvCMZuJ9yZdkS4WFPKRxGQznig9uam0gFCLD2PXI
Fx/QDvpQ6GPoyJGdgiIBOVVEeY1XqFJu8xggRTMIIETwIBATCCAZEwggF6MSAwHgYJKoZIhvcNAQkBFh
F1Y0BzZWNyZXQtbmV0Lm5ldDEYMBYGBSqFA2QBEg0xMTAyMjI1MDExMDIwMRowGAYIKoUDA4EDAQESDD
AwMjIyNTExMzA5MjELMAkGA1UEBhMCUlUxJzAlBgNVBAgMHjIyINCQ0LvRgtCw0LnRgdC60LjQuSDQut
GA0LDQuTEXMBUGA1UEBwwO0JHQsNGA0L3QsNGD0LsxUTBPBgNVBAkMSNC/0YDQvtGB0L/QtdC60YIg0K
HRgtGA0L7QuNGC0LXQu9C10LksINC00L7QvCAxMTcsINC/0L7QvNC10YnQtdC90LjQtSA2MDEwMC4GA1
UECwwn0KPQtNC+0YHRgtC+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMSUwIwYDVQQKDBzQntCe0J
4gItCm0JjQkS3QodC10YDQstC40YEiMSUwIwYDVQQDDBzQntCe0J4gItCm0JjQkS3QodC10YDQstC40Y
EiAhEBKx/hAC2rOplII2nVpRwE5TAMBggqhQMHAQECAgUAoIICVTAYBgkqhkiG9w0BCQMxCwYJKoZIhv
cNAQcBMBwGCSqGSIb3DQEJBTEPFw0yMDAzMTgwODAzNDRaMC8GCSqGSIb3DQEJBDEiBCB0V9JA8JAnEb
gbok67AMCYgTJxiGvxC1seu+xIZve4UjCCAegGCyqGSIb3DQEJEAIvMYIB1zCCAdMwggHPMIIByzAKBg
gqhQMHAQECAgQgbvs2sSgOSuXjWego1rbNpyGK2bWi7ri0TEvEQZfcv2YwggGZMIIBgqSCAX4wggF6MS
AwHgYJKoZIhvcNAQkBFhF1Y0BzZWNyZXQtbmV0Lm5ldDEYMBYGBSqFA2QBEg0xMTAyMjI1MDExMDIwMR
owGAYIKoUDA4EDAQESDDAwMjIyNTExMzA5MjELMAkGA1UEBhMCUlUxJzAlBgNVBAgMHjIyINCQ0LvRgt
Cw0LnRgdC60LjQuSDQutGA0LDQuTEXMBUGA1UEBwwO0JHQsNGA0L3QsNGD0LsxUTBPBgNVBAkMSNC/0Y
DQvtGB0L/QtdC60YIg0KHRgtGA0L7QuNGC0LXQu9C10LksINC00L7QvCAxMTcsINC/0L7QvNC10YnQtd
C90LjQtSA2MDEwMC4GA1UECwwn0KPQtNC+0YHRgtC+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMS
UwIwYDVQQKDBzQntCe0J4gItCm0JjQkS3QodC10YDQstC40YEiMSUwIwYDVQQDDBzQntCe0J4gItCm0J
jQkS3QodC10YDQstC40YEiAhEBKx/hAC2rOplII2nVpRwE5TAMBggqhQMHAQEBAQUABEDa3SziDTXF59
8f2D07rwLAmqveC0tGrH0Az+yGL7vr057gSr9ZLpcp8mGo/k6j+eyAx/TqyuiPK2IED3ZplDlB"}" -v
-k --output D:\111\out.txt
Note: Unnecessary use of -X or --request, POST is already inferred.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*
  Trying 78.142.221.76:443...
* Connected to ismotp.crptech.ru (78.142.221.76) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*
TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [70 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [1761 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [300 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [37 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=ismotp.crptech.ru
*  start date: Mar 19 08:10:31 2019 GMT
*  expire date: Mar 18 08:10:31 2021 GMT
*  issuer: O=AO Kaspersky Lab; CN=Kaspersky Endpoint Security Personal Root Cert
ificate
*  SSL certificate verify result: self signed certificate in certificate chain (
19), continuing anyway.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0

} [5 bytes data]
* Using Stream ID: 1 (easy handle 0x4e4790)
} [5 bytes data]
> POST /api/v3/auth/cert HTTP/2
> Host: ismotp.crptech.ru
> user-agent: curl/7.69.1
> accept: */*
> content-type: application/json;charset=UTF-8
> content-length: 7623
>
{ [5 bytes data]
* Connection state changed (MAX_CONCURRENT_STREAMS == 4294967295)!
} [5 bytes data]
* We are completely uploaded and fine
{ [5 bytes data]
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
} [5 bytes data]
< HTTP/2 401
< server: nginx
< date: Wed, 18 Mar 2020 08:13:18 GMT
< content-type: application/xml;charset=UTF-8
< cache-control: no-store
< pragma: no-cache
< www-authenticate: Bearer realm="null", error="unauthorized", error_description
="Full authentication is required to access this resource"
<
{ [5 bytes data]
100  7791    0   168  100  7623    388  17645 --:--:-- --:--:-- --:--:-- 17993
* Connection #0 to host ismotp.crptech.ru left intact

D:\111>

возвращает в файле:
<UnauthorizedException><error>unauthorized</error><error_description>Full authentication is required to access this resource</error_description></UnauthorizedException>

Может действительно что-то не так с регистрацией.
я зарегистрировался в:
https://markirovka.crpt.ru/dashboard
и в
https://markirovka.int01.gismt.crpt.tech/dashboard
но во втором случае не дает договор для подписи
   big
 
51 - 18.03.20 - 11:25
Если у вас табак, то всё-таки адрес для авторизации будет /auth/simpleSignIn. Адрес auth/cert  это для молока, как у меня.
   igel1969
 
52 - 18.03.20 - 11:31
(51) да, у нас табак. а что - молоко тоже маркируют???????????????????????? и что - продавцы на кассе QR-код считывают сканером????
   big
 
53 - 18.03.20 - 11:34
(52) Нет, ещё не маркируют и ничего не считывают, но мы свой паровоз уже строить начали по-тихоньку ))
   igel1969
 
54 - 18.03.20 - 12:00
(22) все таки для получения токена Вы используете
https://ismotp.crptech.ru/api/v3/auth/cert/key
или
https://ismotp.crptech.ru/private-office-api/private/v2/";?
   igel1969
 
55 - 18.03.20 - 14:38
Ребята, уже на пороге стою, совсем немного осталось, помогите пожалуйста.
Дело оказалось в подписании.
Когда подписываю с помощью 
Функция ComОбъектСертификатаПоОтпечатку(Отпечаток)
    
    CAPICOM_CURRENT_USER_STORE         = 2;    // 2 - Искать сертификат в ветке "Личное" хранилища.


    CAPICOM_MY_STORE                   = "My"// Указываем, что ветку "Личное" берем из хранилища текущего пользователя


    CAPICOM_STORE_OPEN_READ_ONLY       = 0;    // Открыть хранилище только на чтение


    CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    
    oStore = Новый COMОбъект("CAdESCOM.Store")// Объект описывает хранилище сертификатов


    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY)// Открыть хранилище сертификатов


    
    Certificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, Отпечаток);
    ComОбъект = Certificates.Item(1)// Найденный сертификат (Com-объект)


    
    oStore.Close()// Закрыть хранилище сертификатов и освободить объект


    
    Возврат ComОбъект;
    
КонецФункции

Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint, bDetached)
    
    CADESCOM_BASE64_TO_BINARY = 1// Входные данные пришли в Base64


    
    CADESCOM_CADES_TYPE = 1// Тип усовершенствованной подписи


    //bDetached     = Ложь;


    EncodingType = 0;
    
    oSigner = Новый COMОбъект("CAdESCOM.CPSigner")// Объект, задающий параметры создания и содержащий информацию об усоверш-ной подписи


    oSigner.Certificate = ComОбъектСертификатаПоОтпечатку(sThumbprint);
    
    oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData")// Объект CadesSignedData предоставляет свойства и методы для работы с усоверш-ной подписью.


    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
    oSignedData.Content = Кодировать(ТекстДляПодписи);    
    //Сообщить(oSignedData.Content);

    
    sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType)// Метод добавляет к сообщению усовершенствованную подпись.


    
    Возврат sSignedMessage// Подпись в формате Base64


    
КонецФункции


 то возвращает одно значение, а когда подписываю на сайте

https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html

то значение другое (хотя общие символы и встречаются).
И вот с Date, который я подписал на сайте токен возвращается нормально.
Значит я неправильно подписываю.

Пробовал вернуть к старому варианту
ФайлИн = ПолучитьИмяВременногоФайла();
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(data);
ТекстовыйФайл.Записать(ФайлИн, КодировкаТекста.UTF8);
        //

ФайлАут = ПолучитьИмяВременногоФайла();

Отпечаток = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  (здесь стоит правильный отпечаток)
СтрокаКоманды = """C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe""" + " -sfsign -sign -in "+ ФайлИН + " -out " + ФайлАут + " -my " + Отпечаток + " -base64 -add";
ЗапуститьПриложение(СтрокаКоманды, "C:\Program Files (x86)\Crypto Pro\CSP", Истина);
Ответ = Новый ТекстовыйДокумент();
Ответ.Прочитать(ФайлАут, КодировкаТекста.UTF8);
ТекстОтвета = Ответ.ПолучитьТекст();
ТекстОтвета = СтрЗаменить(ТекстОтвета, Символы.ПС, "");
Сообщить(ТекстОтвета);

Не помогло
   MWWRuza
 
56 - 18.03.20 - 15:17
Я через Capicom подписываю... Да, знаю, что эта технология устаревшая, но, пока работает, когда перестанет, тогда и буду думать о переходе на КадесКом, или как у Вас, на консольную утилиту...
Хотите - могу процедуры/функции подписания выложить...
   igel1969
 
57 - 18.03.20 - 15:48
(56) можно, пожалуйста? уже голова опухла.
а я когда смогу получить агрегатные КМ как и Вы также потом поделюсь с тем кому нужно (я же на 8.2 все делаю)
   igel1969
 
58 - 18.03.20 - 17:14
Ура, я получил токен!!!!!
еще один микрошажок пройден!!!!
теперь получить агрегацию осталось
   MWWRuza
 
59 - 18.03.20 - 19:52
Вот, агрегация:

Перем ПрефиксВерсии;


Процедура Сформировать()
    token         = ПолучитьТокенЦРПТ(ВыбЭЦП, ПрефиксВерсии);
    КодУпаковки    = ЗаменитьСимволы(ОтрезатьЛишнееОтСтрМаркировки(СокрЛП(КодМаркировки)));
    ПечШКУП        = "ШК: " + КодУпаковки;
    Ответ        = глHTPP_ВыполнитьЗапрос("GET", "https://"; + СокрЛП(Константа.АдресСервисаМОТП) + "/private-office-api/private/v2/cis/aggregated?cis=" + КодУпаковки, "", token);
    Если ПустоеЗначение(Ответ) = 0 Тогда
        СзКодов = глРазборJSON(Ответ);
    КонецЕсли;
    Если СзКодов.РазмерСписка() = 0 Тогда
        Сообщить("Информации по коду " + СокрЛП(КодМаркировки) + " на сервере ""Честного знака"" не найдено!");  
    Иначе
        Таб         = СоздатьОбъект("Таблица");
        Таб.ИсходнаяТаблица("СписКодовМарк");
        Таб.ВывестиСекцию("Шапка");
        Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);        
        Сч             = 0;
        Для Сч = 1 По СзКодов.РазмерСписка() Цикл
            Код        = "";
            Марка    = СзКодов.ПолучитьЗначение(Сч, Код);
            Если СтрДлина(СокрЛП(Код)) < 4 Тогда
                ПечМарка    = СокрЛП(Марка);
                Расш         = "";
            Иначе
                ПечМарка    = СокрЛП(Код);
                Расш        = Марка;
            КонецЕсли;
            ПечНом            = Сч;
            Таб.ВывестиСекцию("Строка_1");
        КонецЦикла;
        Таб.ВывестиСекцию("Подвал");
        Таб.ТолькоПросмотр(1);
        Таб.Показать("Список кодов маркировки","");        
    КонецЕсли;
    
КонецПроцедуры

Запрос в глобальнике, тот-же самый, который для токена.
   MWWRuza
 
60 - 18.03.20 - 19:53
ПрефиксВерсии = "/api/v3/";
 
 Рекламное место пустует
   MWWRuza
 
61 - 18.03.20 - 19:57
";" = в адресе после ""https://""; лишняя, форум подставляет сам при вставке текста модуля...
   MWWRuza
 
62 - 18.03.20 - 19:59
+(61)Во, опять подставил, думал две пары двойных кавычек помогут, а нет...
   igel1969
 
63 - 19.03.20 - 08:04
(62) Получилось получить ))))
Хотя и чуть-чуть иначе в моем случае работает почему-то.
Все-равно без Вас я бы не справился, подсказки подводили меня к цели, давали направление.
Сейчас код приведу в порядок и выложу
   igel1969
 
64 - 19.03.20 - 09:05
Вот, не спрашивайте как и почему (мноное сделано методом тыка), но это работает:

Функция НайтиЗначениеПараметра(Стр, Параметр)

     Ответ = "";
     Поз = Найти(Стр, Параметр);
     Если Поз > 0 Тогда
         Поз = Поз + СтрДлина(Параметр) + 3;
         Пока Сред(Стр, Поз, 1) <> """" Цикл
             Ответ = Ответ + Сред(Стр, Поз, 1);
             Поз = Поз + 1;
         КонецЦикла;
        
     КонецЕсли;
     Возврат Ответ;    
КонецФункции


Функция Кодировать(СтрокаКодирования)
     Кодировка = "windows-1251";
     ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
    
     ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, Кодировка);
     ЗаписьТекста.Записать(СтрокаКодирования);
     ЗаписьТекста.Закрыть();
    
     ТвояСтрокаДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
     ЗакодированнаяСтрока = Base64Строка(ТвояСтрокаДвоичныеДанные);
     Попытка
         УдалитьФайлы(ИмяВременногоФайла);
     Исключение
         Сообщить("жопа");
         Возврат СтрокаКодирования;
     КонецПопытки;
     Возврат ЗакодированнаяСтрока;
КонецФункции



Функция Рекодировать(Строка)                        
    Рус = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    Анг = "F,DULT`;PBQRKVYJGHCNEA[WXIO]SM" + """" + ".Zf,dult`;pbqrkvyjghcnea[wxio]sm" + """" + ".z";
    Стр = "";
    Для индекс = 1 по СтрДлина(Строка) Цикл
        Символ = Сред(Строка, индекс, 1);
        Поз = Найти(Рус, Символ);
        Если Поз > 0 Тогда
            Символ = Сред(Анг, Поз, 1);
        КонецЕсли;
        Стр = Стр + Символ;
    КонецЦикла;
    // Неплохо бы тут включить экранирование, как сказано в документации по API, чуть попозже.
    
    Если Сред(Стр, 1, 2) = "01" и Сред(Стр, 17, 2) = "21" Тогда // блоки
        Стр = "(01)" + Сред(Стр, 3, 14) + "(21)" + Сред(Стр, 19, 7);
    ИначеЕсли  Сред(Стр, 1, 4) = "(01)" и Сред(Стр, 19, 4) = "(21)" Тогда // новое написание блоков
        Стр = Лев(Стр, 29);
    Иначе
        Стр = Лев(Стр, 21);
    КонецЕсли;    
        
    Возврат Стр;
КонецФункции

Процедура ОсновныеДействияФормыПроверить(Кнопка)
    Код = Рекодировать(Код);
    Сообщить(Код);
    WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    попытка
        WinHttp.Open("GET", "https://ismotp.crptech.ru/api/v3/true-api/cises/aggregated/list?codes="; + СокрЛП(Код),0);
        WinHttp.SetRequestHeader("Authorization", "Bearer " + Токен);
        WinHttp.Send();
        РезультатСтр = WinHttp.ResponseText();
        Сообщить(РезультатСтр);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры


Функция ComОбъектСертификатаПоОтпечатку(Отпечаток)
    CAPICOM_CURRENT_USER_STORE         = 2;    // 2 - Искать сертификат в ветке "Личное" хранилища.
    CAPICOM_MY_STORE                   = "My";// Указываем, что ветку "Личное" берем из хранилища текущего пользователя
    CAPICOM_STORE_OPEN_READ_ONLY       = 0;    // Открыть хранилище только на чтение
    CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    oStore = Новый COMОбъект("CAdESCOM.Store");// Объект описывает хранилище сертификатов
    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY);// Открыть хранилище сертификатов
    Certificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, Отпечаток);
    ComОбъект = Certificates.Item(1);// Найденный сертификат (Com-объект)
    oStore.Close();// Закрыть хранилище сертификатов и освободить объект
    Возврат ComОбъект;
КонецФункции

Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint, bDetached)
    CADESCOM_BASE64_TO_BINARY = 1;// Входные данные пришли в Base64
    CADESCOM_CADES_TYPE = 1;// Тип усовершенствованной подписи
    EncodingType = 0;
    oSigner = Новый COMОбъект("CAdESCOM.CPSigner");// Объект, задающий параметры создания и содержащий информацию об усоверш-ной подписи
    oSigner.Options = 2;
    oSigner.Certificate = ComОбъектСертификатаПоОтпечатку(sThumbprint);
    oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");// Объект CadesSignedData предоставляет свойства и методы для работы с усоверш-ной подписью.
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
    oSignedData.Content = Кодировать(ТекстДляПодписи);    
    sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType);// Метод добавляет к сообщению усовершенствованную подпись.
    Возврат sSignedMessage;// Подпись в формате Base64
КонецФункции


Процедура ОсновныеДействияФормыАвторизация(Кнопка)
    WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    попытка
        WinHttp.Open("GET", "https://ismotp.crptech.ru/api/v3/true-api/auth/key",0);      
        WinHttp.Send();
        РезультатСтр = WinHttp.ResponseText();
        Сообщить(РезультатСтр);
        uuid = НайтиЗначениеПараметра(РезультатСтр, "uuid");
        data = НайтиЗначениеПараметра(РезультатСтр, "data");
        Сообщить(uuid);
        Сообщить(data);
        
        Отпечаток = "252dec0451161f78670824799ed2e0f1ee52f171"; // отпечаток не настоящий, для форума изменил
        
        ТекстОтвета = ПодписатьТекст(СокрЛП(data), Отпечаток, Ложь);
        ТекстОтвета = СтрЗаменить(ТекстОтвета, Символы.ПС, "");
        ТекстОтвета = СтрЗаменить(ТекстОтвета, Символы.ВК, "");
        Сообщить(ТекстОтвета);
        
        WinHttp.Open("POST", "https://ismotp.crptech.ru/api/v3/true-api/auth/simpleSignIn",1);
        WinHttp.SetRequestHeader("Content-Type", "application/json");
        WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
        СтрокаЗапроса = "{""uuid"": """+СокрЛП(Uuid)+""",""data"": """ + ТекстОтвета + """}";
        Сообщить(СтрокаЗапроса);
        WinHttp.Send(СтрокаЗапроса);
        Предупреждение("ывыв", 2, "");
        РезультатСтр = WinHttp.ResponseText(40);
        Токен = НайтиЗначениеПараметра(РезультатСтр, "token");
        Сообщить(Токен);
        

    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры
   MWWRuza
 
65 - 19.03.20 - 14:21
(57) я же на 8.2 все делаю

Я вот думаю - а расскажите, зачем такие сложности? Даже если это какая-то самописка-нетленка, ИМХО, проще "украсть" из типовых 8.3... Все ближе...
Одно дело, я под 7.7 делаю, "украсть" не откуда, принципиально... Но, под восьмерку - куча типовых, где это все работает.
   kkkooottt
 
66 - 21.04.20 - 14:31
Господа, нахожусь на этапе "отправляю uuid + data но не могу получить токен" - {"error_message":"Ошибка при выполнении запроса"}
Не подскажите как добились получения токена и в чем был корень проблемы? Вопрос в первую очередь к  igel1969. Спасибо!
   ChMikle
 
67 - 25.05.20 - 11:14
(0) так в итоге-то на боевом заработало или нет ?
   MWWRuza
 
68 - 25.05.20 - 11:48
(67) Разогрегация - да. Работает, вполне нормально, использую для получения ШК пачки как базовой единицы для создания приходной накладной полученной через ЭДО, блоками. Ну, и так список пачек в блоке могу получать, правда пока не понимаю, для чего: https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-315.jpg
   ChMikle
 
69 - 25.05.20 - 12:02
(68) Круто , за денежку отдадите ?
   ChMikle
 
70 - 25.05.20 - 12:03
+(69) мне в принципе этот блок получения QR кодов пачек получить , а дальше я уже под наши нужны приженю
   MWWRuza
 
71 - 25.05.20 - 12:25
(70) Да я и так поделюсь, только это не отдельный блок, это все встроено в конфигурацию... Сама внешняя обработка не будет работать без кусков глобального модуля. Вы лучше скажите - что у Вас конкретно не получается, я кину сюда текст процедуры/функции, как у меня это делается...

Обработку я могу выложить, но, только толку от нее... Я хотел в выходные собрать отдельной, самодостаточной обработкой, и выкинуть на ИС... А то, СМ заканчиваются :-)... Но, занят был другими делами, пока не получилось.
   ChMikle
 
72 - 25.05.20 - 12:35
(71) Если на ИС будете выкладывать то мы бы за см взяли бы.
Не понятно : 1. разбор и сбор Json() 
             2. ПолучитьPublic_cert()
             3. ЗначениеВJSON() , ЗначениеИзJSON()
             4. ПодписатьТекст()
             5. ОтрезатьЛишнееОтСтрМаркировки()
   ChMikle
 
73 - 25.05.20 - 12:46
В качестве вклада в общую копилку , доделываю обработку перевода со 2-го регистра на 3ий старых акцизных марок по алкоголю , обработка не универсальная , но в качестве заготовки вполне подойдет , так что если кому надо поделюсь с удовольствием  . Естессно написано на 7.7.
   MWWRuza
 
74 - 25.05.20 - 13:00
По пунктам:
1. Брал отсюда: https://github.com/r72cccp/1C77_JSON_parser/
2.
// ПолучитьPublic_cert(ПутьКСертификату)

//
// Параметры: 

//  ПутьКСертификату - путь к файлу или текст сертификата КЭП
//

// Возвращаемое значение:
//  public_cert,signature

//
// Описание:

//  убирает переносы строк и возвращает содержимое в виде строки
//

Функция ПолучитьPublic_cert(ПутьКСертификату)
    
    ВозврPublic_cert = "";
    Если (Прав(ПутьКСертификату,4) = ".cer") ИЛИ (Прав(ПутьКСертификату,4) = ".txt") Тогда
        Если ФС.СуществуетФайл(ПутьКСертификату) = 0 Тогда
            Сообщить("Файл сертификата "+СокрЛП(ПутьКСертификату)+" не найден");
            Возврат "";
        КонецЕсли;
        АдоДБСтрим = СоздатьОбъект("ADODB.Stream");
        АдоДБСтрим.Mode = 3;
        АдоДБСтрим.Type = 2//текст

        АдоДБСтрим.charset="utf-8";
        АдоДБСтрим.Open();
        АдоДБСтрим.LoadFromFile(ПутьКСертификату);
        АдоДБСтрим.Position = 0;
        ТекстСертификата = АдоДБСтрим.ReadText(-1);
        АдоДБСтрим.Close();
        Для СчСтрок = 1 По СтрКоличествоСтрок(ТекстСертификата) Цикл
            ТекСтрока = СтрПолучитьСтроку(ТекстСертификата,СчСтрок);
            Если Лев(ТекСтрока,4) = "----" Тогда
                Продолжить;
            КонецЕсли;
            ТекСтрока = СтрЗаменить(ТекСтрока,РазделительСтрок,"");
            ВозврPublic_cert = ВозврPublic_cert + ТекСтрока;
        КонецЦикла;
    Иначе
        Для СчСтрок = 1 По СтрКоличествоСтрок(ПутьКСертификату) Цикл
            ТекСтрока = СтрПолучитьСтроку(ПутьКСертификату,СчСтрок);
            Если Лев(ТекСтрока,4) = "----" Тогда
                Продолжить;
            КонецЕсли;
            ТекСтрока = СтрЗаменить(ТекСтрока,РазделительСтрок,"");
            ВозврPublic_cert = ВозврPublic_cert + ТекСтрока;
        КонецЦикла;
    КонецЕсли;

    Возврат ВозврPublic_cert;
    
КонецФункции// ПолучитьPublic_cert()


Тоже брал где-то тут. Если память не изменяет - была обработка подписания деклараций из 1с7.7, вроде код оттуда.
3. Это все из п. 1.
4. из п. 2.
5. ну, тут все просто:
// Отрезает от строки маркировки левую часть до первого СпецСимвола(Симв(29))

Функция ОтрезатьЛишнееОтСтрМаркировки(ИсхСтр) Экспорт
    ПозСпецСимвола        = Найти(ИсхСтр, Симв(29));
    Если ПозСпецСимвола = 0 Тогда
        ПозСпецСимвола    = Найти(ИсхСтр, "8005");        
    КонецЕсли;
    Если ПозСпецСимвола > 25 Тогда
        Возврат СтрЗаменить(Лев(ИсхСтр, ПозСпецСимвола - 1), Симв(29), "");    
    Иначе
        Возврат ИсхСтр;
    КонецЕсли;
КонецФункции
   ChMikle
 
75 - 25.05.20 - 15:27
Не нашел одну функцию : ПодписатьТекст(code,СокрЛП(ВыбЭЦП.Отпечаток),1) и откуда брать отпечаток ?
   MWWRuza
 
76 - 25.05.20 - 16:21
Отпечаток из справочника ЭЦП, в свою очередь он привязывается к реквизиту "Директор" СвоегоЮрЛица.
//******************************************************************************

// НайтиПоОтпечатку(Отпечаток, СпрСертификаты)
//

// Параметры: 
//  Отпечаток, СпрСертификаты

//
// Возвращаемое значение:

//  1,0
//

// Описание:
//  

//
Функция НайтиПоОтпечатку(Отпечаток, СпрСертификаты)
    
    СпрСертификаты.ВыбратьЭлементы();
    Пока СпрСертификаты.ПолучитьЭлемент() = 1 Цикл
        Если Врег(СокрЛП(СпрСертификаты.Отпечаток)) = Врег(СокрЛП(Отпечаток)) Тогда
            Возврат 1;
        КонецЕсли;
    КонецЦикла;
    Возврат 0;
    
КонецФункции// НайтиПоОтпечатку()


//******************************************************************************

// ДанныеИзПодстроки(Подстрока, ВозврСЗ)
//

// Параметры: 
//  Подстрока, ВозврСЗ

//
// Возвращаемое значение:

//  Нет
//

// Описание:
//  

//
Процедура ДанныеИзПодстроки(Подстрока, ВозврСЗ)
    Перем Ид,Данные;
    Если Найти(Подстрока,"=") > 0 Тогда
        Ид = Лев(Подстрока,Найти(Подстрока,"=")-1);
        Данные = Сред(Подстрока,Найти(Подстрока,"=")+1);
        //убираем кавычки

        Если Лев(Данные,1) = """" Тогда
            Данные = Сред(Данные,2);
        КонецЕсли;
        Если Прав(Данные,1) = """" Тогда
            Данные = Лев(Данные,СтрДлина(Данные)-1);
        КонецЕсли;
        Данные = СтрЗаменить(Данные,"""""","""");
    КонецЕсли;
    Если (ПустоеЗначение(Ид) = 0) И (ПустоеЗначение(Данные) = 0) Тогда
        ВозврСЗ.Установить(СокрЛП(Ид),СокрЛП(Данные));
    КонецЕсли;
КонецПроцедуры// ДанныеИзПодстроки()


//******************************************************************************

// ДанныеИзСтроки(СтрокаСОписанием)
//

// Параметры: 
//  СтрокаСОписанием

//
// Возвращаемое значение:

//  Список значений
//

// Описание:
//  

//
Функция ДанныеИзСтроки(СтрокаСОписанием)
    Перем ВозврСЗ,Данные;
    ВозврСЗ = СоздатьОбъект("СписокЗначений");
    Данные = "";
    БылиОткрывающиеКавычки = 0;
    Для СчС = 1 По СтрДлина(СтрокаСОписанием) Цикл
        
        ТекСимв = Сред(СтрокаСОписанием,СчС,1);
        
        Если (ТекСимв = """") И (БылиОткрывающиеКавычки = 0) Тогда
            Данные = Данные + ТекСимв;
            БылиОткрывающиеКавычки = 1;
            Продолжить;
        КонецЕсли;
        Если (ТекСимв = """") И (БылиОткрывающиеКавычки = 1) Тогда
            Данные = Данные + ТекСимв;
            БылиОткрывающиеКавычки = 0;
            Продолжить;
        КонецЕсли;
        Если (ТекСимв = ",") И (БылиОткрывающиеКавычки = 0) Тогда
            ДанныеИзПодстроки(Данные,ВозврСЗ);
            Данные = "";
            Продолжить;
        КонецЕсли;
        Данные = Данные + ТекСимв;
    КонецЦикла;
    ДанныеИзПодстроки(Данные,ВозврСЗ);
    
    Возврат ВозврСЗ;
    
КонецФункции// ДанныеИзСтроки()


//******************************************************************************

// Прочитать()
//

// Параметры: 
//  

//
// Возвращаемое значение:

//  ТблДанные
//

// Описание:
//  

//
Функция Прочитать()
    
    //чтение

    ТблДанные = СоздатьОбъект("ТаблицаЗначений");
    ТблДанные.НоваяКолонка("Отпечаток");
    ТблДанные.НоваяКолонка("СерийныйНомер");
    ТблДанные.НоваяКолонка("Субъект");
    ТблДанные.НоваяКолонка("Издатель");
    ТблДанные.НоваяКолонка("ДействителенС");
    ТблДанные.НоваяКолонка("ДействителенПо");
    ТблДанные.НоваяКолонка("ДанныеСертификата");
    CAPICOM_CURRENT_USER_STORE = 2;// 2 - Искать сертификат в ветке "Личное" хранилища.

    CAPICOM_MY_STORE = "My";// Указываем, что ветку "Личное" берем из хранилища текущего пользователя

    CAPICOM_STORE_OPEN_READ_ONLY = 0;// Открыть хранилище только на чтение 

    
//    CAPICOM_CERTIFICATE_FIND_TIME_EXPIRED = 11;

    
    //oStore = СоздатьОбъект("CAdESCOM.Store"); // Объект описывает хранилище сертификатов

//    oStore = СоздатьОбъект("CAPICOM.Store");// Объект описывает хранилище сертификатов 

    oStore = СоздатьОбъект("CAdESCOM.Store");// Объект описывает хранилище сертификатов

    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY);// Открыть хранилище сертификатов

    Certs = oStore.Certificates;
    Для СчСер = 1 По Certs.Count Цикл
        ТекСертификат  = Certs.Item(СчСер);
        Отпечаток      = ТекСертификат.Thumbprint;
        Субъект        = ТекСертификат.SubjectName;
        Издатель       = ТекСертификат.IssuerName;
        ДействителенС  = ТекСертификат.ValidFromDate;
        ДействителенПо = ТекСертификат.ValidToDate;
        Если ДействителенПо < ТекущаяДата() Тогда
            Продолжить;
        КонецЕсли;
        СерийныйНомер  = ТекСертификат.SerialNumber;
        //Версия         = ТекСертификат.Version;

        //Archived       = ТекСертификат.Archived;

        //Если Archived = 1 Тогда

        //    Продолжить;

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

        //PrivateKey    = ТекСертификат.PrivateKey;

        ДанныеСертификатаBase64 = ТекСертификат.Export();
        //PublicKey      = ТекСертификат.PublicKey();

        //EncodedKey     = PublicKey.EncodedKey;

        
        ТблДанные.НоваяСтрока();
        ТблДанные.Отпечаток         = Отпечаток;
        ТблДанные.СерийныйНомер     = СерийныйНомер;
        ТблДанные.Субъект           = Субъект;
        ТблДанные.Издатель          = Издатель;
        ТблДанные.ДействителенС     = ДействителенС;
        ТблДанные.ДействителенПо    = ДействителенПо;
        ТблДанные.ДанныеСертификата = ДанныеСертификатаBase64;
        
    КонецЦикла;
    
    oStore.Close();// Закрыть хранилище сертификатов и освободить объект

    
    Возврат ТблДанные;
    
КонецФункции// Прочитать()


//******************************************************************************

// ТекстКомуВыдан(сзСубъект)
//

// Параметры: 
//  сзСубъект

//
// Возвращаемое значение:

//  Строка
//

// Описание:
//  

//
Функция ТекстКомуВыдан(сзСубъект)
    Перем СчЦ,Ид,ВремЗнач,СтрКомуВыдан;
    
    Если сзСубъект.РазмерСписка() = 0 Тогда
        Возврат "";
    КонецЕсли;
    Для СчЦ = 1 По сзСубъект.РазмерСписка() Цикл
        Ид = "";
        ВремЗнач = сзСубъект.ПолучитьЗначение(СчЦ,Ид);
        Если Ид = "CN" Тогда
            Если СчЦ > 1 Тогда
                сзСубъект.СдвинутьЗначение(-СчЦ+1,СчЦ);
            КонецЕсли;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    СтрКомуВыдан = сзСубъект.ВСтрокуСРазделителями();
    
    //убираем кавычки

    Если Лев(СтрКомуВыдан,1) = """" Тогда
        СтрКомуВыдан = Сред(СтрКомуВыдан,2);
    КонецЕсли;
    Если Прав(СтрКомуВыдан,1) = """" Тогда
        СтрКомуВыдан = Лев(СтрКомуВыдан,СтрДлина(СтрКомуВыдан)-1);
    КонецЕсли;
    СтрКомуВыдан = СтрЗаменить(СтрКомуВыдан,""",""",",");
    СтрКомуВыдан = СтрЗаменить(СтрКомуВыдан,"""""","""");
    Возврат СтрКомуВыдан;
    
КонецФункции// ТекстКомуВыдан()



//******************************************************************************

// ЗаполнитьРеквизиты()
//

// Параметры: 
//  

//
// Возвращаемое значение:

//  Нет
//

// Описание:
//  Заполняет элемент справочника

//
Процедура ЗаполнитьРеквизиты(ЭлСертификаты,ТблДанные)
    
    СпрСертификаты2 = СоздатьОбъект("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования");
    Если СпрСертификаты2.НайтиЭлемент(ЭлСертификаты) = 0 Тогда
        Возврат;
    КонецЕсли;
    СпрСертификаты2.ДействителенС  = ТблДанные.ДействителенС;
    СпрСертификаты2.ДействителенПо = ТблДанные.ДействителенПо;
    СпрСертификаты2.СерийныйНомер  = ТблДанные.СерийныйНомер;
    
    Если Найти(ТблДанные.ДанныеСертификата,РазделительСтрок) = 0 Тогда
        //порежем для наглядности

        ДанныеСертификатаBase64 = ТблДанные.ДанныеСертификата;
        ДанныеСертификатаBase64ре = "";
        Для СчСтрок = 1 По Цел(СтрДлина(ДанныеСертификатаBase64)/48) Цикл
            Если СчСтрок > 1 Тогда
                ДанныеСертификатаBase64ре = ДанныеСертификатаBase64ре + РазделительСтрок;
            КонецЕсли;
            ДанныеСертификатаBase64ре = ДанныеСертификатаBase64ре + Сред(ДанныеСертификатаBase64,1+(СчСтрок-1)*48,48);
        КонецЦикла;
        СпрСертификаты2.ДанныеСертификата = ДанныеСертификатаBase64ре;
    Иначе
        СпрСертификаты2.ДанныеСертификата = ТблДанные.ДанныеСертификата;
    КонецЕсли;
    
    
    
    сзСубъект  = ДанныеИзСтроки(ТблДанные.Субъект);
    
    СпрСертификаты2.КомуВыдан      = ТекстКомуВыдан(сзСубъект);
    СпрСертификаты2.Наименование   = сзСубъект.Получить("CN");
    СпрСертификаты2.Фамилия        = сзСубъект.Получить("SN");
    СпрСертификаты2.Имя            = сзСубъект.Получить("G");
    СпрСертификаты2.ЭлАдрес        = сзСубъект.Получить("E");
    ВремЗнач = Найти(СокрЛП(СпрСертификаты2.Имя)," ")//Отчество за именем

    Если ВремЗнач > 0 Тогда
        СпрСертификаты2.Отчество   = Сред(СпрСертификаты2.Имя,ВремЗнач+1);
        СпрСертификаты2.Имя        = Лев(СпрСертификаты2.Имя,ВремЗнач-1);
    КонецЕсли;
    СпрСертификаты2.Должность      = сзСубъект.Получить("T");
    ИННизСертификата               = сзСубъект.Получить("ИНН");
    Если ПустоеЗначение(ИННизСертификата) = 0 Тогда
        //СпрСертификаты2.ЮрЛицо     = глНайтиЮрЛицоПоИНН(ИННизСертификата);

    КонецЕсли;
    сзИздатель = ДанныеИзСтроки(ТблДанные.Издатель);
    СпрСертификаты2.КемВыдан       = сзИздатель.Получить("CN");
    СпрСертификаты2.Записать();
    
    
КонецПроцедуры// ЗаполнитьРеквизиты()



//******************************************************************************

// Обновить()
//

// Параметры: 
//  

//
// Возвращаемое значение:

//  Нет
//

// Описание:
//  

//
Процедура Обновить()
    
    тблДанные = Прочитать();
    СчОбн = 0;
    //обновление справочника

    СпрСертификаты = СоздатьОбъект("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования")//для выборки

    ТблДанные.ВыбратьСтроки();
    Пока ТблДанные.ПолучитьСтроку() = 1 Цикл
        флЭлементЕсть = НайтиПоОтпечатку(ТблДанные.Отпечаток,СпрСертификаты);
        Если флЭлементЕсть = 0 Тогда
            Продолжить;
        КонецЕсли;
        СчОбн=СчОбн+1;
        ЗаполнитьРеквизиты(СпрСертификаты.ТекущийЭлемент(),тблДанные);
    КонецЦикла;
    Сообщить("Обновлена информация о "+СчОбн+" сертификатов");
    
КонецПроцедуры// Обновить()


//******************************************************************************

// Добавить()
//

// Параметры: 
//  

//
// Возвращаемое значение:

//  Нет
//

// Описание:
//  

//
Процедура Добавить()
    
    тблДанные = Прочитать();
    СпрСертификаты = СоздатьОбъект("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования")//для выборки

    сзВыбор = СоздатьОбъект("СписокЗначений");
    ТблДанные.ВыбратьСтроки();
    Пока ТблДанные.ПолучитьСтроку() = 1 Цикл
        флЭлементЕсть = НайтиПоОтпечатку(ТблДанные.Отпечаток,СпрСертификаты);
        Если флЭлементЕсть = 0 Тогда
            сзСубъект  = ДанныеИзСтроки(ТблДанные.Субъект);
            сзВыбор.ДобавитьЗначение(тблДанные.Отпечаток,ТекстКомуВыдан(сзСубъект));
            сзВыбор.Пометка(сзВыбор.РазмерСписка(),1);
        КонецЕсли;
        
    КонецЦикла;
    
    Если сзВыбор.РазмерСписка() = 0 Тогда
        Сообщить("Новых сертификатов не найдено");
    Иначе
        Если сзВыбор.ОтметитьЗначения(,"Укажите сертификаты для добавления") = 1 Тогда
            Для СчЦ = 1 По сзВыбор.РазмерСписка() Цикл
                Если сзВыбор.Пометка(СчЦ) = 1 Тогда
                    ТекОтпечаток = сзВыбор.ПолучитьЗначение(СчЦ);
                    ТблДанные.ВыбратьСтроки();
                    Пока ТблДанные.ПолучитьСтроку() = 1 Цикл
                        Если тблДанные.Отпечаток = ТекОтпечаток Тогда
                            СпрСертификаты.Новый();
                            СпрСертификаты.Отпечаток = ТекОтпечаток;
                            СпрСертификаты.Записать();
                            ЗаполнитьРеквизиты(СпрСертификаты.ТекущийЭлемент(),тблДанные);
                            Прервать;
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры// Добавить()
   MWWRuza
 
77 - 25.05.20 - 16:23
Подписать текст:

// sThumbprint - отпечаток сертификата, используемого для подписи; строка, представляющая отпечаток в шестандцатеричном виде

Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint,БезBOM=1)
    
    infile = КаталогВременныхФайлов()+"infile.txt";
    Если ФС.СуществуетФайл(infile) = 1 Тогда
        Попытка
            ФС.УдалитьФайл(infile);
        Исключение
            infile = КаталогВременныхФайлов() + "infile" + ГенераторGIUD() + ".txt";
        КонецПопытки;
    КонецЕсли;
    outfile = КаталогВременныхФайлов()+"outfile.txt";
    Если ФС.СуществуетФайл(outfile) = 1 Тогда
        Попытка
            ФС.УдалитьФайл(outfile);
        Исключение
            outfile = КаталогВременныхФайлов() + "outfile" + ГенераторGIUD() + ".txt";
        КонецПопытки;
    КонецЕсли;
    Если Прав(ТекстДляПодписи,4) = ".xml" Тогда
        infile = ТекстДляПодписи;
        ПодписатьФайл(infile,ПолучитьСертификатПоОтпечатку(sThumbprint),outfile);
        Если ФС.СуществуетФайл(outfile) = 1 Тогда
            Возврат outfile;
        Иначе
            Возврат "";
        КонецЕсли;
    Иначе
        Если БезBOM = 1 Тогда
            ВремТекст = СоздатьОбъект("Текст");
            ВремТекст.ДобавитьСтроку(ТекстДляПодписи);
            ВремТекст.Записать(infile);
        Иначе
            АдоДБСтрим = СоздатьОбъект("ADODB.Stream");
            АдоДБСтрим.Mode = 3;
            АдоДБСтрим.Type = 2//текст

            АдоДБСтрим.charset="utf-8";
            АдоДБСтрим.Open();
            АдоДБСтрим.WriteText(ТекстДляПодписи);
            АдоДБСтрим.Position=0;
            АдоДБСтрим.SaveToFile(infile,2);
            АдоДБСтрим.Close();
        КонецЕсли;
        ПодписатьФайл(infile,ПолучитьСертификатПоОтпечатку(sThumbprint),outfile);
        Если ФС.СуществуетФайл(outfile) = 1 Тогда
            Возврат outfile;
        Иначе
            Возврат "";
        КонецЕсли;
        
        
    КонецЕсли;

КонецФункции
   MWWRuza
 
78 - 25.05.20 - 16:26
Вообще, это все с ИнфоСтарта, вроде по лекарствам там была уже давно публикация, я просто адаптировал под свое...
   ChMikle
 
79 - 26.05.20 - 12:21
ГенераторGIUD() Выложите ?
   ChMikle
 
80 - 26.05.20 - 12:25
и ЗначениеВJson() тоже не нашел
   ChMikle
 
81 - 26.05.20 - 12:39
ПолучитьСертификатПоОтпечатку(sThumbprint)
   big
 
82 - 26.05.20 - 12:59
(79) можно взять в FormEx-е или в v7plus, а можно самому придумать. Он же используется только для имени временного файла.

(80) там структура простейшая, функция пишется на раз-два

(81)

Функция ComОбъектСертификатаПоОтпечатку(Отпечаток)
    
    CAPICOM_CURRENT_USER_STORE         = 2;        // 2 - Искать сертификат в ветке "Личное" хранилища.

    CAPICOM_MY_STORE                   = "My";    // Указываем, что ветку "Личное" берем из хранилища текущего пользователя

    CAPICOM_STORE_OPEN_READ_ONLY       = 0;        // Открыть хранилище только на чтение

    CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    
    oStore = СоздатьОбъект("CAdESCOM.Store");    // Объект описывает хранилище сертификатов

    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY)// Открыть хранилище сертификатов

    
    Certificates    = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, Отпечаток);
    ComОбъект        = Certificates.Item(1)// Найденный сертификат (Com-объект)

    
    oStore.Close();    // Закрыть хранилище сертификатов и освободить объект

    
    Возврат ComОбъект;
    
КонецФункции
   MWWRuza
 
83 - 26.05.20 - 14:07
(79)
// ГенераторGIUD()

//
// Параметры: 

//  
// Возвращаемое значение:

//  GIUD
//

// Описание:
//  

Функция ГенераторGIUD()
    ОбъектGUID = СоздатьОбъект("GUID")//1С++

    ОбъектGUID.Новый();
    Возврат ОбъектGUID.ВСтроку();
КонецФункции// ГенераторGIUD()
   MWWRuza
 
84 - 26.05.20 - 14:08
//******************************************************************************

// ЗначениеВJSON(Объект)
//

// Параметры: 
//  Объект

//
// Возвращаемое значение:

//  json
//

// Описание:
//  https://pastebin.com/HFaEaETX
//  https://wiki.rtzra.ru/software/1c/1c-json
//  Запись/чтение JSON под 1С7.7
//  http://catalog.mista.ru/public/59535/
//  

//
Функция ЗначениеВJSON(Объект,Форматированный="") Экспорт
    
    Тип = ТипЗначенияСтр(Объект);
    Если Тип = "СписокЗначений" Тогда
        //то определим с ключами или без

        Если Объект.РазмерСписка() = 0 Тогда
            Тип = "СписокЗначенийбезКлючей";
        Иначе
            Ключ = "";
            Значение = Объект.ПолучитьЗначение(1,Ключ);
            Если ПустоеЗначение(Ключ) = 1 Тогда
                Тип = "СписокЗначенийбезКлючей";
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
    Если Тип = "ТаблицаЗначений" Тогда
        сзКолонки = СоздатьОбъект("СписокЗначений");
        Для СчЦ = 1 По Объект.КоличествоКолонок() Цикл
            ИмяКолонки = Объект.ПолучитьПараметрыКолонки(СчЦ);
            сзКолонки.ДобавитьЗначение(ИмяКолонки);
        КонецЦикла;
        КоличКолонок = сзКолонки.РазмерСписка();
        Результат = "["+РазделительСтрок;
        КоличСтрок = Объект.КоличествоСтрок();
        Для СчСтрок = 1 По КоличСтрок Цикл
            Результат = Результат + " {";
            Для СчК = 1 По сзКолонки.РазмерСписка() Цикл
                Ключ = сзКолонки.ПолучитьЗначение(СчК);
                Значение = Объект.ПолучитьЗначение(СчСтрок,Ключ);
                Результат = Результат + "  " + ЗначениеВJSON(Ключ) + ": " + ЗначениеВJSON(Значение) + ?(СчК < КоличКолонок, ","+РазделительСтрок, "");
            КонецЦикла;
            Результат = Результат + РазделительСтрок + " }";
            Если СчСтрок < КоличСтрок Тогда
                Результат = Результат + ","+РазделительСтрок;
            КонецЕсли;
            Состояние("Обработка таблицы значений "+Окр(СчСтрок/КоличСтрок*100,2)+"%");
        КонецЦикла;
        Результат = Результат + РазделительСтрок + "]";
        Возврат Результат;
    ИначеЕсли Тип = "СписокЗначенийбезКлючей" Тогда//без ключей

        
        Количество = Объект.РазмерСписка();
        Результат = "[";
        
        Для н = 1 ПО Количество Цикл
            Результат = Результат + ЗначениеВJSON(Объект.ПолучитьЗначение(н)) + ?(н < Количество, ", ", "");
        КонецЦикла;
        
        Результат = Результат + "]";
        Возврат Результат;
        
    ИначеЕсли Тип = "СписокЗначений" Тогда//с ключами

        н = 0;
        Количество = Объект.РазмерСписка();
        Результат = "{";
        
        Для СчЦ = 1 По Количество Цикл
            Ключ = "";
            Значение = Объект.ПолучитьЗначение(СчЦ,Ключ);
            Результат = Результат + ЗначениеВJSON(Ключ) + ": " + ЗначениеВJSON(Значение) + ?(СчЦ < Количество, ", ", "");
        КонецЦикла;
        Результат = Результат + "}";
        Возврат Результат;
    ИначеЕсли Тип = "Строка" Тогда
        Результат = СокрЛП(Объект);
        Результат = СтрЗаменить(Результат, "\",            "\\");
        Результат = СтрЗаменить(Результат, "/",            "\/");
        Результат = СтрЗаменить(Результат, """",           "\""");
        Результат = СтрЗаменить(Результат, "'",            "\'");
        Результат = СтрЗаменить(Результат, Симв(13),       "\r");
        Результат = СтрЗаменить(Результат, СимволТабуляции,"\t");
        Результат = СтрЗаменить(Результат, Симв(10),       "\n");
        Возврат """" + Результат + """";
    ИначеЕсли Тип = "Число" Тогда
        Возврат Формат(Объект, "Ч");
    ИначеЕсли Тип = "Дата" Тогда
        Возврат ЗначениеВJSON(""+ДатаГод(Объект)+"-"+ДатаМесяц(Объект)+"-"+ДатаЧисло(Объект));
    ИначеЕсли Тип = "НеизвестныйОбъект" Тогда 
            Возврат "null";
    Иначе
        Возврат ЗначениеВJSON(Строка(Объект));
    КонецЕсли;    
    
КонецФункции// ЗначениеВJSON()
   ChMikle
 
85 - 26.05.20 - 14:18
(84) У меня все сильнее растет надежда что вы все-таки на ИС выложите готовую внешнюю обработку с входом QR блока и выходом спула QR-кодов пачек и мы ее приобретем :))
   victuan1
 
86 - 26.05.20 - 15:00
(77) Не работает для открепленной подписи.
   MWWRuza
 
87 - 26.05.20 - 16:28
(85) Надежда еще не померла? Сегодня вечером выложу :-)...
   MWWRuza
 
88 - 26.05.20 - 17:30
+(87) Выложил. Публикация № 1241751
Пока, наверное на модерации.
   ChMikle
 
89 - 26.05.20 - 18:00
(88)Вы вернули мне веру в человечество :)))
   MWWRuza
 
90 - 27.05.20 - 09:07
+(88) Пока, наверное на модерации.

Завернули... Не поняли, что такое "разогрегация"... Слово не понравилось, согласен, как-то "не по русски", но, как по другому? Люди "в теме" - поймут... Остальным, это просто не нужно... Но, тем не менее - исправил, теперь заголовок такой: "Разогрегация(получение кодов маркировки, товаров, входящих в "агрегатированные" производителем/поставщиком упаковки) для табачной продукции"... Ну, уж даже и не знаю... Думаю, прокатит...
   MWWRuza
 
91 - 27.05.20 - 10:40
Проскочило... Вот: http://catalog.mista.ru/public/1241751/
Проверьте, все-ли работает...
   Arbuz
 
92 - 27.05.20 - 12:13
(90) дезАгрегация, же! хотя могли бы использовать "сегментация", например.
   ChMikle
 
93 - 27.05.20 - 12:31
(92) Хоть как называй, только в печь не клади :)))
   Arbuz
 
94 - 27.05.20 - 13:03
(93) так то, безусловно, Влад делает нужную и полезную вещь, просто "разОгрегация" - это какое-то кафкианство  https://yandex.ru/images/search?text=грегор%20замза
хотя, о чём это я... 〳 ͡° Ĺ̯ ͡° 〵
   victuan1
 
95 - 28.05.20 - 04:49
(90) теперь заголовок такой: "Разогрегация(получение кодов маркировки, товаров, входящих в "агрегатированные" производителем/поставщиком упаковки) для табачной продукции".

Всё равно не правильно. Замени "о" на "а" чтобы было "Разагрегация", слово образовано от приставки "раз" и существительного "агрегат".
Слова "огрегат" не существует.
   MWWRuza
 
96 - 28.05.20 - 09:15
(95) Исправил.
   MWWRuza
 
97 - 28.05.20 - 10:02
+(96) Нормально так... Все хотели, всем надо было... Бросил все, выдрал из конфы, создал самостоятнльную внешнюю обработку, опубликовал... В итоге, за два дня - 161 просмотр, и ни одного скачивания....
Неужели так "безграмотный" заголовок отпугнул-? Или, действительно никому не нужно - ?
   victuan1
 
98 - 28.05.20 - 10:12
(97) На самом деле, никому не нужен "полуфабрикат". Нужно готовое решение из коробки.
:-(
   ChMikle
 
99 - 28.05.20 - 16:23
(97) Нужно , я точно куплю, просто на ИС у меня нет стартмани пока , но если позволите переводом на карту оплатить, а по факту получения в почту кините , то будет быстрее . Если нет то на следующей неделе точно :))
   MWWRuza
 
100 - 28.05.20 - 21:36
(99) На почту написал.

(98) Ну, Виктор, это спорный вопрос... Все-таки эти наши форумы, больше не для конечных пользователей, а для программистов, внедренцев, и т.п. специалистов... И этому контингенту, чаще всего нужны "идеи", какие-то небольшие наработки, и т.п., которые они смогут использовать в своих проектах. Лично я, например, за все время не купил ни одного "готового решения из коробки", но очень активно собирал по крупицам всякие мелкие наработки, которые активно использую в своих решениях...
Другое дело - какие-нибудь бухгалтерские форумы, где тусуются "тетеньки бухгалтера" и "дяденьки владельцы бизнесов", которые в конфигуратор, максимум для сохранения резервной копии заходят, а то и того боятся... Вот там, точно такие обработки даже даром не нужны, там, как раз нужны "готовые решения из коробки", да еще и желательно с включенными часами на внедрение...
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.