Интеграция с государственной системой маркировки «Честный знак» (ГИС МТ) на устаревшей платформе 1С 7.7 представляет собой определенную сложность из-за отсутствия встроенных механизмов работы с JSON и современными криптографическими стандартами. Однако, используя внешние COM-объекты, такие как WinHttp.WinHttpRequest.5.1, CAPICOM и CAdESCOM, мы можем успешно реализовать полный цикл авторизации.
Процесс получения токена авторизации в «Честном знаке» всегда состоит из двух этапов:
uuid и data) методом GET.Рассмотрим подробно каждый шаг этой задачи.
Для начала нам необходимо обратиться к серверу ИС МП, чтобы получить уникальный идентификатор сессии и случайную строку данных, которую мы должны будем подписать. Для этого воспользуемся объектом WinHttp.WinHttpRequest.5.1.
Проанализируем пример кода для выполнения GET-запроса:
Соеденение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Соеденение.Option(2, "utf-8");
URL = "https://ismp.crpt.ru/api/v3/auth/cert/key";
Соеденение.Open("GET", URL, 0);
Соеденение.SetRequestHeader("Content-Type", "application/json");
Соеденение.Send();
Если Соеденение.Status = 200 Тогда
ОтветСервера = Соеденение.ResponseText;
// Ответ придет в формате {"uuid":"...","data":"..."}
Иначе
Сообщить("Ошибка запроса: " + Соеденение.Status);
КонецЕсли;
Обратите внимание, что в 1С 7.7 нет встроенного парсера JSON. Для извлечения значений uuid и data из строки можно использовать простые функции работы со строками (найти вхождения кавычек и двоеточий) или воспользоваться объектом MSScriptControl.ScriptControl для исполнения JavaScript-кода.
Чтобы подписать полученные данные, нам нужно найти соответствующий сертификат, установленный в системе (обычно в хранилище «Личное» текущего пользователя). Для этого удобно использовать объект CAPICOM.Store.
Разберем функцию, которая возвращает список доступных сертификатов с их отпечатками (Thumbprint), чтобы пользователь мог выбрать нужный:
Функция ПолучитьСписокСертификатов()
РезСписок = СоздатьОбъект("СписокЗначений");
oStore = СоздатьОбъект("CAPICOM.Store");
// 2 - CAPICOM_CURRENT_USER_STORE, "My" - личные сертификаты
oStore.Open(2, "My", 0);
Количество = oStore.Certificates.Count;
Для а = 1 По Количество Цикл
Объект = oStore.Certificates.Item(а);
Отпечаток = Объект.Thumbprint;
Субъект = Объект.SubjectName;
// Извлекаем понятное имя (CN) из строки субъекта
Наименование = Субъект;
РезСписок.ДобавитьЗначение(Отпечаток, Наименование);
КонецЦикла;
oStore.Close();
Возврат РезСписок;
КонецФункции
Важный момент: Для работы с объектами CAdESCOM и CAPICOM в системе должен быть установлен «КриптоПро CSP» и соответствующий браузерный плагин. Если объекты не создаются, проверьте регистрацию библиотек в regsvr32.
После того как мы получили data из первого запроса и выбрали сертификат, необходимо сформировать отсоединенную электронную подпись. «Честный знак» требует подпись в формате CAdES-BES (усовершенствованная подпись).
Рассмотрим функцию подписания текста. На вход подается строка data и выбранный сертификат (объект), полученный по отпечатку:
Функция ПодписатьТекст(ТекстДляПодписи, СертификатОбъект)
// Константы для работы с CAdES
CADESCOM_BASE64_TO_BINARY = 1;
CADESCOM_CADES_TYPE = 1; // CAdES-BES
oSigner = СоздатьОбъект("CAdESCOM.CPSigner");
oSigner.Certificate = СертификатОбъект;
// Если на контейнер установлен пароль, его нужно указать здесь:
// oSigner.KeyPin = "ваш_пароль";
oSignedData = СоздатьОбъект("CAdESCOM.CadesSignedData");
oSignedData.ContentEncoding = 0; // Строка
oSignedData.Content = ТекстДляПодписи;
// Метод SignCades возвращает подпись в формате Base64
// Третий параметр Ложь означает прикрепленную подпись (для авторизации обычно нужна она)
// Но ГИС МТ часто требует именно содержимое в формате Base64
Подпись = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, 0);
Возврат Подпись;
КонецФункции
Выясним причину возможных ошибок на этом этапе. Если метод SignCades выдает ошибку «Поле агрегатного объекта не обнаружено», это часто означает, что версия библиотеки CAdESCOM не поддерживает данный метод или в системе не настроена цепочка доверия для выбранного сертификата.
На последнем этапе мы формируем JSON-тело, содержащее исходный uuid и нашу новую подпись в поле data. Этот запрос отправляется методом POST на адрес /api/v3/auth/cert.
Проанализируем пример финального запроса:
ТекстЗапроса = "{""uuid"":""" + ВыбУИД + """,""data"":""" + ПодписанныеДанные + """}";
Соеденение.Open("POST", "https://ismp.crpt.ru/api/v3/auth/cert", 0);
Соеденение.SetRequestHeader("Content-Type", "application/json; charset=UTF-8");
Соеденение.Send(ТекстЗапроса);
Если Соеденение.Status = 200 Тогда
ОтветСТокеном = Соеденение.ResponseText;
// Извлекаем токен из JSON
// Сохраняем его для дальнейших запросов в заголовок Authorization: Bearer <token>
Иначе
Сообщить("Авторизация не удалась: " + Соеденение.ResponseText);
КонецЕсли;
При реализации интеграции в 1С 7.7 примите во внимание следующие советы:
СтрЗаменить(Подпись, РазделительСтрок, "").401 Unauthorized, проверьте, добавлен ли ваш сертификат в личном кабинете «Честного знака» (раздел «Профиль» -> «Сведения о сертификатах»). Без этого шага API будет отклонять любую корректную подпись.Таким образом, мы разобрали, как с помощью внешних библиотек обойти ограничения платформы 1С 7.7 и настроить полноценный обмен данными с системой маркировки.