При разработке интеграционных решений, взаимодействующих с внешними сервисами, часто возникает задача формирования электронной подписи. При этом разработчики сталкиваются с вопросом: как реализовать формирование прикрепленной подписи, когда исходные данные и сама подпись должны составлять единый объект (контейнер). Разберем, почему стандартные инструменты 1С не всегда подходят для этой цели и как подойти к решению задачи правильно.
Прежде чем приступать к написанию кода, важно проанализировать разницу между двумя основными видами подписей:
Стандартная библиотека стандартных подсистем (БСП) в 1С изначально проектировалась для работы с открепленными подписями. Это продиктовано требованиями законодательства и регламентированного ЭДО, где важно иметь возможность прочитать исходный документ без сложных манипуляций с криптографией.
При попытке реализовать прикрепленную подпись через встроенные функции 1С, вы обнаружите, что платформа предоставляет объект МенеджерКриптографии, который работает с форматами CMS (PKCS#7) и CAdES-BES. Однако стандартные методы Подписать() при работе с файлами по умолчанию создают открепленную подпись.
Платформа не содержит «волшебной кнопки» или простого метода для автоматической склейки строки и подписи в один прикрепленный контейнер. Попытки просто объединить строку с подписью вручную не увенчаются успехом, так как формат требует соблюдения структуры ASN.1, которую «на коленке» не собрать.
Для решения задачи, требующей именно прикрепленной подписи, рекомендуем придерживаться следующих шагов:
CAdESCOM.CadesSignedData).ContentEncoding), чтобы указать, что данные должны быть инкапсулированы в подпись.Если вы все же работаете с платформенными средствами, внимательно изучите возможности МенеджерКриптографии. Для получения параметров подписи в современных версиях БСП используется функция ПараметрыCMS:
// Пример формирования структуры параметров
СтруктураПараметров = ЭлектроннаяПодписьКлиент.ПараметрыCMS();
СтруктураПараметров.ТипПодписи = "CAdES-BES";
СтруктураПараметров.Открепленная = Ложь; // Если параметр "Истина", подпись будет открепленной
Важно помнить, что если параметр Открепленная установлен в Ложь, вы теоретически сообщаете системе о необходимости включить данные в контейнер. Однако, если после этого вы не получаете нужный результат, это означает, что специфический формат прикрепленной подписи, требуемый вашей задачей, требует прямого взаимодействия с интерфейсом CAdESCOM, минуя обертки БСП.
Проанализируем ситуацию: чаще всего проблема не в «склеивании строки», а в правильно сформированном запросе к криптографическому движку. Если внешняя система ожидает именно прикрепленную подпись (Base64-строку, содержащую данные и подпись), вам следует:
CAdESCOM.CadesSignedData.CADES_BES.Value, которое и будет содержать закодированный контейнер.Таким образом, мы выяснили, что стандартная функциональность БСП — это отличный инструмент для типового ЭДО, но для специфических интеграций необходимо спускаться на уровень ниже, используя возможности, предоставляемые установленным в системе криптопровайдером напрямую через COM-интерфейс.