Как в 1С подключиться к внешнему объекту .NET через COM с использованием параметров конструктора

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними системами часто возникает необходимость использования криптографических алгоритмов, реализованных в библиотеках .NET Framework. Стандартный механизм работы через COMОбъект в 1С имеет существенное ограничение: он не поддерживает вызов конструкторов объектов с параметрами. Рассмотрим подробнее, как обойти это ограничение и реализовать полноценное шифрование, например, с использованием класса RSACryptoServiceProvider.

Проблема стандартного подхода

В обычном сценарии программист 1С пишет код: ОбъектШифрования = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider"). Это работает для инициализации объекта со значениями по умолчанию. Однако, если нам нужно создать объект с конкретной длиной ключа (например, 2048 бит) или использовать специфический контекст провайдера, конструктор требует передачи параметров. Попытка написать Новый COMОбъект("Класс", Параметр) в 1С приведет к ошибке, так как механизм COM-интеропа в Windows не умеет передавать аргументы непосредственно в конструктор .NET при создании экземпляра.

Решение через использование внешнего враппера

Для решения этой задачи проанализируем использование специализированных библиотек-переходников, таких как NetObjectToIDispatch. Этот враппер позволяет 1С работать с объектами .NET практически так же, как если бы это был родной код C#. Он берет на себя задачу вызова нужных конструкторов и статических методов.

Разберем по шагам, как инициализировать объект с параметрами:

  1. Подключим внешнюю компоненту враппера.
  2. Получим нужный тип из сборки .NET.
  3. Вызовем метод создания объекта с передачей аргументов конструктора.

Рассмотрим пример кода:


Врап = Новый COMОбъект("NetObjectToIDispatch45");
// Получаем доступ к типу RSACryptoServiceProvider
ТипRSA = Врап.ПолучитьТип("System.Security.Cryptography.RSACryptoServiceProvider");

// Создаем объект с параметром длины ключа 2048 бит
// Это эквивалентно C#: new RSACryptoServiceProvider(2048)
ОбъектШифрования = Врап.СоздатьОбъект(ТипRSA, 2048);

Импорт готового ключа и работа с форматами данных

Часто задача состоит не просто в создании объекта, а в импорте уже существующего публичного или приватного ключа. Выясним причину, по которой обычная передача строки ключа может вызывать ошибку "Недопустимая длина для массива символов Base-64".

Проанализируем ситуацию: ключи в криптографии обычно передаются в кодировке Base64. Однако класс RSACryptoServiceProvider ожидает данные в определенном формате (например, XML-строка или байтовый массив CSP Blob). Если ваш ключ — это просто строка символов, её необходимо правильно подготовить.

Если у вас есть публичный ключ в формате XML, используйте метод FromXmlString. Если же ключ представлен в виде двоичного объекта, рассмотрим пример с использованием метода ImportCspBlob:


// Предположим, у нас есть ключ в Base64
ПубличныйКлючBase64 = "asd2343asdasaYdnnas89932asdasd=="; 

// Для работы с Base64 нам понадобится тип System.Convert
Конвертер = Врап.ПолучитьТип("System.Convert");

// Преобразуем строку Base64 в массив байтов, который понимает .NET
МассивБайтов = Конвертер.FromBase64String(ПубличныйКлючBase64);

// Импортируем ключ в объект шифрования
Попытка
    ОбъектШифрования.ImportCspBlob(МассивБайтов);
Исключение
    Сообщить("Ошибка импорта ключа: " + ОписаниеОшибки());
КонецПопытки;

Важные нюансы при работе с RSA и AES

В процессе разработки важно различать алгоритмы шифрования. Проанализируем типичную ошибку: попытку использовать RSA-объект для дешифровки данных, зашифрованных алгоритмом AES. Если в коде (например, на PHP или другом языке) вы видите упоминание AES-128-CBC, то использование RSACryptoServiceProvider не даст результата.

RSA — это асимметричный алгоритм (публичный ключ для шифрования, приватный для расшифровки).
AES — это симметричный алгоритм (один ключ для обоих действий).

Для реализации логики, аналогичной PHP-функции openssl_decrypt с алгоритмом AES, в 1С через .NET враппер следует использовать класс System.Security.Cryptography.AesManaged. Посмотрим на пример настройки такого объекта:


ТипAes = Врап.ПолучитьТип("System.Security.Cryptography.AesManaged");
ОбъектAES = Врап.СоздатьОбъект(ТипAes);

// Настройка параметров, соответствующих стандартам OpenSSL
ОбъектAES.Mode = 1; // CipherMode.CBC
ОбъектAES.Padding = 3; // PaddingMode.PKCS7
ОбъектAES.KeySize = 128;

// Установка ключа и вектора инициализации (IV)
// Ключ и IV должны быть переданы как массивы байтов
ОбъектAES.Key = Конвертер.FromBase64String(СтрокаКлюча);
ОбъектAES.IV = Конвертер.FromBase64String(СтрокаIV);

Особенности длины ключа и Base64

При работе с криптографией в 1С часто возникают проблемы с длиной строк. Помните следующие правила:

Таким образом, использование внешних библиотек через COM-враппер открывает для разработчика 1С всю мощь .NET Framework, позволяя обходить ограничения платформы по созданию сложных объектов с параметрами.

← На главную