Как исправить ошибку подключения внешней компоненты .NET в 1С 7.7 (отсутствует IInitDone или CLSID)?

Программист 1С v7.7
← На главную

Рассмотрим весьма распространенную ситуацию при работе с устаревшими системами на базе 1С:Предприятие 7.7. Допустим, у вас есть самописная внешняя компонента, написанная на VB.net или C#, предназначенная для работы с оборудованием (например, фискальным регистратором). Внезапно при попытке её загрузки система начинает выдавать ошибки.

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

Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует интерфейс IInitDone)

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

Ошибка при создании объекта из компоненты \\SERVER\SHARE\... (отсутствует CLSID)

При попытке же зарегистрировать библиотеку классическим способом через regsvr32 система жалуется на отсутствие точки входа DLLRegisterServer. Проанализируем эту ситуацию по шагам и выясним причины такого поведения, а затем разберем способы восстановления работоспособности.

Почему не работает regsvr32 и откуда берутся ошибки?

Сначала разберемся, почему стандартная регистрация завершается неудачей. Дело в том, что утилита regsvr32 предназначена исключительно для неуправляемого кода (native C++, VB6). Библиотеки, написанные на платформе .NET (C#, VB.net), являются управляемыми сборками (.NET assemblies) и не содержат традиционной точки входа DLLRegisterServer. Поэтому попытка зарегистрировать их таким образом всегда будет приводить к ошибке.

Что касается ошибок в самой 1С 7.7, здесь играют роль два ключевых фактора:

  1. Отсутствие обязательных интерфейсов 1С: Метод ПодключитьВнешнююКомпоненту ожидает, что DLL строго реализует специфические интерфейсы (IInitDone, ILanguageExtender и др.). Если в вашем VB.net коде они не реализованы (или слетела COM-регистрация, предоставляющая к ним доступ), 1С не сможет подключить библиотеку как "родную" компоненту.
  2. Политики безопасности .NET Framework (CAS): В тексте второй ошибки фигурирует сетевой путь \\SERVER\SHARE\.... Платформа .NET имеет встроенную систему безопасности (Code Access Security), которая по умолчанию блокирует или ограничивает выполнение кода с недоверенных сетевых ресурсов. В результате классы не загружаются, и 1С сообщает об отсутствии CLSID.

Шаг 1. Перенос библиотеки на локальный диск

Чтобы исключить влияние политик безопасности сети, первым делом скопируем файл нашей DLL с сетевого диска на локальный накопитель компьютера, где запускается 1С. Разместим файл, например, в каталоге базы данных локально или в отдельной папке, скажем, C:\Bin\Azimuth.dll. Это снимет ограничения .NET Framework на запуск кода из сетевых зон.

Шаг 2. Правильная регистрация .NET сборки

Для регистрации .NET компонентов в качестве COM-объектов (чтобы 1С могла с ними взаимодействовать) мы должны использовать специальную утилиту RegAsm.exe, входящую в состав .NET Framework.

Выполним следующие действия:

  1. Откроем командную строку (cmd) обязательно от имени Администратора. Если этого не сделать, записи в системный реестр не будут добавлены корректно.
  2. Найдем утилиту RegAsm. Обычно она располагается по пути вроде C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe (версия папки может отличаться в зависимости от установленного Framework). Важно: поскольку 1С 7.7 работает строго в 32-битной архитектуре (x86), мы должны использовать именно 32-битную версию утилиты из папки Framework, а не Framework64!
  3. Выполним команду регистрации с ключами /codebase (для указания пути к файлу, чтобы не помещать его в GAC) и /tlb (для создания библиотеки типов):

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Bin\Azimuth.dll" /codebase /tlb

Если команда выполнилась успешно, в консоли появится соответствующее сообщение.

Шаг 3. Изменение способа инициализации объекта в 1С

Если ваша библиотека на VB.net представляет собой просто набор COM-классов и не реализует сложный интерфейс IInitDone, который требует 1С, загружать её через ПодключитьВнешнююКомпоненту некорректно.

После успешной регистрации через RegAsm мы можем создать объект стандартным способом. Посмотрим на правильный вариант инициализации в коде 1С:


Попытка
    Комп = СоздатьОбъект("AddIn.Azimuth1");
Исключение
    Сообщить("Не удалось создать COM-объект. Проверьте регистрацию компоненты!");
КонецПопытки;

Дополнительные рекомендации и проверки

Если проблема не решилась с первого раза, проверим следующие нюансы:

Подводя итог: интеграция современных .NET библиотек со старой платформой 1С 7.7 через COM требует внимания к разрядности, правам доступа и использованию специализированных утилит (RegAsm вместо regsvr32). Следуя описанным выше шагам, вы сможете восстановить работу вашего торгового оборудования или других самописных компонент.

← На главную