Как организовать обмен данными между 1С и браузером для работы с криптографическим плагином

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интеграционных механизмов часто возникает необходимость выполнить JavaScript-сценарий в браузере и вернуть результат его работы обратно в 1С. Типичный сценарий — вызов функций плагина «КриптоПро ЭЦП Browser plug-in» для формирования или проверки электронной подписи. Разберем по шагам доступные способы решения этой задачи: от использования встроенного в форму поля HTML-документа до прямого обращения к криптографическим библиотекам платформы без запуска стороннего браузера.

Способ 1. Использование встроенного элемента формы «Поле HTML-документа»

Если требуется запускать JavaScript-код и перехватывать результат непосредственно внутри клиентского приложения 1С, наиболее простым решением является размещение на форме элемента с типом ПолеHTMLДокумента. Выясним, как передавать данные между скриптом страницы и кодом 1С.

Рассмотрим классический механизм перехвата событий HTML-документа:

  1. Формируем HTML-код страницы, в котором объявляем JS-функцию, сохраняющую результат в свойство DOM-дерева и инициирующую событие.
  2. В 1С обрабатываем событие элемента формы и считываем сохраненное свойство.

Посмотрим на пример структуры HTML-страницы:


<html>
<head>
<title>Интеграция с 1С</title>
<script type="text/javascript">
var evtObj = document.createEventObject();
var myParam;

function f() {    
    var now = new Date();
    document.body.myParam = now.toString();
    document.body.fireEvent('onhelp', evtObj);
}
</script>
</head>
<body>
    <br />
    <input type="button" value="Выполнить" onclick="f()" />
</body>
</html>

В коде 1С в обработчике события поля HTML-документа считываем значение переменной:


&НаКлиенте
Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    // Получаем значение пользовательского свойства из DOM-дерева
    ЗначениеПеременнойДжаваСкрипт = ДанныеСобытия.Document.body.myParam;
    
    Сообщить("Получены данные из JavaScript: " + Строка(ЗначениеПеременнойДжаваСкрипт));
КонецПроцедуры

В современных версиях платформы 1С:Предприятие 8.3 для элемента формы ПолеHTMLДокумента реализован более удобный штатный метод ВыполнитьJavaScript() (или его асинхронный аналог ВыполнитьJavaScriptАсинх()), который позволяет исполнять JS-код и напрямую получать результат возврата функции:


&НаКлиенте
Асинх Процедура ВыполнитьСкриптНаФорме()
    Скрипт = "function getClientTime() { return new Date().toISOString(); } getClientTime();";
    
    Результат = Ждать Элементы.ПолеHTML.ВыполнитьJavaScriptАсинх(Скрипт);
    Сообщить("Результат выполнения JS: " + Строка(Результат));
КонецПроцедуры

Важное ограничение: Современные версии браузерного плагина КриптоПро работают через механизм расширений (Native Messaging). Встроенный движок рендеринга ПолеHTMLДокумента в 1С не поддерживает установку расширений из интернет-магазинов браузеров, поэтому инициализация объекта cadesplugin внутри встроенного поля может завершаться ошибкой. В таком случае следует применять альтернативные подходы.

Способ 2. Прямой вызов COM-объектов КриптоПро (без запуска браузера)

Проанализируем архитектуру плагина КриптоПро ЭЦП. В операционных системах семейства Windows дистрибутив плагина регистрирует в системе стандартные COM-библиотеки CAdESCOM. Это позволяет платформе 1С обращаться ко всем криптографическим операциям напрямую без открытия браузера и запуска сторонних JS-скриптов.

Разберем основные COM-объекты библиотеки CAdESCOM:

  1. CAdESCOM.CadesSignedData — основной объект для формирования и проверки усовершенствованной электронной подписи (CAdES-BES, CAdES-T, CAdES-X Long Type 1).
  2. CAdESCOM.CPSigner — параметры подписанта, включая выбор сертификата и установку свойств подписи.
  3. CAdESCOM.Store или CAPICOM.Store — доступ к системным хранилищам сертификатов («Личные», сертификаты компьютера).
  4. CAdESCOM.HashedData — предварительное вычисление хэша данных по алгоритмам ГОСТ Р 34.11-94 и ГОСТ Р 34.11-2012.

Посмотрим на пример кода формирования подписи через COM-объект:


