Разработка и Конфигурация · 11 мин
Как программно подписать документ ЭЦП в 1С
Программное подписание документов ЭЦП в 1С: менеджер криптографии, подписание файлов и объектов, проверка подписи, типичные ошибки и примеры кода.
Задача подписать документ электронной подписью из кода 1С возникает при обмене с ЭДО-операторами, при отправке отчётности, при интеграции с внешними системами и при автоматизации документооборота. В типовых конфигурациях для этого предусмотрена подсистема «Электронная подпись» из Библиотеки стандартных подсистем (БСП), а на уровне платформы работают объекты «МенеджерКриптографии» и «СертификатКриптографии».
Выбор подхода зависит от контекста: если конфигурация построена на БСП, правильнее использовать её программный интерфейс — он уже умеет искать сертификаты, работать с токенами и хранить подписи. Если решение самописное или нужен минимальный код без зависимостей, достаточно встроенных объектов платформы. Оба варианта рассмотрены ниже с рабочими примерами.
Важное ограничение: криптографические операции в 1С выполняются через внешние криптопровайдеры (КриптоПро CSP, ViPNet CSP и аналоги). Сам по себе код на встроенном языке подпись не формирует — он обращается к установленной на компьютере или сервере программе криптографии. Это определяет большинство ошибок, с которыми сталкиваются разработчики.
Что нужно подготовить перед подписанием
До написания кода проверьте инфраструктуру, иначе получите ошибку уже на первом вызове. Минимальный набор: установленный криптопровайдер с действующей лицензией, сертификат ключа подписи, установленный в хранилище (локального компьютера или текущего пользователя), и доступ к закрытому ключу — на токене (Рутокен, eToken) или в реестре.
Если подписание выполняется на сервере 1С (в фоновом задании, веб-сервисе, регламентной операции), криптопровайдер и сертификат должны быть установлены именно на сервере, а сертификат — в хранилище локального компьютера с доступом для учётной записи агента сервера 1С. Это самая частая причина ситуации «на клиенте подписывает, на сервере — нет».
Для конфигураций на БСП дополнительно включите функциональную опцию «Использовать электронные подписи» и настройте программу криптографии в разделе администрирования: укажите тип программы, путь к модулям и алгоритмы. Без этой настройки общий модуль «ЭлектроннаяПодпись» не найдёт криптопровайдер.
Подписание через объекты платформы
Базовый сценарий без БСП выглядит так: создаётся менеджер криптографии, из него запрашивается сертификат, затем вызывается метод подписания данных. Платформа сама обращается к установленному криптопровайдеру.
Менеджер = Новый МенеджерКриптографии("", "", 75);
Хранилище = Менеджер.ПолучитьХранилищеСертификатов(
ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
Сертификаты = Хранилище.ПолучитьВсе();
Сертификат = Сертификаты[0]; // в реальном коде — поиск по отпечатку
ДанныеДокумента = ПолучитьДвоичныеДанные("C:\Документы\Счет.pdf");
Подпись = Менеджер.Подписать(ДанныеДокумента, Сертификат);
Подпись.Записать("C:\Документы\Счет.pdf.sig");
Конструктор менеджера принимает имя криптопровайдера, путь к модулям и тип. Если передать пустые строки, платформа использует программу по умолчанию. Тип 75 соответствует КриптоПро CSP; для других провайдеров значение отличается и указывается в документации производителя.
На практике сертификат ищут не по индексу, а по отпечатку (SHA-1 отпечаток сертификата, который можно посмотреть в свойствах сертификата в оснастке Windows) или по субъекту. Хранение отпечатка нужного сертификата в константе или регистре сведений делает код предсказуемым при наличии нескольких сертификатов.
Отпечаток = "A1B2C3D4E5F6..."; // отпечаток сертификата
Сертификат = Хранилище.НайтиПоОтпечатку(Новый ДвоичныеДанные(Отпечаток));Подписание через БСП: модуль «ЭлектроннаяПодпись»
В конфигурациях на БСП (УТ, ERP, Бухгалтерия, Документооборот и других) рекомендуемый путь — программный интерфейс общего модуля «ЭлектроннаяПодпись». Он скрывает работу с криптопровайдером, умеет получать сертификаты из справочника, обрабатывать пароли и сохранять подписи в базе.
ОписаниеДанных = Новый Структура;
ОписаниеДанных.Вставить("Операция", "Подписание");
ОписаниеДанных.Вставить("ОтборСертификатов", МассивСертификатов);
ДанныеДляПодписания = Новый Массив;
Элемент = Новый Структура;
Элемент.Вставить("Данные", ДвоичныеДанныеФайла);
ДанныеДляПодписания.Добавить(Элемент);
ОписаниеДанных.Вставить("НаборДанных", ДанныеДляПодписания);
ЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных);
Для серверного подписания без интерактивного взаимодействия используется функция «ЭлектроннаяПодпись.Подписать» или механизмы фонового подписания. Учтите, что серверный вызов требует настроенной криптографии на сервере и заранее сохранённого пароля к закрытому ключу (в БСП пароль может храниться в безопасном хранилище данных).
Для подписания объектов базы (элементов справочников, документов) БСП предлагает метод «ДобавитьПодпись», который сохраняет подпись в табличной части или регистре подписей объекта. Это удобно для сценариев «подписать счёт при утверждении» без выгрузки файла.
Подписание файла и отсоединённая подпись
Чаще всего для обмена требуется отсоединённая подпись (detached): файл документа остаётся без изменений, а подпись сохраняется отдельным файлом с расширением .sig или .p7s. Метод «Подписать» платформы по умолчанию формирует именно такой вариант, что видно в примере выше.
Если контрагент или оператор ЭДО требует присоединённую подпись (CMS-контейнер с данными внутри), её обычно формируют средствами криптопровайдера или внешних утилит, потому что штатный метод платформы ориентирован на отсоединённый формат. Уточняйте требования приёмной стороны до выбора реализации — переделка формата подписи после внедрения обходится дорого.
Сравнение вариантов
Подходит для самописных решений и простых сценариев. Нет зависимости от БСП, но вся логика поиска сертификатов и хранения подписей — на разработчике.
Подходит для типовых конфигураций. Готовые механизмы хранения подписей, работы с токенами и проверки, но требует включённой подсистемы и её настройки.
Подходит для нестандартных форматов (присоединённая подпись, усовершенствованная подпись с меткой времени). Усложняет развёртывание и сопровождение.
Проверка подписи и контроль результата
После подписания проверьте результат программно — это защищает от ситуации, когда файл подписи создан, но криптографически невалиден. У платформы для этого есть метод «ПроверитьПодпись» менеджера криптографии, в БСП — функция «ПроверитьПодпись» общего модуля.
Попытка
Менеджер.ПроверитьПодпись(ДанныеДокумента, Подпись);
// подпись валидна
Исключение
Сообщить("Подпись не прошла проверку: "
+ ОписаниеОшибки());
КонецПопытки;
Проверка подтверждает целостность данных и соответствие сертификата, но не проверяет действительность сертификата по списку отзыва и цепочке доверия — для юридически значимой проверки используются средства криптопровайдера или сервисы проверки. В типовых обменах ЭДО эту проверку выполняет оператор.
Как проверить результат
Файл .sig существует и имеет ненулевой размер
Файл отсутствует или размером 0 байт
Метод выполняется без исключения
Исключение «Подпись неверна» или ошибка криптопровайдера
Отображается сертификат и статус «подпись верна»
Ошибка цепочки сертификатов или «данные повреждены»
Типичные ошибки и их причины
Ошибка «Не найден сертификат» почти всегда означает, что код выполняется не в том контексте: сертификат установлен у пользователя, а подписание идёт на сервере, или сертификат лежит в хранилище локального компьютера, а ищется в хранилище пользователя. Проверьте тип хранилища и место выполнения кода.
Ошибка «Криптопровайдер не найден» указывает на отсутствие или неверный тип программы криптографии. На 64-разрядном сервере 1С криптопровайдер должен быть 64-разрядным; на тонком и веб-клиенте требуется установка расширения работы с криптографией и, для браузера, плагина.
Отдельный класс проблем — пароль закрытого ключа. Если ключ на токене, интерактивное окно ввода PIN на сервере не появится, и операция зависнет или упадёт. Для серверных сценариев пароль задаётся программно через свойства сертификата или механизмы БСП, либо используется режим криптопровайдера с запомненным паролем.
Ограничения и безопасная автоматизация
Полностью автоматическое подписание без участия человека допустимо только при надёжной защите закрытого ключа: токен с ограниченным доступом, сервер в контролируемом помещении, журналирование операций. Для юридически значимых документов уточните у юриста, допустима ли в вашем процессе серверная подпись без подтверждения пользователем — требования зависят от вида документов и соглашений с контрагентами.
При массовом подписании учитывайте производительность: каждая операция — обращение к криптопровайдеру, и на токенах она заметно медленнее, чем на программных ключах. Для пакетных сценариев группируйте операции, не пересоздавайте менеджер криптографии на каждый документ и тестируйте время на реальном объёме.
Что важно запомнить
Подписание в 1С выполняется через МенеджерКриптографии или модуль БСП «ЭлектроннаяПодпись» и всегда опирается на установленный криптопровайдер и доступный закрытый ключ. Сначала настройте инфраструктуру на том узле, где выполняется код, затем ищите сертификат по отпечатку, подписывайте и обязательно проверяйте подпись программно.
Частые вопросы
Можно ли подписать документ на веб-клиенте?
Да, но потребуется установка расширения работы с криптографией для браузера и, для большинства браузеров, дополнительного плагина криптопровайдера. Сертификат должен быть доступен на компьютере пользователя. Если подписание массовое, удобнее вынести его на сервер.
Как подписать документ конкретным сертификатом, если их несколько?
Надёжнее всего искать сертификат по отпечатку: сохраните отпечаток нужного сертификата в настройках (константа, регистр сведений) и используйте метод «НайтиПоОтпечатку» хранилища сертификатов. Поиск по субъекту менее надёжен, так как строки субъекта могут совпадать или отличаться форматированием.
Чем отличается отсоединённая подпись от присоединённой?
Отсоединённая хранится отдельным файлом, исходный документ не меняется — для проверки нужны оба файла. Присоединённая упаковывает данные и подпись в один контейнер, который без криптосредств не прочитать. Метод платформы «Подписать» формирует отсоединённую подпись.
Почему на сервере код не видит токен с ключом?
Служба агента сервера 1С работает под отдельной учётной записью и не имеет доступа к токену, подключённому в сеансе пользователя. Для серверного подписания используют сертификаты в хранилище локального компьютера с программными ключами либо специализированные HSM/сетевые решения криптопровайдера.
Можно ли проверить подпись, созданную вне 1С?
Да, если подпись соответствует стандартам, которые поддерживает установленный криптопровайдер. Загрузите данные и подпись как двоичные данные и вызовите «ПроверитьПодпись» менеджера криптографии. Подписи нестандартных форматов проверяются средствами того ПО, которым они созданы.
Нужна ли лицензия на криптопровайдер для серверного подписания?
Да, криптопровайдер лицензируется отдельно от 1С, и для серверной установки обычно требуется серверная лицензия соответствующего производителя. Работа на просроченной или клиентской лицензии может приводить к отказу операций и юридическим рискам.