При интеграции оборудования (например, сетевых контроллеров СКУД, считывателей карт или весовых терминалов) разработчики часто сталкиваются с ситуацией, когда штатный метод платформы ПодключитьВнешнююКомпоненту возвращает Ложь. Попытка загрузить файл библиотеки напрямую с диска или из макета завершается неудачей даже при явном указании типа ТипВнешнейКомпоненты.Native.
Рассмотрим подробно причины такого поведения 1С и разберем практические варианты подключения сторонних библиотек к платформе.
Выясним, почему 1С отказалась загружать библиотеку. Название «Native API» в описании стороннего SDK не означает автоматическую совместимость с 1С. В документации к большинству сторонних DLL под Native API подразумевается стандартный C-интерфейс библиотеки (Unmanaged C/C++ DLL), предназначенный для вызова функций из языков C++, C# или Delphi.
Платформа 1С:Предприятие при вызове метода ПодключитьВнешнююКомпоненту с типом Native ожидает строго определённый набор экспортируемых служебных функций, необходимых для инициализации объекта (таких как GetClassObject, DestroyObject, GetClassNames). Если DLL разработана не по спецификации 1С Native API, платформа не может инициализировать компоненту и возвращает Ложь.
Кроме того, при интеграции внешних библиотек важно учитывать следующие технологические ограничения:
ZPort.dll), они должны находиться в одной директории или в системной папке, доступной для загрузки операционной системой.Если производитель оборудования поставляет заголовочные файлы и примеры на C#, C++ или Delphi, можно создать собственную прослойку-адаптер. Самый быстрый путь — скомпилировать сборку C#, которая связывается со сторонней DLL, и вызывать ее из 1С.
Проанализируем процесс создания C# обертки:
AssemblyInfo.cs:
[assembly: ComVisible(true)]
RegAsm.exe с ключами /codebase /tlb.
ОбъектКонтроллера = Новый COMОбъект("ИмяПространства.ИмяКласса");
КонецЕсли;
Если нет возможности регистрировать COM-компоненту в реестре операционной системы, можно использовать сторонние загрузчики .NET-сборок в 1С (например, внешние библиотеки-врапперы). В этом случае доступ к перечислениям и структурам сторонней DLL из 1С осуществляется следующим образом:
Врап = Новый COMОбъект("NetObjectToIDispatch45");
ТипСборки = Врап.ПолучитьТипИзСборки("ZGuard.ZG_CTR_EV_TYPE", "C:\SDK\ZGuard.dll");
ЗначениеСобытия = ТипСборки.ZG_EV_KEY_OPEN;
Если работа со сторонними DLL затруднена из-за несовместимости типов или отсутствия COM-интерфейса, надежным решением является прямое взаимодействие с оборудованием по протоколу обмена (TCP/UDP сокеты или HTTP/REST API).
Для формирования сырых байтовых пакетов и расчета контрольных сумм в платформе 1С предусмотрены встроенные механизмы побитовой арифметики и объекты для работы с двоичными данными:
БуферДвоичныхДанных, ДвоичныеДанные, ЗаписьДанных, ЧтениеДанных.ПобитовоеИ(), ПобитовоеИли(), ПобитовоеИсключительноеИли(), ПобитовоеНе(), ПобитовыйСдвигВлево(), ПобитовыйСдвигВправо().Посмотрим на пример применения побитовых операций в 1С вместо использования сторонних скриптов MSScriptControl.ScriptControl:
// Маскирование и объединение бит средствами языка 1С
Байт1 = 128; // 0x80
Байт2 = 64; // 0x40
// Вычисление побитового И
РезультатИ = ПобитовоеИ(Байт1, Байт2);
// Побитовый сдвиг вправо
СдвинутоеЗначение = ПобитовыйСдвигВправо(РезультатИ, 4);
Использование встроенных функций побитовой арифметики 1С позволяет полностью отказаться от использования устаревших COM-объектов Windows и делать решение кроссплатформенным, подходящим для работы на серверах Linux.