При разработке механизмов автоматизации электронного документооборота (ЭДО) через СБИС (Тензор) программисты часто сталкиваются с необходимостью использовать официальную внешнюю обработку Sbis1C.epf. Одной из самых распространенных проблем при этом является ошибка "Сертификат не найден" в момент вызова метода авторизации, даже если сам файл сертификата корректно считывается из файловой системы. Рассмотрим подробно, как правильно настроить параметры авторизации и подготовить данные для успешного входа в систему.
Часто разработчики пытаются передать в структуру параметров авторизации полный текст сертификата, выгруженный в формате PEM (между тегами -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----). Рассмотрим пример кода, который обычно приводит к ошибке:
// Создаем объект внешней обработки
ВО = ВнешниеОбработки.Создать("d:\Temp\Sbis1C.epf");
ВИ = ВО.ПолучитьФорму("ВнешнийИнтерфейс");
Кэш = ВИ.сбисИнициализировать();
// Пытаемся передать тело сертификата как текст
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("d:\Temp\certificate.txt");
ТекстСертификат = Текст.ПолучитьТекст();
ПараметрыАвторизации = Новый Структура;
ПараметрыАвторизации.Вставить("ВходПоСертификату", Истина);
ПараметрыАвторизации.Вставить("Сертификат", ТекстСертификат); // Здесь возникает ошибка
ЗапускРоботом = Истина;
УспешнаяАвторизация = ВИ.сбисАвторизация(Кэш, ПараметрыАвторизации, ЗапускРоботом);
В данной ситуации система возвращает ошибку, так как метод сбисАвторизация ожидает не тело сертификата, а его уникальный идентификатор в системе — отпечаток (Thumbprint).
Проанализируем работу внутренней логики СБИС. Обработка Sbis1C.epf не выполняет криптографические операции самостоятельно «из файла». Она обращается к установленному в операционной системе криптопровайдеру (КриптоПро CSP или VipNet CSP) и ищет сертификат в системном хранилище (обычно в ветке «Личные»). Чтобы поиск прошел успешно, необходимо предоставить системе хэш SHA-1 этого сертификата.
Ключевые требования к передаваемому значению:
Рассмотрим, как правильно подготовить строку отпечатка и передать её в обработку СБИС. Если вы копируете отпечаток из свойств сертификата в Windows, он часто содержит невидимые символы или пробелы между парами цифр. Нам нужно их удалить и привести строку к нужному виду.
// Исходный отпечаток, скопированный из свойств сертификата
ОтпечатокИзСвойств = "a1 b2 c3 d4 e5 f6 78 90 g1 g2 g3 g4 g5 g6 g7 g8 g9 g0 a2 b2";
// Очищаем строку от пробелов и переводим в верхний регистр
ЧистыйОтпечаток = СтрЗаменить(ОтпечатокИзСвойств, " ", "");
ЧистыйОтпечаток = ВРег(ЧистыйОтпечаток);
// Теперь формируем параметры для авторизации
ПараметрыАвторизации = Новый Структура;
ПараметрыАвторизации.Вставить("ИдентификаторСессии", "");
ПараметрыАвторизации.Вставить("ВходПоСертификату", Истина);
ПараметрыАвторизации.Вставить("Сертификат", ЧистыйОтпечаток); // Передаем очищенный отпечаток
ПараметрыАвторизации.Вставить("Логин", "");
ПараметрыАвторизации.Вставить("Пароль", "");
ЗапускРоботом = Истина; // Режим без вывода диалоговых окон
УспешнаяАвторизация = ВИ.сбисАвторизация(Кэш, ПараметрыАвторизации, ЗапускРоботом);
Если УспешнаяАвторизация Тогда
Сообщить("Авторизация прошла успешно!");
Иначе
Сообщить("Ошибка авторизации. Проверьте наличие сертификата в хранилище.");
КонецЕсли;
Проанализируем ситуацию, если даже с корректным отпечатком система продолжает выдавать ошибку. Выясним возможные причины:
Sbis1C.epf, требуют запуска 1С в 32-битном режиме.ЗапускРоботом = Истина, обработка подавляет все окна, включая запрос PIN-кода контейнера. Если на ваш закрытый ключ установлен пароль, он должен быть либо сохранен в системе (галочка «Запомнить пароль» в КриптоПро), либо вы должны использовать интерактивный режим (ЗапускРоботом = Ложь), чтобы пользователь мог ввести пароль вручную.В некоторых случаях (например, при прямом обращении к JSON-RPC API СБИС в обход внешней обработки) может потребоваться передача самого тела сертификата. В 1С для этого следует использовать преобразование двоичных данных в строку Base64. Рассмотрим этот пример на случай расширения функционала вашей обработки:
// Пример получения Base64 строки из файла сертификата
ПутьКФайлу = "C:\Certs\mycert.cer";
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
// Важно: иногда требуется удалить символы переноса строк
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
Однако помните, что для стандартного метода сбисАвторизация во внешней обработке 1С приоритетным и рабочим вариантом является именно строковый отпечаток в верхнем регистре. Это гарантирует, что SDK СБИС сможет однозначно идентифицировать нужный ключ в системном хранилище и использовать его для формирования защищенного соединения.
Соблюдение этих правил позволит вам настроить бесперебойную работу интеграции 1С и СБИС, обеспечив автоматический обмен документами без вмешательства пользователя.