При разработке интеграционных механизмов часто возникает необходимость выполнить JavaScript-сценарий в браузере и вернуть результат его работы обратно в 1С. Типичный сценарий — вызов функций плагина «КриптоПро ЭЦП Browser plug-in» для формирования или проверки электронной подписи. Разберем по шагам доступные способы решения этой задачи: от использования встроенного в форму поля HTML-документа до прямого обращения к криптографическим библиотекам платформы без запуска стороннего браузера.
Если требуется запускать JavaScript-код и перехватывать результат непосредственно внутри клиентского приложения 1С, наиболее простым решением является размещение на форме элемента с типом ПолеHTMLДокумента. Выясним, как передавать данные между скриптом страницы и кодом 1С.
Рассмотрим классический механизм перехвата событий HTML-документа:
Посмотрим на пример структуры 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 внутри встроенного поля может завершаться ошибкой. В таком случае следует применять альтернативные подходы.
Проанализируем архитектуру плагина КриптоПро ЭЦП. В операционных системах семейства Windows дистрибутив плагина регистрирует в системе стандартные COM-библиотеки CAdESCOM. Это позволяет платформе 1С обращаться ко всем криптографическим операциям напрямую без открытия браузера и запуска сторонних JS-скриптов.
Разберем основные COM-объекты библиотеки CAdESCOM:
CAdESCOM.CadesSignedData — основной объект для формирования и проверки усовершенствованной электронной подписи (CAdES-BES, CAdES-T, CAdES-X Long Type 1).CAdESCOM.CPSigner — параметры подписанта, включая выбор сертификата и установку свойств подписи.CAdESCOM.Store или CAPICOM.Store — доступ к системным хранилищам сертификатов («Личные», сертификаты компьютера).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. При несоответствии платформа выдаст ошибку «Класс не зарегистрирован».
Если задача заключается исключительно в подписании, шифровании или проверке ГОСТ-подписи, оптимальным решением является использование штатного объекта платформы МенеджерКриптографии. В этом случае отпадает необходимость как в запуске браузера, так и в подключении сторонних COM-объектов.
Разберем по шагам настройку работы через менеджер криптографии:
МенеджерКриптографии с указанием криптопровайдера (например, "Crypto-Pro GOST R 34.12-2015 / 34.10-2012 CSP" или алгоритмов ГОСТ 2001).ПолучитьСертификаты() или устанавливаем сертификат подписанта.Подписать() или ПодписатьАсинх().
&НаКлиенте
Асинх Процедура ПодписатьФайлШтатно(ПутьКФайлуДанных, ПутьКФайлуПодписи, Отпечаток)
Менеджер = Новый МенеджерКриптографии(
"Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
"",
80 // Тип провайдера для ГОСТ-2012 (PROV_GOST_2012_256)
);
Хранилище = Ждать Менеджер.ПолучитьСертификатыАсинх();
СертификатПодписанта = Неопределено;
Для Каждого Серт Из Хранилище Цикл
Если ВРег(Серт.Отпечаток) = ВРег(Отпечаток) Тогда
СертификатПодписанта = Серт;
Прервать;
КонецЕсли;
КонецЦикла;
Если СертификатПодписанта = Неопределено Тогда
Сообщить("Сертификат не найден.");
Возврат;
КонецЕсли;
Ждать Менеджер.ПодписатьАсинх(ПутьКФайлуДанных, ПутьКФайлуПодписи, СертификатПодписанта);
Сообщить("Файл успешно подписан встроенным механизмом 1С.");
КонецПроцедуры
Если сценарий строго требует запуска полноценного внешнего браузера (Google Chrome, Яндекс.Браузер, Chromium GOST) с установленным расширением КриптоПро, организуем двусторонний обмен следующими путями:
fetch() на http://localhost:порт/api/crypto-result. При этом важно корректно настроить заголовки CORS (Access-Control-Allow-Origin).ЗапуститьПриложение() с параметром --remote-debugging-port=9222. Платформа 1С подключается к порту отладки по протоколу HTTP/WebSocket, удаленно передает JavaScript на выполнение и сразу считывает возвращенный ответ.Таким образом, для большинства практических задач с КриптоПро запуск браузера является избыточным: прямая работа через COM-объекты CAdESCOM или встроенный МенеджерКриптографии обеспечивает более надежную, быструю и стабильную работу на рабочих местах пользователей.