К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как использовать DLL в 1С: подключение и вызов внешних библиотек

Как подключить и использовать DLL в 1С: подключение внешних компонент, Native API, COM-объекты, регистрация библиотек и решение типичных ошибок.

Прямой вызов произвольной функции из обычной DLL во встроенном языке 1С невозможен — платформа не предоставляет оператора вида «загрузить библиотеку и вызвать функцию по имени». Однако использовать возможности сторонних библиотек можно, если они оформлены одним из поддерживаемых способов: как внешняя компонента по технологии Native API, как COM-объект или как часть расширения через веб-сервисы и промежуточное ПО.

Чаще всего задача «1С как использовать DLL» возникает при интеграции с оборудованием (сканеры, кассы, весы), при работе с криптографией, при вызове API сторонних систем, у которых есть только нативная библиотека. Правильный путь зависит от того, как разработчик DLL предусмотрел её использование: есть ли у неё COM-интерфейс, поставляется ли она как внешняя компонента 1С или это «голая» библиотека с экспортируемыми функциями.

Ниже разобраны все рабочие способы подключения, примеры кода, требования к разрядности и регистрации, а также типичные ошибки, из-за которых компонента «не видна» в 1С.

Какие способы подключения DLL существуют в 1С

Платформа 1С:Предприятие поддерживает три основных механизма работы с внешним кодом. Первый — внешние компоненты по технологии Native API: специально разработанные DLL, которые подключаются методом ПодключитьВнешнююКомпоненту() и создают объекты через Новый ("AddIn.Имя.Объект"). Второй — COM-технология: если DLL зарегистрирована в Windows как COM-сервер, её объекты доступны через Новый COMОбъект("ProgID"). Третий — косвенный: промежуточное приложение или сервис (например, на C#, Python или Node.js), которое вызывает DLL и отдаёт данные в 1С через HTTP, файлы или очереди.

Выбор зависит от формата поставки библиотеки. Если производитель оборудования даёт «компоненту для 1С» — это Native API. Если в документации упоминаются ProgID, OLE, ActiveX — это COM. Если есть только .dll-файл и заголовочный файл C — без доработки обёртки подключить её к 1С не получится.

Сравнение способов

Native API компонента

Штатный механизм 1С, работает и на клиенте, и на сервере, включая Linux. Требует, чтобы DLL была разработана именно как внешняя компонента.

COM-объект

Подходит для библиотек с COM-интерфейсом. Работает только в Windows, требует регистрации в реестре и совпадения разрядности с процессом 1С.

Промежуточный сервис

Универсально для любых DLL. Надёжно изолирует 1С от сбоев библиотеки, но требует разработки и сопровождения отдельного приложения.

Подключение внешней компоненты Native API

Это основной и рекомендуемый способ. Компонента поставляется либо в виде готового ZIP-архива (макета), либо как отдельный DLL-файл. Типовой код подключения на клиенте выглядит так:

НачатьПодключениеВнешнейКомпоненты(

Новый ОписаниеОповещения("ПослеПодключения", ЭтотОбъект),

"ОбщийМакет.КомпонентаСканера",

"ScannerComponent");

Для синхронного режима (толстый клиент, сервер) используется более короткий вариант:

Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСканера", "ScannerComponent") Тогда

Сканер = Новый ("AddIn.ScannerComponent.Scanner");

Иначе

Сообщить("Не удалось подключить компоненту");

КонецЕсли;

Компоненту можно разместить в общем макете конфигурации (двоичные данные — ZIP-архив с DLL для разных платформ) или указать путь к файлу на диске. Вариант с макетом предпочтительнее: компонента хранится в базе, автоматически доставляется клиентам и не зависит от файловой системы сервера.

Порядок подключения компоненты
  1. 1
    Поместите ZIP-архив компоненты в общий макет конфигурации (тип — двоичные данные)
  2. 2
    Вызовите ПодключитьВнешнююКомпоненту с именем макета и произвольным именем подключения
  3. 3
    Создайте объект через Новый ("AddIn.Имя.ИмяОбъекта")
  4. 4
    Вызовите методы объекта и проверьте возвращаемые значения
  5. 5
    Обработайте случай отказа подключения — выведите понятное сообщение пользователю

Работа с COM-объектами из DLL

Если библиотека реализует COM-интерфейс, её можно использовать без всяких макетов. Сначала DLL регистрируется в системе командой regsvr32 имя_файла.dll (запуск от имени администратора), затем в коде 1С создаётся объект по программному идентификатору:

Попытка

ОбъектCOM = Новый COMОбъект("Vendor.Library");

Результат = ОбъектCOM.DoWork(Параметр);

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

Критическое ограничение COM — разрядность. 32-разрядная DLL может загрузиться только в 32-разрядный процесс, 64-разрядная — только в 64-разрядный. Если код выполняется на сервере 1С x86-64, а библиотека 32-разрядная, подключение завершится ошибкой. Выход — перенести вызов на клиента с 32-разрядным тонким клиентом или обернуть DLL в отдельный 32-разрядный процесс.

Что делать, если DLL — «обычная», без COM и Native API

Библиотека с экспортируемыми C-функциями (типичный случай для SDK оборудования и криптопровайдеров) напрямую в 1С не загружается. У вас три реальных варианта. Первый — заказать или написать обёртку: внешнюю компоненту Native API, которая внутри себя вызывает нужные функции DLL. Для C++-разработчика это типовая задача, фирма «1С» публикует шаблон компоненты и документацию по технологии.

Второй вариант — промежуточный сервис. Небольшое приложение на C#, Python или другом языке загружает DLL штатными средствами (P/Invoke, ctypes) и предоставляет HTTP-интерфейс. 1С обращается к нему через HTTPСоединение. Этот путь особенно удобен, когда DLL нестабильна: падение сервиса не рушит сеанс 1С, а сервис можно перезапускать автоматически.

Третий вариант — проверить, нет ли готового решения. Многие производители (АТОЛ, Штрих-М, СБИС, криптопровайдеры) уже поставляют компоненты для 1С или COM-интерфейсы поверх своих нативных библиотек. Поищите в комплекте поставки SDK папки с названиями вроде «1C», «AddIn», «COM».

Маршрут решения

Как выбрать действие

В комплекте с DLL есть ZIP-архив или упоминается AddIn, Native APIПодключайте как внешнюю компоненту через ПодключитьВнешнююКомпоненту
В документации указан ProgID, слова OLE, ActiveX, COMЗарегистрируйте DLL через regsvr32 и создавайте объект через Новый COMОбъект
Есть только .dll и описание C-функцийНужна обёртка: своя компонента Native API или промежуточный HTTP-сервис
DLL 32-разрядная, а сервер 1С 64-разрядныйВызывайте на 32-разрядном клиенте или выносите в отдельный 32-разрядный процесс

Разрядность, права и место выполнения кода

Большинство проблем с подключением DLL сводится к трём причинам: несовпадение разрядности, отсутствие прав и выполнение кода не в том контексте. Разрядность библиотеки должна совпадать с разрядностью процесса, в котором выполняется код: клиентское приложение или рабочий процесс сервера 1С. Проверить разрядность DLL можно, например, открыв её в любом просмотрщике PE-заголовков или выполнив dumpbin /headers файл.dll из инструментов Visual Studio.

Код ПодключитьВнешнююКомпоненту на клиенте загружает DLL в процесс клиентского приложения, на сервере — в рабочий процесс кластера. Если компонента обращается к оборудованию (COM-порт, USB-сканер), она должна выполняться там, где это оборудование физически доступно, — почти всегда на клиенте. Учётная запись, под которой работает сервер 1С (обычно USR1CV8), должна иметь права на чтение файла DLL и доступ к нужным ресурсам.

В файловом варианте базы всё проще: клиент и «сервер» выполняются в одном процессе, поэтому компонента, работающая в файловой базе, может неожиданно перестать подключаться после перехода на клиент-серверный вариант. Учитывайте это при планировании миграции.

Контрольные точки

Как проверить результат

Возврат ПодключитьВнешнююКомпоненту
Норма

Возвращает Истина, объект создаётся без исключения

Тревожный признак

Ложь или исключение — проверяйте имя макета, разрядность и журнал регистрации

Создание COM-объекта
Норма

Новый COMОбъект отрабатывает без ошибки

Тревожный признак

Ошибка «Класс не зарегистрирован» — DLL не зарегистрирована или разрядность не совпадает

Вызов методов
Норма

Методы возвращают ожидаемые значения, оборудование отвечает

Тревожный признак

Тишина или коды ошибок — проверяйте права, доступность устройства и версию компоненты

Типичные ошибки и их диагностика

Ошибка «Не удалось подключить внешнюю компоненту» без деталей — самая частая. Первым делом смотрите технологический журнал и журнал регистрации: там видно, на каком этапе произошёл сбой — загрузка файла, инициализация или создание объекта. Если компонента в макете, убедитесь, что ZIP-архив собран корректно: внутри должен быть файл manifest.xml соответствующего формата и DLL под нужные платформы.

Для COM-объектов характерна ошибка «-2147024894» или «Класс не зарегистрирован»: либо не выполнена регистрация, либо регистрация прошла в другой разрядности. 32-разрядные DLL на 64-разрядной Windows регистрируются через C:\Windows\SysWOW64\regsvr32.exe, и это частая причина путаницы. Также проверьте, что код создающий COM-объект не выполняется в контексте, где COM недоступен, например, в некоторых сценариях веб-клиента.

Типичные ошибки
01
Попытка загрузить обычную DLL через ПодключитьВнешнююКомпоненту — метод работает только с компонентами Native API, обычная библиотека не подключится
02
Несовпадение разрядности: 32-битная DLL и 64-битный сервер 1С — подключение падает без понятного сообщения
03
Вызов компоненты на сервере, когда оборудование подключено к клиентскому компьютеру — устройство физически недоступно
04
Регистрация 32-битной DLL через системный regsvr32 вместо версии из SysWOW64 — класс остаётся «незарегистрированным» для 1С
05
Отсутствие обработки отказа подключения — пользователь видит аварийное завершение вместо понятного сообщения

Безопасность и сопровождение

Внешняя компонента — это машинный код, выполняющийся в процессе 1С с полными правами этого процесса. Сбой внутри DLL (например, access violation) аварийно завершает весь сеанс или рабочий процесс сервера. Поэтому нестабильные библиотеки лучше изолировать в отдельный процесс через промежуточный сервис. На сервере включите для критичных вызовов журналирование, чтобы отличать сбои компоненты от ошибок прикладного кода.

Храните компоненту в макете конфигурации, а не на диске — так вы контролируете версию и избегаете ситуации, когда на разных рабочих местах стоят разные версии DLL. При обновлении компоненты тестируйте её на копии базы: изменение состава методов объекта может сломать существующий код. В безопасном режиме (например, при работе расширений с ограничениями) подключение внешних компонент запрещено — учитывайте это при проектировании решений для сервиса.

Частые вопросы

Можно ли вызвать функцию из обычной DLL напрямую из кода 1С?

Нет. Встроенный язык не имеет механизма прямого вызова экспортируемых функций (как Declare в VBA). Нужна обёртка: внешняя компонента Native API, COM-интерфейс или промежуточное приложение, которое загрузит DLL своими средствами.

Почему ПодключитьВнешнююКомпоненту возвращает Ложь без сообщения об ошибке?

Обычные причины: неверное имя макета или подключения, повреждённый ZIP-архив компоненты, отсутствие DLL под текущую платформу и разрядность, безопасный режим. Детали ищите в технологическом журнале и журнале регистрации.

Работает ли COM-подключение на сервере 1С под Linux?

Нет, COM — технология Windows. На Linux-сервере доступны только внешние компоненты Native API, собранные для Linux, либо интеграция через внешние сервисы по HTTP.

Как подключить 32-разрядную DLL, если сервер 1С 64-разрядный?

Напрямую — никак: разрядность процесса и библиотеки должна совпадать. Варианты: выполнять вызов на 32-разрядном клиенте, найти 64-разрядную версию библиотеки или вынести работу с DLL в отдельный 32-разрядный процесс с обменом через HTTP или файлы.

Где хранить файл компоненты — в базе или на диске?

Предпочтительно в общем макете конфигурации: версия компоненты привязана к версии конфигурации, файл автоматически доступен всем клиентам и не требует настройки прав на файловую систему каждого рабочего места.

Что делать, если компонента периодически «роняет» сеанс 1С?

Это признак сбоя внутри машинного кода DLL. Обновите компоненту до актуальной версии, а если не помогло — вынесите её вызовы в отдельный процесс (промежуточный сервис), чтобы падение библиотеки не завершало сеанс пользователя или рабочий процесс сервера.

Итог

Что важно запомнить

1С использует DLL только через три механизма: внешние компоненты Native API, COM-объекты и промежуточные сервисы. Ключевые условия успеха — совпадение разрядности библиотеки и процесса 1С, правильная регистрация COM и выполнение кода там, где доступно оборудование. Обычную DLL без этих интерфейсов подключить напрямую нельзя — нужна обёртка.