Как создать прикрепленную (присоединенную) электронную подпись в 1С:Предприятие?

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

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

Понимание природы подписи: прикрепленная vs открепленная

Прежде чем приступать к написанию кода, важно проанализировать разницу между двумя основными видами подписей:

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

Стандартная библиотека стандартных подсистем (БСП) в 1С изначально проектировалась для работы с открепленными подписями. Это продиктовано требованиями законодательства и регламентированного ЭДО, где важно иметь возможность прочитать исходный документ без сложных манипуляций с криптографией.

Ограничения платформы 1С и БСП

При попытке реализовать прикрепленную подпись через встроенные функции 1С, вы обнаружите, что платформа предоставляет объект МенеджерКриптографии, который работает с форматами CMS (PKCS#7) и CAdES-BES. Однако стандартные методы Подписать() при работе с файлами по умолчанию создают открепленную подпись.

Платформа не содержит «волшебной кнопки» или простого метода для автоматической склейки строки и подписи в один прикрепленный контейнер. Попытки просто объединить строку с подписью вручную не увенчаются успехом, так как формат требует соблюдения структуры ASN.1, которую «на коленке» не собрать.

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

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

  1. Отказ от высокоуровневых абстракций БСП: Стандартные функции БСП для подписания документов в 99% случаев будут возвращать только открепленную подпись.
  2. Использование API криптопровайдера: Поскольку 1С работает через криптопровайдеры (например, КриптоПро), необходимо использовать COM-объекты, которые предоставляет этот криптопровайдер (например, CAdESCOM.CadesSignedData).
  3. Настройка параметров подписи: В объектах криптопровайдера необходимо выставить соответствующие свойства (например, ContentEncoding), чтобы указать, что данные должны быть инкапсулированы в подпись.

Разбор примера работы с объектом МенеджерКриптографии

Если вы все же работаете с платформенными средствами, внимательно изучите возможности МенеджерКриптографии. Для получения параметров подписи в современных версиях БСП используется функция ПараметрыCMS:


// Пример формирования структуры параметров
СтруктураПараметров = ЭлектроннаяПодписьКлиент.ПараметрыCMS();
СтруктураПараметров.ТипПодписи = "CAdES-BES";
СтруктураПараметров.Открепленная = Ложь; // Если параметр "Истина", подпись будет открепленной

Важно помнить, что если параметр Открепленная установлен в Ложь, вы теоретически сообщаете системе о необходимости включить данные в контейнер. Однако, если после этого вы не получаете нужный результат, это означает, что специфический формат прикрепленной подписи, требуемый вашей задачей, требует прямого взаимодействия с интерфейсом CAdESCOM, минуя обертки БСП.

Рекомендации по реализации

Проанализируем ситуацию: чаще всего проблема не в «склеивании строки», а в правильно сформированном запросе к криптографическому движку. Если внешняя система ожидает именно прикрепленную подпись (Base64-строку, содержащую данные и подпись), вам следует:

  1. Инициализировать COM-объект CAdESCOM.CadesSignedData.
  2. Передать в него ваши исходные данные (строку или двоичные данные).
  3. Вызвать метод подписи, убедившись, что установлен режим CADES_BES.
  4. Получить результат через свойство Value, которое и будет содержать закодированный контейнер.

Таким образом, мы выяснили, что стандартная функциональность БСП — это отличный инструмент для типового ЭДО, но для специфических интеграций необходимо спускаться на уровень ниже, используя возможности, предоставляемые установленным в системе криптопровайдером напрямую через COM-интерфейс.

← На главную