Как подружить Native-библиотеку (внешнюю компоненту 1С 8.х) с платформой 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При переходе на новые стандарты безопасности, интеграции с государственными системами или при использовании современного торгового оборудования разработчики часто сталкиваются с жестким ограничением: готовая внешняя компонента написана по технологии Native API (предназначенной для платформы 1С 8.х), а учетная система предприятия все еще функционирует на платформе 1С 7.7. Поскольку исходного кода компоненты (например, криптографической библиотеки) на руках нет, напрямую подключить её стандартными средствами 1С 7.7 не удастся.

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

В чем заключается главная техническая сложность?

Платформа 1С 7.7 умеет работать с внешними источниками и расширениями только через две технологии:

  1. COM/OLE (ActiveX) — создание объектов через встроенную функцию СоздатьОбъект("AddIn.ИмяОбъекта") или СоздатьОбъект("OLE.ИмяОбъекта").
  2. Устаревший стандарт внешних компонент 1С 7.7 (технология COMPatible) — специализированные динамические библиотеки DLL, которые экспортируют жестко заданный набор функций для взаимодействия со старым движком платформы.

В то же время, современные компоненты для 1С 8.х пишутся по технологии Native API. Она не использует COM-регистрацию в Windows, не зависит от реестра и предоставляет платформе прямой доступ к C++ классам библиотеки через стандартизированный интерфейс обмена данными. При этом Native-компонента ожидает, что вызывающее приложение (платформа 1С 8.х) предоставит ей контекст окружения, в частности, менеджер памяти IMemoryManager для корректного выделения и очистки оперативной памяти. В 1С 7.7 такого менеджера памяти просто не существует, поэтому попытка прямой загрузки вызовет критический сбой всей системы.

Тем не менее, заставить такую библиотеку работать в 1С 7.7 можно. Рассмотрим детально три основных способа реализации.

---

Решение 1. Использование универсальной COM-обертки (UniversalNativeWrapper)

Это самый простой, надежный и рекомендуемый способ, не требующий написания сложного низкоуровневого кода. Существует готовое решение с открытым исходным кодом — UniversalNativeWrapper. Данная библиотека выступает в роли "переводчика" или прокси-сервера между COM-интерфейсом 1С 7.7 и Native-интерфейсом библиотеки 1С 8.х.

Проанализируем принцип работы этого решения по шагам:

  1. Вы регистрируете библиотеку UniversalNativeWrapper.dll в операционной системе как стандартный COM-компонент.
  2. При создании объекта в 1С 7.7 эта обертка динамически загружает вашу целевую Native-библиотеку.
  3. Обертка самостоятельно эмулирует для Native-библиотеки все необходимые интерфейсы платформы 1С 8.х, включая менеджер памяти IMemoryManager и функции обратного вызова.
  4. Вы вызываете методы Native-компоненты через стандартный синтаксис 1С 7.7.

Рассмотрим пример кода инициализации и работы с такой оберткой в 1С 7.7:


// Создаем объект универсальной COM-обертки
Попытка
    Обертка = СоздатьОбъект("AddIn.UniversalNativeWrapper");
Исключение
    Предупреждение("Не удалось зарегистрировать UniversalNativeWrapper.dll!");
    Возврат;
КонецПопытки;

// Загружаем целевую Native-библиотеку криптографии
ПутьКБиблиотеке = "C:\Libs\my_crypto_native.dll";
ИмяКлассаКомпоненты = "CryptoExtension";

Если Обертка.Инициализировать(ПутьКБиблиотеке, ИмяКлассаКомпоненты) = 0 Тогда
    Предупреждение("Ошибка загрузки или инициализации Native-компоненты!");
    Возврат;
КонецЕсли;

// Теперь мы можем вызывать методы нашей Native-компоненты напрямую через Обертку
РезультатШифрования = "";
ДанныеДляШифрования = "Секретный Текст";

// Предположим, у компоненты есть метод "Encrypt"
РезультатШифрования = Обертка.Encrypt(ДанныеДляШифрования);
Сообщить("Зашифрованные данные: " + РезультатШифрования);

---

Решение 2. Низкоуровневое подключение через DynamicWrapperX

Если готовые обертки по какой-то причине использовать нельзя, можно пойти по пути ручного низкоуровневого вызова функций DLL. Для этого используется утилита DynamicWrapperX (библиотека dynwrapx.dll), которая позволяет регистрировать и вызывать любые экспортируемые функции произвольных DLL прямо из скриптов или кода 1С 7.7.

Выясним техническую суть этого метода. Любая внешняя компонента Native API экспортирует три обязательные функции:

