Почему ПодключитьВнешнююКомпоненту не вызывает исключение, но при создании объекта возникает ошибка «Тип не определен»?

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

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

Анализ проблемы: поведение функции ПодключитьВнешнююКомпоненту

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


Попытка 
    ПодключитьВнешнююКомпоненту("AddIn.GraphicsNET"); 
Исключение 
    Сообщить(ОписаниеОшибки()); 
    Возврат; 
КонецПопытки; 

Попытка 
    GraphicsVK = Новый("AddIn.GraphicsNET"); 
Исключение 
    Сообщить(ОписаниеОшибки()); 
    Возврат; 
КонецПопытки;

Выясним причину, по которой блок Попытка ... Исключение не перехватывает проблему на первом этапе. Метод глобального контекста ПодключитьВнешнююКомпоненту спроектирован как функция, возвращающая значение типа Булево:

  1. Истина — внешняя компонента успешно найдена, загружена в адресное пространство процесса и зарегистрирована в платформе.
  2. Ложь — процесс подключения завершился неудачно (библиотека не зарегистрирована в реестре, отсутствует файл, не совпадает разрядность или нет необходимых прав).

Так как при неудачной загрузке функция не генерирует исключение времени выполнения, выполнение программы беспрепятственно переходит ко второму блоку. На этапе вызова Новый("AddIn.GraphicsNET") платформа пытается создать экземпляр типа, который так и не появился в системе типов 1С, что и приводит к ошибке «Тип не определен».

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


Если Не ПодключитьВнешнююКомпоненту("AddIn.GraphicsNET") Тогда
    ВызватьИсключение "Не удалось подключить внешнюю компоненту AddIn.GraphicsNET!";
КонецЕсли;

GraphicsVK = Новый("AddIn.GraphicsNET");

Регистрация .NET COM-библиотек в Windows с помощью RegAsm

Если внешняя компонента разработана на платформе .NET Framework (как в случае с GraphicsNET) и реализует интерфейс COM/AddIn, она должна быть предварительно зарегистрирована в реестре операционной системы. Обычная утилита regsvr32.exe для управляемых сборок .NET не подходит — используется системная утилита RegAsm (Assembly Registration Tool).

Разберем по шагам правила регистрации сборки:

  1. Учет разрядности клиента 1С: Разрядность утилиты регистрации должна строго соответствовать разрядности клиентского приложения 1С. Если вы используете 32-разрядный клиент 1С:Предприятия на 64-разрядной операционной системе Windows Server, регистрацию необходимо выполнять через 32-битный regasm.exe.
  2. Использование ключа /codebase: Если библиотека не установлена в глобальный кэш сборок (GAC), обязательно указывается параметр /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

Ограничения Native API, макетов и контекста выполнения

Проанализируем частую ошибку подключения компоненты из макета конфигурации. Методы УстановитьВнешнююКомпоненту и подключение через двоичные данные макетов имеют строгие правила использования:

  1. Контекст исполнения: Метод УстановитьВнешнююКомпоненту доступен только на клиенте (директива &НаКлиенте в тонком и толстом клиентах). Попытка вызвать его на сервере или в модуле внешнего соединения вызовет ошибку компиляции: «Процедура или функция с указанным именем не определена».
  2. Технология разработки: Установка из общего макета и автоматическая доставка компоненты клиенту ориентированы на технологию Native API (или специально упакованные ZIP-архивы с манифестом). Классические COM-компоненты на .NET требуют системной регистрации в реестре Windows.

Альтернативные способы решения задач обработки изображений

Если внешняя компонента использовалась исключительно для изменения размеров, обрезки или конвертации картинок, рассмотрим современные штатные механизмы платформы 1С, которые не требуют внешних DLL, прав администратора и регистрации в реестре:

  1. Объект «ОбработкаКартинок»: Встроенный объект платформы 1С:Предприятие позволяет трансформировать графические файлы нативно и кроссплатформенно:
    
    Обработка = Новый ОбработкаКартинок;
    Обработка.ДобавитьКомандуИзменитьРазмер(800, 600);
    
    ИсходноеИзображение = Новый Картинка("C:\temp\image.jpg");
    РезультирующееИзображение = Обработка.Обработать(ИсходноеИзображение);
    РезультирующееИзображение.Записать("C:\temp\image_resized.jpg");
    
  2. Системный COM-объект Windows Image Acquisition (WIA): Встроенная в Windows библиотека для работы с медиафайлами, не требующая сторонних сборок:
    
    Img = Новый COMОбъект("WIA.ImageFile");
    Img.LoadFile("C:\temp\image.jpg");
    
    IP = Новый COMОбъект("WIA.ImageProcess");
    // Добавление фильтров масштабирования и сохранение
    

Использование встроенного объекта ОбработкаКартинок полностью решает проблему совместимости клиент-серверной архитектуры, исключает сбои разрядности и не требует дополнительного администрирования операционной системы.

← На главную