&НаКлиенте
Функция ПодписатьДанныеЧерезCOM(ТекстДляПодписи, ОтпечатокСертификата)
    Попытка
        // Открываем хранилище личных сертификатов
        Хранилище = Новый COMОбъект("CAdESCOM.Store");
        Хранилище.Open(2, "My", 0); // 2 - CAPICOM_CURRENT_USER_STORE, 0 - CAPICOM_STORE_OPEN_READ_ONLY
        
        Сертификаты = Хранилище.Certificates;
        НайденныеСертификаты = Сертификаты.Find(0, ОтпечатокСертификата); // 0 - CAPICOM_CERTIFICATE_FIND_SHA1_HASH
        
        Если НайденныеСертификаты.Count = 0 Тогда
            ВызватьИсключение "Сертификат с указанным отпечатком не найден в хранилище.";
        КонецЕсли;
        
        Сертификат = НайденныеСертификаты.Item(1);
        
        // Настраиваем объект подписанта
        Подписант = Новый COMОбъект("CAdESCOM.CPSigner");
        Подписант.Certificate = Сертификат;
        Подписант.CheckCertificate = Истина;
        
        // Инициализируем данные для подписания
        ПодписываемыеДанные = Новый COMОбъект("CAdESCOM.CadesSignedData");
        ПодписываемыеДанные.Content = ТекстДляПодписи;
        
        // Формируем отсоединенную подпись CAdES-BES (1 - CADESCOM_CADES_BES, Истина - отсоединенная)
        ПодписьBase64 = ПодписываемыеДанные.SignCades(Подписант, 1, Истина);
        
        Хранилище.Close();
        Возврат ПодписьBase64;
    Исключение
        Хранилище = Неопределено;
        ВызватьИсключение "Ошибка криптографии COM: " + ОписаниеОшибки();
    КонецПопытки;
КонецФункции

Обратите внимание на разрядность: При работе через COM-объекты разрядность установленного клиентского приложения 1С (32 или 64 бита) должна строго совпадать с разрядностью зарегистрированных COM-компонент CAdESCOM. При несоответствии платформа выдаст ошибку «Класс не зарегистрирован».

Способ 3. Использование встроенного механизма платформы «МенеджерКриптографии»

Если задача заключается исключительно в подписании, шифровании или проверке ГОСТ-подписи, оптимальным решением является использование штатного объекта платформы МенеджерКриптографии. В этом случае отпадает необходимость как в запуске браузера, так и в подключении сторонних COM-объектов.

Разберем по шагам настройку работы через менеджер криптографии:

  1. На клиенте создаем объект МенеджерКриптографии с указанием криптопровайдера (например, "Crypto-Pro GOST R 34.12-2015 / 34.10-2012 CSP" или алгоритмов ГОСТ 2001).
  2. Получаем коллекцию сертификатов через метод ПолучитьСертификаты() или устанавливаем сертификат подписанта.
  3. Выполняем операцию подписания с помощью метода Подписать() или ПодписатьАсинх().

&НаКлиенте
Асинх Процедура ПодписатьФайлШтатно(ПутьКФайлуДанных, ПутьКФайлуПодписи, Отпечаток)
    Менеджер = Новый МенеджерКриптографии(
        "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
        "",
        80 // Тип провайдера для ГОСТ-2012 (PROV_GOST_2012_256)
    );
    
    Хранилище = Ждать Менеджер.ПолучитьСертификатыАсинх();
    СертификатПодписанта = Неопределено;
    
    Для Каждого Серт Из Хранилище Цикл
        Если ВРег(Серт.Отпечаток) = ВРег(Отпечаток) Тогда
            СертификатПодписанта = Серт;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если СертификатПодписанта = Неопределено Тогда
        Сообщить("Сертификат не найден.");
        Возврат;
    КонецЕсли;
    
    Ждать Менеджер.ПодписатьАсинх(ПутьКФайлуДанных, ПутьКФайлуПодписи, СертификатПодписанта);
    Сообщить("Файл успешно подписан встроенным механизмом 1С.");
КонецПроцедуры

Способ 4. Взаимодействие с внешним автономным браузером

Если сценарий строго требует запуска полноценного внешнего браузера (Google Chrome, Яндекс.Браузер, Chromium GOST) с установленным расширением КриптоПро, организуем двусторонний обмен следующими путями:

  1. Локальный HTTP-сервис 1С: 1С публикует легковесный HTTP-сервис (на локальном веб-сервере или через расширение платформы). Запущенная в браузере страница после обработки плагином отправляет результат POST-запросом через fetch() на http://localhost:порт/api/crypto-result. При этом важно корректно настроить заголовки CORS (Access-Control-Allow-Origin).
  2. Chrome DevTools Protocol (CDP):** Браузер запускается из 1С с помощью функции ЗапуститьПриложение() с параметром --remote-debugging-port=9222. Платформа 1С подключается к порту отладки по протоколу HTTP/WebSocket, удаленно передает JavaScript на выполнение и сразу считывает возвращенный ответ.

Таким образом, для большинства практических задач с КриптоПро запуск браузера является избыточным: прямая работа через COM-объекты CAdESCOM или встроенный МенеджерКриптографии обеспечивает более надежную, быструю и стабильную работу на рабочих местах пользователей.

← На главную