Как реализовать подписание файлов в веб-клиенте 1С?

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

Работа с криптографией в веб-клиенте 1С существенно отличается от работы в тонком или толстом клиенте. Основная сложность заключается в том, что браузер работает в изолированной среде ("песочнице"), и прямое взаимодействие с криптографическими модулями (CSP) операционной системы невозможно без специальных расширений и асинхронных методов. В данной статье мы подробно разберем, как правильно инициализировать МенеджерКриптографии, подготовить среду и выполнить подписание файла в браузере.

Предварительные требования и настройка окружения

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

  1. Расширение для работы с криптографией: Платформа 1С использует собственное расширение для браузера (например, 1CCryptoExtension). При первом обращении к криптографическим методам система обычно предлагает его установить.
  2. КриптоПро Browser Plug-in: Если вы используете провайдер "КриптоПро", необходимо установить их официальный плагин для браузеров. Важно добавить адрес вашего веб-сервера 1С в список "Надежных узлов" в настройках этого плагина.
  3. Протокол HTTPS: Это критически важный момент. Современные браузеры блокируют доступ к криптографическим API по незащищенному протоколу HTTP. Убедитесь, что ваша база опубликована с использованием SSL-сертификата.
  4. Разрядность: Убедитесь, что разрядность браузера совпадает с разрядностью установленного криптопровайдера и плагина.

Шаг 1. Подготовка структуры данных и инициализация

Рассмотрим ситуацию, когда нам нужно подписать локальный файл. В веб-клиенте мы не можем использовать синхронные методы, поэтому весь процесс строится на цепочке оповещений (callback). Выясним, какие параметры нам понадобятся для инициализации менеджера.

Для начала создадим процедуру, которая запускает процесс. Обратите внимание на использование объекта ОписаниеОповещения. Все процедуры-обработчики в веб-клиенте должны иметь признак Экспорт, иначе платформа не сможет к ним обратиться после завершения асинхронной операции.


&НаКлиенте
Процедура ПодписатьФайл(ПутьКФайлу, СертификатОбъект)
    
    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ПодписанныйФайл", ПутьКФайлу + ".sig");
    ДополнительныеПараметры.Вставить("ИсходныйФайл", ПутьКФайлу);
    ДополнительныеПараметры.Вставить("Сертификат", СертификатОбъект);

    // Подготавливаем финальное оповещение, которое сработает после завершения всей цепочки
    ОписаниеОповещения = Новый ОписаниеОповещения("ПодписаниеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
    ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОписаниеОповещения);

    // Подготавливаем обратный вызов для инициализации менеджера
    ОбратныйВызов = Новый ОписаниеОповещения("ИнициализацияЗавершениеПодпись", ЭтотОбъект, ДополнительныеПараметры);
    
    Криптография = Новый МенеджерКриптографии;
    
    // Параметры инициализации зависят от версии ГОСТ и провайдера
    // Для КриптоПро ГОСТ Р 34.10-2001 обычно используется тип 75
    // Для КриптоПро ГОСТ Р 34.10-2012 используется тип 80 или 81
    ИмяМодуля = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
    ТипПровайдера = 80; 

    Криптография.НачатьИнициализацию(ОбратныйВызов, ИмяМодуля, "", ТипПровайдера, ИспользованиеИнтерактивногоРежимаКриптографии.Использовать);
КонецПроцедуры

Шаг 2. Обработка инициализации менеджера

После того как менеджер криптографии инициализирован, нам необходимо вызвать метод подписания. На этом этапе часто возникает ошибка "получения контекста". Проанализируем причину: она может быть вызвана неверным указанием имени модуля или типа провайдера. Если вы не уверены в точных данных провайдера, можно попробовать передать пустые строки — в некоторых случаях платформа 1С через расширение сможет определить нужный модуль автоматически на основе выбранного сертификата.


&НаКлиенте
Процедура ИнициализацияЗавершениеПодпись(Менеджер, ДополнительныеПараметры) Экспорт
    
    // Если требуется программный ввод пароля, его можно установить здесь:
    // Менеджер.ПарольДоступаКЗакрытомуКлючу = "ваш_пароль";
    
    // Создаем оповещение, которое сработает после того, как файл будет физически подписан
    Оповещение = Новый ОписаниеОповещения("ПослеПодписания", ЭтотОбъект, ДополнительныеПараметры);
    
    // Выполняем подписание
    Менеджер.НачатьПодписывание(Оповещение, 
                                ДополнительныеПараметры.ИсходныйФайл, 
                                ДополнительныеПараметры.ПодписанныйФайл, 
                                ДополнительныеПараметры.Сертификат);
КонецПроцедуры

Шаг 3. Завершение процесса и обработка результата

Разберем, что происходит после успешного (или неуспешного) формирования подписи. Метод НачатьПодписывание вернет управление в процедуру ПослеПодписания. Здесь мы можем выполнить дополнительные действия, например, сообщить пользователю об успехе или передать файл на сервер.


&НаКлиенте
Процедура ПослеПодписания(ИмяФайлаРезультата, ДополнительныеПараметры) Экспорт
    
    // ИмяФайлаРезультата содержит путь к созданному .sig файлу
    ПоказатьОповещениеПользователя("Успех", , "Файл успешно подписан: " + ИмяФайлаРезультата);
    
    // Вызываем финальное оповещение, если оно было предусмотрено логикой
    ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, ИмяФайлаРезультата);
КонецПроцедуры

&НаКлиенте
Процедура ПодписаниеЗавершение(Результат, ДополнительныеПараметры) Экспорт
    // Здесь логика окончательного завершения процесса
КонецПроцедуры

Важные нюансы работы с типами провайдеров

Проанализируем ситуацию со сменой государственных стандартов. Если ваш сертификат выпущен недавно (после 2018-2019 года), он почти наверняка использует алгоритм ГОСТ Р 34.10-2012.

Для таких сертификатов использование типа 75 приведет к ошибке контекста. Посмотрим на актуальные значения параметров:

Проблемы доступа к файловой системе в браузере

Рассмотрим еще одно ограничение: работа с прямыми путями к файлам в веб-клиенте может быть заблокирована политиками безопасности Chrome или Firefox. Если код выше выдает ошибку доступа к файлу, рекомендуется изменить алгоритм:

  1. Использовать метод НачатьПомещениеФайлаНаСервер для получения объекта ДвоичныеДанные.
  2. Передавать в метод НачатьПодписывание не строковый путь, а объект ДвоичныеДанные.
  3. В этом случае метод вернет подписанные двоичные данные, которые можно сразу сохранить или отправить в информационную базу.

Совет: Всегда проверяйте наличие пароля на контейнер закрытого ключа. В веб-клиенте, если ИспользованиеИнтерактивногоРежимаКриптографии.Использовать включено, должно появиться стандартное окно ввода пароля от КриптоПро. Если оно не появляется, проверьте, не заблокированы ли всплывающие окна вашим браузером (ищите значок блокировки в адресной строке).

← На главную