Как правильно подключить внешнюю компоненту в 1С и исправить ошибку «Тип не определен»?

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

При интеграции 1С:Предприятия с торговым оборудованием (например, ККТ АТОЛ или сканерами штрихкодов) разработчики часто сталкиваются с ситуацией, когда метод подключения внешней компоненты отрабатывает успешно, однако при попытке создать экземпляр объекта через оператор Новый возникает исключение: «Тип не определен (AddIn...)». Разберем по шагам, почему возникает эта ошибка и как правильно выполнять загрузку и инициализацию внешних компонент различных типов.

Причина 1. Несоответствие между псевдонимом подключения и создаваемым типом

Проанализируем механику работы метода ПодключитьВнешнююКомпоненту. Существует два основных варианта синтаксиса:

  1. Подключение через системный ProgID (COM): используется однопараметрический вызов ПодключитьВнешнююКомпоненту(ProgID). В этом случае библиотека предварительно регистрируется в операционной системе, а тип создается строго по имени ProgID из реестра Windows.
  2. Подключение из файла или макета с назначением локального имени (Alias): используется трехпараметрический вызов ПодключитьВнешнююКомпоненту(ПутьКФайлу, ИмяПодключения, ТипВнешнейКомпоненты).

Типичная ошибка заключается в смешивании этих подходов: разработчик передает путь к файлу и задает локальный псевдоним (например, "FprnM1C82_54FZ"), а затем пытается создать объект по зарегистрированному в системе ProgID (например, "AddIn.ATOL_KKM_1C82_54FZ"). В результате платформа ищет тип по назначенному псевдониму сеанса и выдает ошибку неопределенного типа.

Посмотрим на пример правильной инициализации компоненты по локальному псевдониму:


ПутьКФайлу = "C:\Program Files\ATOL\Drivers8\1Cv82\FZ54\FprnM1C82_54FZ.dll";
ИмяПодключения = "МойДрайверККТ";

// Подключаем библиотеку и задаем псевдоним для текущего сеанса
Подключено = ПодключитьВнешнююКомпоненту(ПутьКФайлу, ИмяПодключения, ТипВнешнейКомпоненты.COM);

Если Подключено Тогда
    // Создание объекта выполняется строго через назначенный псевдоним
    ОбъектДрайвера = Новый ("AddIn." + ИмяПодключения);
Иначе
    ВызватьИсключение "Не удалось подключить внешнюю компоненту по указанному пути.";
КонецЕсли;

Причина 2. Подключение зарегистрированной в системе COM-компоненты по ProgID

Рассмотрим вариант, когда библиотека поставляется производителем вместе с дистрибутивом драйверов и регистрируется в реестре Windows с помощью системной утилиты regsvr32. В таком случае указывать прямой путь к файлу .dll на диске не требуется.

Разберем по шагам последовательность действий:

  1. Выполняем регистрацию библиотеки в командной строке от имени администратора: regsvr32 "C:\Program Files\ATOL\Drivers8\Bin_Free\FprnM1C.dll"
  2. Вызываем метод ПодключитьВнешнююКомпоненту, передав только зарегистрированный ProgID.
  3. Инициализируем объект через оператор Новый или COMОбъект.

ProgID = "AddIn.ATOL_KKM_1C82_54FZ";
ОбъектДрайвера = Неопределено;

Попытка
    Если ПодключитьВнешнююКомпоненту(ProgID) Тогда
        ОбъектДрайвера = Новый (ProgID);
    КонецЕсли;
Исключение
    Сообщить("Ошибка инициализации: " + ОписаниеОшибки());
КонецПопытки;

Если ОбъектДрайвера = Неопределено Тогда
    Сообщить("Внешняя компонента драйвера не найдена или не зарегистрирована в ОС.");
КонецЕсли;

Если библиотека представляет собой стандартный COM-сервер, к ней также можно обратиться напрямую без предварительного вызова ПодключитьВнешнююКомпоненту:


Попытка
    ОбъектДрайвера = Новый COMОбъект("AddIn.FPrnM8");
Исключение
    Сообщить("Не удалось создать COM-объект: " + ОписаниеОшибки());
КонецПопытки;

Причина 3. Несовпадение разрядности клиента 1С и библиотеки DLL

Выясним частую причину сбоев, возникающих на современных операционных системах x64. Разрядность исполняемого процесса 1С (клиентского приложения или рабочего процесса сервера) должна строго совпадать с разрядностью загружаемой динамической библиотеки.

  1. Многие устаревшие драйверы оборудования (в частности, 8-я версия драйверов ККТ) скомпилированы исключительно под 32-разрядную архитектуру (x86).
  2. Попытка загрузить 32-разрядную библиотеку в 64-разрядный клиент 1С (1cv8c.exe x64) или на 64-разрядном сервере 1С приведет к тому, что метод вернет Ложь либо завершится с ошибкой неопределенного типа.
  3. Для работы с 32-разрядными компонентами необходимо запускать 32-разрядную версию платформы 1С:Предприятие.
  4. При регистрации 32-битной библиотеки в 64-разрядной Windows утилитой regsvr32 необходимо использовать системную утилиту из каталога C:\Windows\SysWOW64\regsvr32.exe.

Причина 4. Контекст исполнения кода (Клиент vs Сервер)

Обратим внимание на директивы компиляции в модулях 1С. Подключение торгового оборудования, работающего через локальные порты (COM, USB), должно выполняться на стороне клиента в контексте &НаКлиенте. Попытка загрузить библиотеку на сервере (&НаСервере) приведет к тому, что компонента либо не сможет загрузиться из-за отсутствия файлов на стороне сервера, либо не получит доступа к локальным устройствам рабочего места кассира.

Рассмотрим корректную обработку подключения и гарантированное освобождение ресурсов драйвера:


&НаКлиенте
Процедура ПодключитьОборудование()
    
    ProgID = "AddIn.ATOL_KKM_1C82_54FZ";
    ОбъектДрайвера = Неопределено;
    
    Попытка
        Если ПодключитьВнешнююКомпоненту(ProgID) Тогда
            ОбъектДрайвера = Новый (ProgID);
        Иначе
            Сообщить("Не удалось подключить компоненту: " + ProgID);
            Возврат;
        КонецЕсли;
    Исключение
        Сообщить("Исключение при создании объекта: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Выполнение операций с драйвером...
    
    // Корректное освобождение объекта
    Если ОбъектДрайвера <> Неопределено Тогда
        Попытка
            ОбъектДрайвера.DeviceEnabled = Ложь;
        Исключение
        КонецПопытки;
        ОбъектДрайвера = Неопределено;
    КонецЕсли;
    
КонецПроцедуры

Соблюдение соответствия псевдонимов, проверка разрядности приложения и корректное указание технологии (COM или Native API) позволяют гарантированно устранить ошибку «Тип не определен» при интеграции внешних библиотек в 1С.

← На главную