Разберем алгоритм интеграции с использованием DynamicWrapperX:

  1. С помощью утилит типа Dependency Walker или dumpbin исследуем структуру экспорта нашей Native-DLL, чтобы убедиться в наличии указанных функций.
  2. Регистрируем dynwrapx.dll в системе.
  3. В коде 1С 7.7 через DynamicWrapperX вызываем функцию GetClassObject. Получив указатель на объект компоненты, мы сталкиваемся с необходимостью работы с таблицей виртуальных методов (VFTable).
  4. Через полученный указатель мы вручную вызываем методы жизненного цикла компоненты: Init(), FindMethod(), а также методы исполнения CallAsProc() или CallAsFunc().

Важное предупреждение: этот путь чрезвычайно сложен и требует глубоких знаний C++ и работы с памятью (указателями, структурами). Любая ошибка в передаче типов данных (например, передача некорректного указателя на строку) приведет к мгновенному падению платформы 1С 7.7 без возможности перехвата ошибки.

---

Решение 3. Вынос функционала в отдельный HTTP-сервис на базе 1С 8.х

Если стабильность системы является главным приоритетом, а время отклика не критично до миллисекунд, оптимальным решением будет отказ от запуска Native-библиотеки внутри процесса 1С 7.7.

Рассмотрим архитектурную схему этого решения:

  1. Создается минимальная база на платформе 1С 8.3 (это может быть даже бесплатная базовая версия или учебная платформа, запущенная локально или на сервере).
  2. В этой базе настраивается HTTP-сервис, внутри которого штатно и без каких-либо доработок подключается наша Native-библиотека криптографии.
  3. При необходимости выполнить криптографическую операцию, платформа 1С 7.7 отправляет HTTP-запрос (POST) на этот сервис, передавая данные в формате JSON или XML.
  4. Сервер 1С 8.3 принимает запрос, силами Native-библиотеки выполняет шифрование/подписание и возвращает результат обратно в 1С 7.7 в теле HTTP-ответа.

Посмотрим, как выглядит отправка запроса из кода 1С 7.7 с использованием стандартного системного объекта MSXML2.ServerXMLHTTP:


// Готовим данные для отправки (например, строку текста)
ДанныеДляОтправки = "Данные для подписи";

// Инициализируем HTTP-соединение
HTTP = СоздатьОбъект("MSXML2.ServerXMLHTTP");
URL = "http://localhost:8080/CryptoBase/hs/CryptoService/Sign";

Попытка
    HTTP.open("POST", URL, 0); // Синхронный запрос
    HTTP.setRequestHeader("Content-Type", "text/plain; charset=utf-8");
    HTTP.send(ДанныеДляОтправки);
Исключение
    Сообщить("Ошибка связи с HTTP-сервисом криптографии: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Если HTTP.status = 200 Тогда
    Результат = HTTP.responseText;
    Сообщить("Результат успешно получен: " + Результат);
Иначе
    Сообщить("Ошибка обработки на сервере. Код ответа: " + HTTP.status);
КонецЕсли;

Этот метод имеет очевидные преимущества:

---

Критически важные нюансы при интеграции

При использовании любого из вариантов локальной интеграции (Решение 1 и Решение 2) обязательно проанализируйте следующие факторы:

1. Разрядность приложений (32-bit vs 64-bit)
Платформа 1С 7.7 (исполняемый файл 1cv7s.exe или 1cv7.exe) является строго 32-разрядным (x86) приложением. Это означает, что загружаемая в ее процесс Native-библиотека, а также все промежуточные обертки (будь то DynamicWrapperX или UniversalNativeWrapper) обязательно должны быть скомпилированы под 32-битную архитектуру. Попытка загрузить 64-битную DLL завершится системной ошибкой "Bad image" или "Не найдена указанная процедура".

2. Работа с двоичными данными (BLOB)
Криптографические библиотеки практически всегда работают с двоичными данными (массивами байт) — ключами, хэшами, зашифрованными блоками. В платформе 1С 7.7 отсутствует тип данных "ДвоичныеДанные" (он появился только в 1С 8.0). Любая обертка будет вынуждена транслировать двоичные данные. Рекомендуем преобразовывать бинарные данные в строку формата Base64 или HEX на стороне 1С 7.7 перед передачей в обертку, либо обмениваться данными через временные файлы на жестком диске.

3. Поведение при ошибках памяти (APPCRASH)
Будьте готовы к тому, что при некорректном завершении работы Native-компоненты (например, передача нулевого указателя при шифровании) операционная система аварийно завершит работу всего процесса 1С 7.7. Для минимизации таких рисков тщательно тестируйте решение на копиях баз данных и по возможности обрабатывайте исключения на уровне оберток.

Резюме и рекомендации

Подводя итоги анализа, выделим основное правило выбора архитектурного решения:

← На главную