При работе в терминальном режиме часто возникает проблема: ключ электронной подписи (КЭП) физически доступен только на рабочем месте бухгалтера, а отправку документов необходимо реализовать для всех пользователей системы. Поскольку современные закрытые части ключей часто являются неэкспортируемыми, задача требует переноса логики подписания на серверный уровень.
Для того чтобы документы подписывались корректно вне зависимости от того, кто нажал кнопку отправки, мы должны отойти от клиентских вызовов. Рассмотрим пошаговый алгоритм реализации централизованного механизма:
КриптоПро и подписание данных, должны быть перенесены из модулей &НаКлиенте в модули &НаСервере. Это фундаментальное требование, так как клиентское приложение не всегда имеет прямой доступ к контейнеру ключа на сервере.Агент сервера 1С:Предприятия. Рассмотрим этот этап подробнее:
usr1cv8 или аналогичный сервисный аккаунт).КриптоПро CSP, установите личный сертификат и обеспечьте доступ службы к закрытому контейнеру.Агент сервера 1С:Предприятия, чтобы изменения вступили в силу.Чтобы обеспечить стабильную работу, не стоит пытаться подписывать документ в момент нажатия кнопки пользователем. Лучше всего организовать схему Очередь на подпись. Разберем, как это работает:
Создайте Регистр сведений, в котором будут храниться данные о документе, ожидающем отправки. Пользователь, нажимая кнопку «Отправить», просто создает запись в этом регистре со статусом «К подписанию».
// Пример логики добавления в очередь
Запись = РегистрыСведений.ОчередьЭДО.СоздатьМенеджерЗаписи();
Запись.Документ = СсылкаНаДокумент;
Запись.Статус = Перечисления.СтатусыЭДО.КПодписанию;
Запись.ДатаДобавления = ТекущаяДата();
Запись.Записать();
Далее, с помощью Регламентного задания, которое выполняется на сервере, мы периодически сканируем этот регистр и выполняем фактическую подпись и отправку.
// Фрагмент кода регламентного задания
Выборка = РегистрыСведений.ОчередьЭДО.ВыбратьПоСтатусу(Перечисления.СтатусыЭДО.КПодписанию);
Пока Выборка.Следующий() Цикл
// Вызов функции подписания на сервере
Результат = ПодписатьНаСервере(Выборка.Документ);
Если Результат.Успех Тогда
// Отправить документ в СБИС
ОтправитьВЭДО(Выборка.Документ);
КонецЕсли;
КонецЦикла;
Рассматривая данную задачу, мы должны помнить о лицензионных ограничениях КриптоПро. При использовании на MS Windows Server обязательно наличие серверной лицензии. Несоблюдение этого условия приведет к нарушению лицензионного соглашения.
Также проанализируем вопросы безопасности:
1С используйте ИНН организации для выбора нужного сертификата из хранилища:
Сертификат = Сертификаты.НайтиПоРеквизиту("ИНН", ИНН_Организации);
ПодписатьДанные(Данные, Сертификат);
Данный подход — перенос исполнения на сторону Сервера приложений — является наиболее надежным способом избежать проблем с пробросом ключей через RDP и обеспечивает стабильную работу ЭДО для всех пользователей конфигурации.