При интеграции 1С:Предприятия с торговым оборудованием (например, ККТ АТОЛ или сканерами штрихкодов) разработчики часто сталкиваются с ситуацией, когда метод подключения внешней компоненты отрабатывает успешно, однако при попытке создать экземпляр объекта через оператор Новый возникает исключение: «Тип не определен (AddIn...)». Разберем по шагам, почему возникает эта ошибка и как правильно выполнять загрузку и инициализацию внешних компонент различных типов.
Проанализируем механику работы метода ПодключитьВнешнююКомпоненту. Существует два основных варианта синтаксиса:
ПодключитьВнешнююКомпоненту(ProgID). В этом случае библиотека предварительно регистрируется в операционной системе, а тип создается строго по имени ProgID из реестра Windows.ПодключитьВнешнююКомпоненту(ПутьКФайлу, ИмяПодключения, ТипВнешнейКомпоненты).Типичная ошибка заключается в смешивании этих подходов: разработчик передает путь к файлу и задает локальный псевдоним (например, "FprnM1C82_54FZ"), а затем пытается создать объект по зарегистрированному в системе ProgID (например, "AddIn.ATOL_KKM_1C82_54FZ"). В результате платформа ищет тип по назначенному псевдониму сеанса и выдает ошибку неопределенного типа.
Посмотрим на пример правильной инициализации компоненты по локальному псевдониму:
ПутьКФайлу = "C:\Program Files\ATOL\Drivers8\1Cv82\FZ54\FprnM1C82_54FZ.dll";
ИмяПодключения = "МойДрайверККТ";
// Подключаем библиотеку и задаем псевдоним для текущего сеанса
Подключено = ПодключитьВнешнююКомпоненту(ПутьКФайлу, ИмяПодключения, ТипВнешнейКомпоненты.COM);
Если Подключено Тогда
// Создание объекта выполняется строго через назначенный псевдоним
ОбъектДрайвера = Новый ("AddIn." + ИмяПодключения);
Иначе
ВызватьИсключение "Не удалось подключить внешнюю компоненту по указанному пути.";
КонецЕсли;
Рассмотрим вариант, когда библиотека поставляется производителем вместе с дистрибутивом драйверов и регистрируется в реестре Windows с помощью системной утилиты regsvr32. В таком случае указывать прямой путь к файлу .dll на диске не требуется.
Разберем по шагам последовательность действий:
regsvr32 "C:\Program Files\ATOL\Drivers8\Bin_Free\FprnM1C.dll"
ПодключитьВнешнююКомпоненту, передав только зарегистрированный ProgID.Новый или COMОбъект.
ProgID = "AddIn.ATOL_KKM_1C82_54FZ";
ОбъектДрайвера = Неопределено;
Попытка
Если ПодключитьВнешнююКомпоненту(ProgID) Тогда
ОбъектДрайвера = Новый (ProgID);
КонецЕсли;
Исключение
Сообщить("Ошибка инициализации: " + ОписаниеОшибки());
КонецПопытки;
Если ОбъектДрайвера = Неопределено Тогда
Сообщить("Внешняя компонента драйвера не найдена или не зарегистрирована в ОС.");
КонецЕсли;
Если библиотека представляет собой стандартный COM-сервер, к ней также можно обратиться напрямую без предварительного вызова ПодключитьВнешнююКомпоненту:
Попытка
ОбъектДрайвера = Новый COMОбъект("AddIn.FPrnM8");
Исключение
Сообщить("Не удалось создать COM-объект: " + ОписаниеОшибки());
КонецПопытки;
Выясним частую причину сбоев, возникающих на современных операционных системах x64. Разрядность исполняемого процесса 1С (клиентского приложения или рабочего процесса сервера) должна строго совпадать с разрядностью загружаемой динамической библиотеки.
1cv8c.exe x64) или на 64-разрядном сервере 1С приведет к тому, что метод вернет Ложь либо завершится с ошибкой неопределенного типа.regsvr32 необходимо использовать системную утилиту из каталога C:\Windows\SysWOW64\regsvr32.exe.Обратим внимание на директивы компиляции в модулях 1С. Подключение торгового оборудования, работающего через локальные порты (COM, USB), должно выполняться на стороне клиента в контексте &НаКлиенте. Попытка загрузить библиотеку на сервере (&НаСервере) приведет к тому, что компонента либо не сможет загрузиться из-за отсутствия файлов на стороне сервера, либо не получит доступа к локальным устройствам рабочего места кассира.
Рассмотрим корректную обработку подключения и гарантированное освобождение ресурсов драйвера:
&НаКлиенте
Процедура ПодключитьОборудование()
ProgID = "AddIn.ATOL_KKM_1C82_54FZ";
ОбъектДрайвера = Неопределено;
Попытка
Если ПодключитьВнешнююКомпоненту(ProgID) Тогда
ОбъектДрайвера = Новый (ProgID);
Иначе
Сообщить("Не удалось подключить компоненту: " + ProgID);
Возврат;
КонецЕсли;
Исключение
Сообщить("Исключение при создании объекта: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Выполнение операций с драйвером...
// Корректное освобождение объекта
Если ОбъектДрайвера <> Неопределено Тогда
Попытка
ОбъектДрайвера.DeviceEnabled = Ложь;
Исключение
КонецПопытки;
ОбъектДрайвера = Неопределено;
КонецЕсли;
КонецПроцедуры
Соблюдение соответствия псевдонимов, проверка разрядности приложения и корректное указание технологии (COM или Native API) позволяют гарантированно устранить ошибку «Тип не определен» при интеграции внешних библиотек в 1С.