Как программно подписать документ сертификатом из ХранилищаЗначений в 1С:Бухгалтерия 2.0

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия
← На главную

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

Разбор архитектуры хранения сертификата

Часто в кастомизированных решениях (например, для работы с ИС ЭСФ) сертификаты пользователей хранятся непосредственно в базе данных в реквизитах с типом ХранилищеЗначений. Рассмотрим типичную ситуацию: у нас есть справочник ПользователиИСЭСФ, где в реквизите СертификатАутентификации хранится сам файл сертификата.

Первая задача, с которой мы сталкиваемся — корректное извлечение данных. Метод Получить() объекта ХранилищеЗначений может возвращать разные типы данных в зависимости от того, как они были туда записаны: это могут быть либо прямые ДвоичныеДанные, либо строка в формате Base64.

Проанализируем пример кода для корректного извлечения данных сертификата и инициализации объекта криптографии:


// Получаем пароль и данные из справочника
Пароль = Объект.Сертификат.ПарольАутентификации;
ДанныеХранилища = Объект.Сертификат.СертификатАутентификации.Получить();

// Если данные сохранены как Base64-строка, преобразуем их
Если ТипЗнч(ДанныеХранилища) = Тип("Строка") Тогда
    ДвоичныеДанныеСертификата = Base64Значение(ДанныеХранилища);
Иначе
    ДвоичныеДанныеСертификата = ДанныеХранилища;
КонецЕсли;

// Создаем объект сертификата
Попытка
    Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификата);
Исключение
    Сообщить("Ошибка при создании контекста сертификата: " + ОписаниеОшибки());
КонецПопытки;

Инициализация Менеджера криптографии

Для выполнения самой операции подписания в 1С используется объект МенеджерКриптографии. При его создании крайне важно правильно указать имя криптопровайдера и тип провайдера. Если вы используете стандартные средства Windows, это может быть "Microsoft Enhanced Cryptographic Provider v1.0" с типом 1. Однако, если речь идет о специализированных системах (например, НУЦ РК или КриптоПро), параметры будут иными.

Разберем установку параметров менеджера:


// Инициализация менеджера криптографии
// Параметры: Имя провайдера, Имя пути (пусто для дефолта), Тип провайдера
МК = Новый МенеджерКриптографии("Microsoft Enhanced Cryptographic Provider v1.0", "", 1);

// Установка пароля для доступа к закрытому ключу
МК.ПарольДоступаКЗакрытомуКлючу = Пароль;

Важно помнить, что в 1С 8.3 работа с криптографией на клиенте и сервере может отличаться. В обычных формах код чаще всего выполняется на стороне клиента, что упрощает доступ к локальным криптопровайдерам пользователя. В случаях, когда программная реализация в интерфейсе 1С слишком сложна, доступна платформа для создания программных роботов One RPA для автоматизации действий пользователя без изменения кода.

Проблема: Сертификат отсутствует в персональном хранилище

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

Процесс подписания требует наличия закрытого ключа. В архитектуре Windows CryptoAPI (которую использует 1С через МенеджерКриптографии) закрытый ключ обычно не хранится в самом файле сертификата .cer. Он находится в защищенном контейнере (в реестре, на токене или в файле ключа). Чтобы 1С смогла "связать" сертификат из базы с закрытым ключом на компьютере, этот сертификат должен быть установлен в личное хранилище пользователя (Personal/My).

Алгоритм решения проблемы:

  1. Убедитесь, что сертификат установлен в Windows под той учетной записью, под которой запускается сеанс 1С.
  2. Проверьте, что в свойствах установленного сертификата есть пометка "Есть закрытый ключ, соответствующий этому сертификату".
  3. Если подписание происходит на стороне сервера 1С, сертификат должен быть установлен в хранилище служебной учетной записи (например, USR1CV8), что технически сложнее и требует прав администратора.

Финальная сборка функции подписания

Если в вашей конфигурации нет модулей БСП (типа ЭлектроннаяПодпись), вы можете использовать прямой метод менеджера криптографии Подписать(). Выясним, как это реализовать на практике, объединив все шаги.


Функция ПодписатьДанные(ДанныеДляПодписи, СсылкаНаСертификат) Экспорт
    
    // 1. Извлекаем данные
    Пароль = СсылкаНаСертификат.ПарольАутентификации;
    Хранилище = СсылкаНаСертификат.СертификатАутентификации;
    ДвоичныеДанныеСертификата = Хранилище.Получить();
    
    // 2. Настраиваем менеджер
    МК = Новый МенеджерКриптографии("Microsoft Enhanced Cryptographic Provider v1.0", "", 1);
    МК.ПарольДоступаКЗакрытомуКлючу = Пароль;
    
    // 3. Создаем объект сертификата для поиска в хранилище ОС
    СертификатОбъект = Новый СертификатКриптографии(ДвоичныеДанныеСертификата);
    
    // 4. Подписываем
    Попытка
        // Метод возвращает двоичные данные подписи
        РезультатПодписи = МК.Подписать(ДанныеДляПодписи, СертификатОбъект);
        Возврат РезультатПодписи;
    Исключение
        Сообщить("Не удалось подписать данные: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Проанализируем ситуацию с форматом подписи. Метод Подписать() по умолчанию создает отсоединенную подпись в формате CMS. Если внешняя система (например, государственный портал) требует присоединенную подпись или специфический стандарт (CAdES), вам может потребоваться использование сторонних COM-объектов или внешних компонент, так как штатный МенеджерКриптографии в старых версиях платформы ограничен в настройках формата.

Особенности для Казахстана (ИС ЭСФ)

Если вы работаете с сертификатами НУЦ РК для системы ЭСФ, стандартный провайдер Microsoft не подойдет. В этом случае в системе должен быть установлен Kalkan Cryptographic Provider. При инициализации менеджера криптографии тип провайдера обычно указывается как 75, а имя провайдера должно соответствовать установленному в системе (например, "Kalkan Cryptographic Service Provider"). Без этого 1С не сможет распознать алгоритмы ГОСТ, используемые в этих сертификатах.

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

← На главную