При переходе на новые стандарты безопасности, интеграции с государственными системами или при использовании современного торгового оборудования разработчики часто сталкиваются с жестким ограничением: готовая внешняя компонента написана по технологии Native API (предназначенной для платформы 1С 8.х), а учетная система предприятия все еще функционирует на платформе 1С 7.7. Поскольку исходного кода компоненты (например, криптографической библиотеки) на руках нет, напрямую подключить её стандартными средствами 1С 7.7 не удастся.
В этой статье мы подробно разберем, как решить эту задачу. Мы проанализируем архитектурные различия платформ, рассмотрим три жизнеспособных сценария интеграции и научимся обходить технические ограничения 1С 7.7.
Платформа 1С 7.7 умеет работать с внешними источниками и расширениями только через две технологии:
СоздатьОбъект("AddIn.ИмяОбъекта") или СоздатьОбъект("OLE.ИмяОбъекта").В то же время, современные компоненты для 1С 8.х пишутся по технологии Native API. Она не использует COM-регистрацию в Windows, не зависит от реестра и предоставляет платформе прямой доступ к C++ классам библиотеки через стандартизированный интерфейс обмена данными. При этом Native-компонента ожидает, что вызывающее приложение (платформа 1С 8.х) предоставит ей контекст окружения, в частности, менеджер памяти IMemoryManager для корректного выделения и очистки оперативной памяти. В 1С 7.7 такого менеджера памяти просто не существует, поэтому попытка прямой загрузки вызовет критический сбой всей системы.
Тем не менее, заставить такую библиотеку работать в 1С 7.7 можно. Рассмотрим детально три основных способа реализации.
---
Это самый простой, надежный и рекомендуемый способ, не требующий написания сложного низкоуровневого кода. Существует готовое решение с открытым исходным кодом — UniversalNativeWrapper. Данная библиотека выступает в роли "переводчика" или прокси-сервера между COM-интерфейсом 1С 7.7 и Native-интерфейсом библиотеки 1С 8.х.
Проанализируем принцип работы этого решения по шагам:
UniversalNativeWrapper.dll в операционной системе как стандартный COM-компонент.IMemoryManager и функции обратного вызова.Рассмотрим пример кода инициализации и работы с такой оберткой в 1С 7.7:
// Создаем объект универсальной COM-обертки
Попытка
Обертка = СоздатьОбъект("AddIn.UniversalNativeWrapper");
Исключение
Предупреждение("Не удалось зарегистрировать UniversalNativeWrapper.dll!");
Возврат;
КонецПопытки;
// Загружаем целевую Native-библиотеку криптографии
ПутьКБиблиотеке = "C:\Libs\my_crypto_native.dll";
ИмяКлассаКомпоненты = "CryptoExtension";
Если Обертка.Инициализировать(ПутьКБиблиотеке, ИмяКлассаКомпоненты) = 0 Тогда
Предупреждение("Ошибка загрузки или инициализации Native-компоненты!");
Возврат;
КонецЕсли;
// Теперь мы можем вызывать методы нашей Native-компоненты напрямую через Обертку
РезультатШифрования = "";
ДанныеДляШифрования = "Секретный Текст";
// Предположим, у компоненты есть метод "Encrypt"
РезультатШифрования = Обертка.Encrypt(ДанныеДляШифрования);
Сообщить("Зашифрованные данные: " + РезультатШифрования);
---
Если готовые обертки по какой-то причине использовать нельзя, можно пойти по пути ручного низкоуровневого вызова функций DLL. Для этого используется утилита DynamicWrapperX (библиотека dynwrapx.dll), которая позволяет регистрировать и вызывать любые экспортируемые функции произвольных DLL прямо из скриптов или кода 1С 7.7.
Выясним техническую суть этого метода. Любая внешняя компонента Native API экспортирует три обязательные функции:
GetClassObject(const WCHAR_T*, IComponentBase**) — возвращает указатель на созданный экземпляр C++ класса компоненты по его имени.DestroyObject(IComponentBase**) — уничтожает объект и освобождает память.GetClassNames() — возвращает список имен классов, содержащихся в библиотеке.Разберем алгоритм интеграции с использованием DynamicWrapperX:
dynwrapx.dll в системе.GetClassObject. Получив указатель на объект компоненты, мы сталкиваемся с необходимостью работы с таблицей виртуальных методов (VFTable).Init(), FindMethod(), а также методы исполнения CallAsProc() или CallAsFunc().Важное предупреждение: этот путь чрезвычайно сложен и требует глубоких знаний C++ и работы с памятью (указателями, структурами). Любая ошибка в передаче типов данных (например, передача некорректного указателя на строку) приведет к мгновенному падению платформы 1С 7.7 без возможности перехвата ошибки.
---
Если стабильность системы является главным приоритетом, а время отклика не критично до миллисекунд, оптимальным решением будет отказ от запуска Native-библиотеки внутри процесса 1С 7.7.
Рассмотрим архитектурную схему этого решения:
Посмотрим, как выглядит отправка запроса из кода 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. Для минимизации таких рисков тщательно тестируйте решение на копиях баз данных и по возможности обрабатывайте исключения на уровне оберток.
Подводя итоги анализа, выделим основное правило выбора архитектурного решения: