Как в 1С подписать файл электронной подписью и сохранить её вместе с документом?

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

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

Анализируем работу методов объекта МенеджерКриптографии

Рассмотрим стандартный пример кода, вызывающий вопросы у начинающих разработчиков при подписании файлов:


МенКрипт = Новый МенеджерКриптографии("Infotecs Cryptographic Service Provider", "", 2);

// Вариант 1: сохранение подписи в отдельный файл
МенКрипт.Подписать("C:\1.pdf", "C:\1.p7s", Сертификат);

// Вариант 2: вызов метода в виде функции
ДвоичныеДанныеПодписи = МенКрипт.Подписать(Новый ДвоичныеДанные("C:\1.txt"), Сертификат);

Проанализируем поведение этих двух вариантов вызова метода Подписать:

  1. Процедура с тремя параметрами: первый параметр указывает путь к исходному файлу на диске, второй — путь к создаваемому файлу подписи, третий — сертификат. На диске создается отдельный файл (обычно с расширением .p7s или .sig).
  2. Функция с двумя параметрами: на вход передаются данные для подписания (в виде объекта ДвоичныеДанные или пути к файлу) и сертификат. Метод возвращает объект ДвоичныеДанные, содержащий сформированную электронную подпись. Исходные данные при этом не модифицируются.

Таким образом, во втором случае подпись никуда не прячется внутри файла: она возвращается в виде двоичных данных, которые разработчик может сохранить в реквизит базы данных, передать по API или записать в отдельный файл.

Разновидности форматов электронной подписи

Чтобы понять, почему файл не изменяется сам по себе, рассмотрим подробнее базовые разновидности формирования ЭП:

  1. Отсоединенная подпись (detached CMS / PKCS#7): файл данных и подпись существуют строго раздельно (например, document.pdf и document.pdf.p7s). Хеш-сумма вычисляется от исходного содержимого. Документ можно спокойно открыть в стандартной программе (Word, Acrobat Reader), а подпись хранится рядом. Это самый распространенный формат в российском ЮЗЭДО.
  2. Присоединенная подпись (attached / enveloped CMS / PKCS#7): исходный файл упаковывается внутрь криптографического контейнера вместе с подписью (обычно файлы .p7m или .sig). Открыть такой файл стандартной программой просмотра уже нельзя: сначала необходимо криптографически извлечь исходный файл из контейнера.
  3. Встроенная подпись (PAdES для PDF, XMLDSig для XML, подписи в документах MS Office): электронная подпись внедряется непосредственно в спецификацию структуры файла (например, в специальные блоки метаданных PDF). Файл сохраняет читаемость стандартными средствами, и программа сама отображает визуальный штамп и валидность сертификата.

Как объединить файл и подпись в 1С

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

Способ 1. Упаковка в единый ZIP-архив (стандарт ЮЗЭДО)

Для большинства учетных и юридических задач модифицировать сам файл не требуется. Более того, изменение структуры файла часто приводит к нарушению проверки целостности. Общепринятым стандартом является формирование архивного пакета:

  1. Формируем исходный документ (например, Счет.pdf).
  2. Формируем отсоединенные файлы подписей сторон (Счет.pdf.sig для первой подписи, Счет_контрагент.pdf.sig для второй подписи).
  3. Упаковываем исходный файл и файлы подписей в единый ZIP-архив средствами объекта ЗаписьZipФайла.

Посмотрим на пример упаковки пакета в архив средствами встроенного языка 1С:


ИмяАрхива = "C:\Документы\ПакетДокументов.zip";
Архив = Новый ЗаписьZipФайла(ИмяАрхива);
Архив.Добавить("C:\Документы\1.pdf");
Архив.Добавить("C:\Документы\1.pdf.p7s");
Архив.Записать();

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

Способ 2. Использование возможностей присоединенной подписи

Если бизнес-процесс требует передачи именно одного файла-контейнера, содержащего и данные, и подпись:

  1. В современных версиях платформы (начиная с 8.3.26): в объекте МенеджерКриптографии реализована штатная работа с присоединенными подписями через свойство ВключениеДанныхВПодпись, а также специальные методы проверки и извлечения исходных данных.
  2. Через COM-объекты криптопровайдера (Windows): можно использовать библиотеки криптопровайдеров (например, интерфейс CAdESCOM.CadesSignedData), где при вызове метода подписания параметру признака отсоединенности передается значение Ложь.
  3. Через консольные утилиты: вызов утилит командной строки криптопровайдера через метод платформы ЗапуститьПриложение().

Способ 3. Встраивание подписи в PDF (PAdES)

Платформа 1С:Предприятие не имеет встроенного функционала для модификации бинарной структуры PDF-файлов с внедрением стандартов PAdES. Для реализации именно встроенной в PDF подписи применяются внешние специализированные компоненты, SDK разработчиков криптопровайдеров или консольные утилиты, умеющие работать со спецификацией PDF.

Как технически работает отзыв подписи и проверка сертификатов

Выясним причину, почему сама подпись технически не может быть «отозвана». Электронная подпись представляет собой математический результат шифрования хеш-суммы документа закрытым ключом. Отозвать можно только сертификат открытого ключа в удостоверяющем центре (УЦ).

Проверка статуса сертификата выполняется криптопровайдером следующими путями:

  1. Списки отзыва (CRL — Certificate Revocation List): периодически скачиваемый файл со списком серийных номеров аннулированных сертификатов.
  2. Онлайн-протокол OCSP (Online Certificate Status Protocol): отправка прямого запроса в УЦ в момент проверки подписи.
  3. Усовершенствованная подпись (CAdES-X Long / CAdES-A): в структуру подписи внедряются метки времени (TSP) и доказательства валидности (OCSP-ответы и CRL) на момент подписания, что гарантирует признание подписи даже после истечения или отзыва сертификата в будущем. В платформе 1С для этого используется метод УсовершенствоватьПодпись объекта МенеджерКриптографии.
← На главную