При интеграции сторонних библиотек и компонентов в платформу 1С:Предприятие разработчики нередко сталкиваются с ситуацией, когда блок подключения отрабатывает без видимых ошибок, однако последующая инициализация объекта через конструктор Новый завершается аварийно. Разберем по шагам, почему возникает ошибка «Тип не определен (AddIn.ИмяКомпоненты)», как правильно регистрировать .NET COM-компоненты в операционной системе и какие штатные альтернативы существуют в платформе 1С.
Рассмотрим типовой фрагмент программного кода, в котором часто допускается логическая ошибка:
Попытка
ПодключитьВнешнююКомпоненту("AddIn.GraphicsNET");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
GraphicsVK = Новый("AddIn.GraphicsNET");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Выясним причину, по которой блок Попытка ... Исключение не перехватывает проблему на первом этапе. Метод глобального контекста ПодключитьВнешнююКомпоненту спроектирован как функция, возвращающая значение типа Булево:
Так как при неудачной загрузке функция не генерирует исключение времени выполнения, выполнение программы беспрепятственно переходит ко второму блоку. На этапе вызова Новый("AddIn.GraphicsNET") платформа пытается создать экземпляр типа, который так и не появился в системе типов 1С, что и приводит к ошибке «Тип не определен».
Посмотрим на корректный вариант проверки результата подключения:
Если Не ПодключитьВнешнююКомпоненту("AddIn.GraphicsNET") Тогда
ВызватьИсключение "Не удалось подключить внешнюю компоненту AddIn.GraphicsNET!";
КонецЕсли;
GraphicsVK = Новый("AddIn.GraphicsNET");
Если внешняя компонента разработана на платформе .NET Framework (как в случае с GraphicsNET) и реализует интерфейс COM/AddIn, она должна быть предварительно зарегистрирована в реестре операционной системы. Обычная утилита regsvr32.exe для управляемых сборок .NET не подходит — используется системная утилита RegAsm (Assembly Registration Tool).
Разберем по шагам правила регистрации сборки:
regasm.exe./codebase. Без него в системный реестр запишется имя сборки, но не запишется путь к физическому расположению DLL-файла, из-за чего COM-активация завершится сбоем.Запустим командную строку от имени Администратора и выполним команду регистрации:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "C:\PathToComponent\GraphicsNET.dll" /codebase /tlb
Для 64-разрядного сервера или клиента 1С путь к утилите будет располагаться в каталоге Framework64:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe "C:\PathToComponent\GraphicsNET.dll" /codebase /tlb
Проанализируем частую ошибку подключения компоненты из макета конфигурации. Методы УстановитьВнешнююКомпоненту и подключение через двоичные данные макетов имеют строгие правила использования:
УстановитьВнешнююКомпоненту доступен только на клиенте (директива &НаКлиенте в тонком и толстом клиентах). Попытка вызвать его на сервере или в модуле внешнего соединения вызовет ошибку компиляции: «Процедура или функция с указанным именем не определена».Если внешняя компонента использовалась исключительно для изменения размеров, обрезки или конвертации картинок, рассмотрим современные штатные механизмы платформы 1С, которые не требуют внешних DLL, прав администратора и регистрации в реестре:
Обработка = Новый ОбработкаКартинок;
Обработка.ДобавитьКомандуИзменитьРазмер(800, 600);
ИсходноеИзображение = Новый Картинка("C:\temp\image.jpg");
РезультирующееИзображение = Обработка.Обработать(ИсходноеИзображение);
РезультирующееИзображение.Записать("C:\temp\image_resized.jpg");
Img = Новый COMОбъект("WIA.ImageFile");
Img.LoadFile("C:\temp\image.jpg");
IP = Новый COMОбъект("WIA.ImageProcess");
// Добавление фильтров масштабирования и сохранение
Использование встроенного объекта ОбработкаКартинок полностью решает проблему совместимости клиент-серверной архитектуры, исключает сбои разрядности и не требует дополнительного администрирования операционной системы.