В современной практике электронного документооборота часто возникает задача не просто подписать файл, а сделать это так, чтобы электронная подпись (ЭЦП) была внедрена непосредственно в структуру документа Microsoft Excel. Стандартные средства платформы 1С, такие как МенеджерКриптографии, по умолчанию создают отсоединенную подпись в формате .p7s. Это не всегда удобно, так как пользователю приходится оперировать двумя файлами вместо одного.
В этой статье мы разберем, как с помощью установленного плагина КриптоПро Office Signature и механизмов COM-соединения реализовать подписание файлов Excel прямо из кода 1С, чтобы подпись отображалась внутри самого документа.
Рассмотрим стандартный подход, который часто пытаются использовать разработчики. Проанализируем типичный фрагмент кода:
МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider","",80);
ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов();
Сертификаты = ХранилищеСертификатов.ПолучитьВсе();
МенеджерКриптографии.Подписать(ИмяФайла, Сертификаты[0]);
Выясним причину, по которой этот код "не работает" для нашей задачи. Функция Подписать возвращает двоичные данные подписи. Если вы вызываете её как процедуру, система отрабатывает без ошибок, но исходный файл на диске никак не меняется. Если же сохранить результат работы функции в файл с расширением .xlsx, документ не откроется, так как 1С выдает "чистую" подпись PKCS#7, которая не является валидным XML-архивом Excel. Наша цель — формат XAdES, который поддерживается продуктом КриптоПро Office Signature.
Перед тем как приступать к написанию кода, необходимо убедиться, что на рабочем месте выполнены следующие условия:
Поскольку КриптоПро Office Signature является расширением для Office, дотянуться до его функционала можно только через объектную модель самого Excel. Нам потребуется использовать коллекцию Signatures и метод AddNonVisibleSignature.
Разберем по шагам реализацию этой задачи. Самым важным моментом здесь является использование уникального идентификатора (GUID) провайдера КриптоПро. Для Office Signature он неизменен: {F5AC7D23-DA04-45F5-ABCB-38CE7A982553}.
Рассмотрим пример кода для подписания файла:
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = Ложь;
Excel.Visible = Ложь;
Исключение
Сообщить("Не удалось запустить Excel. Проверьте установку Microsoft Office.");
Возврат;
КонецПопытки;
Попытка
Книга = Excel.Workbooks.Open(ПолноеИмяФайла);
// Идентификатор плагина КриптоПро Office Signature
varSigProviderID = "{F5AC7D23-DA04-45F5-ABCB-38CE7A982553}";
// Метод добавляет невидимую подпись в документ
// При вызове может появиться стандартное окно выбора сертификата
Подпись = Книга.Signatures.AddNonVisibleSignature(varSigProviderID);
Книга.Save();
Книга.Close();
Excel.Quit();
Сообщить("Файл успешно подписан внутри структуры Excel.");
Исключение
Excel.Quit();
Сообщить("Ошибка при подписании: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем важный нюанс: при вызове метода AddNonVisibleSignature Microsoft Office по соображениям безопасности может открывать диалоговое окно выбора сертификата или подтверждения операции. Это делает невозможным полностью "тихое" подписание на стороне сервера 1С без участия пользователя.
Чтобы минимизировать появление окон, убедитесь в следующем:
Важный момент: Если вы планируете подписывать документы на сервере (в фоновом задании), помните, что запуск COM-объектов под учетной записью службы (например, USR1CV8) сильно ограничен настройками DCOM и отсутствием графического сеанса. В большинстве случаев такая задача должна выполняться на стороне клиента.
После выполнения кода откройте файл Excel вручную. В нижней части окна (в строке состояния) должен появиться значок красной печати. При нажатии на него откроется панель "Подписи", где будет указано, что документ подписан, подпись действительна и предоставлена провайдером КриптоПро.
Если использование тяжелого COM-объекта Excel недопустимо (например, на сервере Linux или если Office не установлен), существуют альтернативные пути решения через низкоуровневую работу с форматом Open XML. Файл Excel представляет собой ZIP-архив с набором XML-файлов. Подпись в формате XAdES хранится в папке _xmlsignatures.
Для реализации такого подхода потребуется:
Этот метод значительно сложнее в реализации и требует глубоких знаний структуры документов Office и криптографических стандартов, поэтому использование COM-объекта Excel совместно с КриптоПро Office Signature остается наиболее надежным и быстрым способом решения задачи для платформы 1С.
Мы рассмотрели, как интегрировать функции подписания документов непосредственно в файлы Excel. Ключевым фактором успеха здесь является правильное использование SignatureSet и знание GUID провайдера. Помните, что безопасность закрытого ключа — это приоритет, поэтому всегда учитывайте, в каком контексте (клиентском или серверном) выполняется ваш код.