В современных реалиях автоматизации бизнеса, особенно при работе с системами государственной маркировки («Честный ЗНАК», МДЛП) и электронным документооборотом, программисты 1С часто сталкиваются с необходимостью внедрения криптографических функций в устаревшие конфигурации на платформе 1С 7.7. Одной из наиболее распространенных задач является программный выбор сертификата из хранилища и формирование открепленной электронной подписи (ЭЦП).
В данной статье мы подробно разберем, как использовать библиотеки CAPICOM и CADESCOM для решения этих задач, проанализируем типичные ошибки кодирования и выясним, почему современные системы требуют перехода на новые программные интерфейсы. При переходе на современные версии платформ 1С используется раздел с решениями по переносу данных из 1С 7.7.
Ранее стандартом для работы с криптографией в Windows была библиотека CAPICOM от Microsoft. Однако она официально не поддерживается уже более десяти лет и имеет ряд ограничений, таких как отсутствие поддержки современных алгоритмов ГОСТ Р 34.10-2012 (в полной мере) и нестабильная работа в 64-битных операционных системах.
Проанализируем ситуацию: для стабильной работы, особенно с КриптоПро CSP, рекомендуется использовать CADESCOM. Эта библиотека поставляется в составе бесплатного КриптоПро ЭЦП Browser plug-in. Несмотря на название, она регистрирует в системе полноценные COM-объекты, которые можно вызывать из 1С 7.7 точно так же, как и старый CAPICOM, но с поддержкой всех современных стандартов подписи. Для практической реализации можно использовать готовые примеры кода для формирования подписи в 1С 7.7 через CAPICOM и CAdESCOM под x64.
Для начала рассмотрим, как получить доступ к списку сертификатов, установленных в системе. Процесс состоит из открытия хранилища (обычно это «My» — личные сертификаты текущего пользователя) и перебора его содержимого.
Разберем пример кода на языке 1С 7.7 для получения списка доступных сертификатов:
// Константы для работы с хранилищем
CURRENT_USER_STORE = 2;
MY_STORE = "My";
STORE_OPEN_READ_ONLY = 0;
// Создаем объект хранилища
Store = СоздатьОбъект("CAPICOM.Store"); // Или "CADESCOM.Store" для современной версии
Store.Open(CURRENT_USER_STORE, MY_STORE, STORE_OPEN_READ_ONLY);
// Получаем коллекцию сертификатов
Certs = Store.Certificates;
// Если нужно программно выбрать сертификат по определенному критерию (например, по ИНН или серийному номеру)
Для Сч = 1 По Certs.Count Цикл
ТекСерт = Certs.Item(Сч);
Сообщить("Сертификат: " + ТекСерт.SubjectName);
// Здесь можно добавить проверку срока действия или владельца
КонецЦикла;
Если же мы хотим предоставить пользователю стандартное диалоговое окно Windows для выбора сертификата, следует использовать метод Select. Рассмотрим важный нюанс: если при вызове метода список оказывается пустым, это часто означает, что в хранилище нет сертификатов с закрытыми ключами, доступными для подписания.
// Вызов диалога выбора сертификата
// bMultiSelect = 0 (выбор одного), заголовок окна, 0 (не показывать недействительные)
ВыбранныеСертификаты = Certs.Select("Выберите сертификат для подписи", "Выберите один из списка:", 0);
Если ВыбранныеСертификаты.Count > 0 Тогда
ОбъектСертификат = ВыбранныеСертификаты.Item(1);
КонецЕсли;
При работе с системами маркировки чаще всего требуется **открепленная подпись (detached signature)**. Это означает, что сама подпись сохраняется в отдельном файле, а исходный документ остается без изменений. Рассмотрим алгоритм подписания с использованием ADODB.Stream для корректной обработки двоичных данных, так как 1С 7.7 не умеет напрямую работать с байтовыми массивами в формате Unicode.
Выясним причину использования ADODB.Stream: при передаче содержимого файла в виде обычной строки 1С 7.7 может исказить данные из-за преобразования кодировок (ANSI/UTF-8). Использование потока позволяет передать данные в криптопровайдер в «чистом» бинарном виде.
// Пример функции на JavaScript/VBScript (вызываемой из 1С или через скрипт-контрол)
function SignFile(FileName, Cert, OutFileName) {
// 1. Читаем файл в бинарный поток
var InStream = new ActiveXObject("ADODB.Stream");
InStream.Type = 1; // adTypeBinary
InStream.Open();
InStream.LoadFromFile(FileName);
var InData = InStream.Read(-1);
// 2. Настраиваем объект подписания
var Signer = new ActiveXObject("CAdESCOM.CPSigner"); // Используем современный CADESCOM
Signer.Certificate = Cert;
// Signer.Options = 2; // CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY - включать только конечный сертификат
// 3. Формируем подписанные данные
var SignedData = new ActiveXObject("CAdESCOM.CadesSignedData");
SignedData.Content = InData;
// 4. Генерируем подпись
// Параметры SignCades: (Signer, Type, Detached, Encoding)
// CADES_BES = 1, Detached = true (открепленная), Base64 = 0
var sSignature = SignedData.SignCades(Signer, 1, true, 0);
// 5. Сохраняем результат
var OutStream = new ActiveXObject("ADODB.Stream");
OutStream.Type = 2; // adTypeText
OutStream.CharSet = "ascii";
OutStream.Open();
OutStream.WriteText(sSignature);
OutStream.SaveToFile(OutFileName, 2);
OutStream.Close();
return sSignature;
}
Проанализируем ключевые моменты, на которых часто спотыкаются разработчики:
CADESCOM вы получаете ошибку «Лицензия на КриптоПро TSP Client истекла», это означает, что вы пытаетесь создать усовершенствованную подпись (CAdES-X Long) с меткой времени. Для простых задач (маркировка) достаточно формата CADES_BES (значение 1 в методе SignCades), который не требует платной службы штампов времени.Sign в режиме CAPICOM_ENCODE_BASE64 (0) уже представляет собой текстовую строку в формате Base64. Повторно конвертировать её не нужно, иначе принимающая сторона не сможет верифицировать подпись.SignedData.Content передается именно содержимое XML-файла целиком, а не путь к нему.Если работа через COM-объекты вызывает затруднения (например, из-за проблем с регистрацией DLL в 64-битной среде), рассмотрим альтернативный и очень надежный способ — использование утилиты cryptcp.exe или csptest.exe, которые идут в комплекте с КриптоПро CSP.
Разберем пример вызова консольной команды из 1С 7.7:
// Команда для создания открепленной подписи в формате DER/Base64
ПутьКУтилите = "C:\Program Files\Crypto Pro\CSP\cryptcp.exe";
Команда = """" + ПутьКУтилите + """ -signf -dir ""C:\Out"" -der -detached -cert -u ""ИмяСертификата"" ""C:\Data\doc.xml""";
// Выполняем команду системы
КомандаСистемы(Команда);
Этот метод хорош тем, что он изолирует процесс криптографии от основного процесса 1С, что повышает стабильность системы при массовой обработке документов. В качестве альтернативы COM-скриптам и вызовам консоли можно использовать внешнюю компоненту криптографии для 1С 7.7 с поддержкой ГОСТ 2012.
Мы выяснили, что наиболее современным и правильным подходом для 1С 7.7 сегодня является использование объектов библиотеки CADESCOM через установку браузерного плагина КриптоПро. Это обеспечивает совместимость с актуальными требованиями регуляторов и корректную работу с ГОСТ-2012. Помните о важности контроля параметров Detached и Options, а также всегда проверяйте итоговую длину сигнатуры — существенные отличия в размере подписи при одинаковых исходных данных часто указывают на неверную обработку кодировки или включение лишних данных в тело подписи.