Рассмотрим весьма распространенную ситуацию при работе с устаревшими системами на базе 1С:Предприятие 7.7. Допустим, у вас есть самописная внешняя компонента, написанная на VB.net или C#, предназначенная для работы с оборудованием (например, фискальным регистратором). Внезапно при попытке её загрузки система начинает выдавать ошибки.
При использовании метода ПодключитьВнешнююКомпоненту возникает сообщение:
Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует интерфейс IInitDone)
Если мы пытаемся изменить код и использовать ЗагрузитьВнешшнююКомпоненту, получаем:
Ошибка при создании объекта из компоненты \\SERVER\SHARE\... (отсутствует CLSID)
При попытке же зарегистрировать библиотеку классическим способом через regsvr32 система жалуется на отсутствие точки входа DLLRegisterServer. Проанализируем эту ситуацию по шагам и выясним причины такого поведения, а затем разберем способы восстановления работоспособности.
Сначала разберемся, почему стандартная регистрация завершается неудачей. Дело в том, что утилита regsvr32 предназначена исключительно для неуправляемого кода (native C++, VB6). Библиотеки, написанные на платформе .NET (C#, VB.net), являются управляемыми сборками (.NET assemblies) и не содержат традиционной точки входа DLLRegisterServer. Поэтому попытка зарегистрировать их таким образом всегда будет приводить к ошибке.
Что касается ошибок в самой 1С 7.7, здесь играют роль два ключевых фактора:
ПодключитьВнешнююКомпоненту ожидает, что DLL строго реализует специфические интерфейсы (IInitDone, ILanguageExtender и др.). Если в вашем VB.net коде они не реализованы (или слетела COM-регистрация, предоставляющая к ним доступ), 1С не сможет подключить библиотеку как "родную" компоненту.\\SERVER\SHARE\.... Платформа .NET имеет встроенную систему безопасности (Code Access Security), которая по умолчанию блокирует или ограничивает выполнение кода с недоверенных сетевых ресурсов. В результате классы не загружаются, и 1С сообщает об отсутствии CLSID.Чтобы исключить влияние политик безопасности сети, первым делом скопируем файл нашей DLL с сетевого диска на локальный накопитель компьютера, где запускается 1С. Разместим файл, например, в каталоге базы данных локально или в отдельной папке, скажем, C:\Bin\Azimuth.dll. Это снимет ограничения .NET Framework на запуск кода из сетевых зон.
Для регистрации .NET компонентов в качестве COM-объектов (чтобы 1С могла с ними взаимодействовать) мы должны использовать специальную утилиту RegAsm.exe, входящую в состав .NET Framework.
Выполним следующие действия:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe (версия папки может отличаться в зависимости от установленного Framework). Важно: поскольку 1С 7.7 работает строго в 32-битной архитектуре (x86), мы должны использовать именно 32-битную версию утилиты из папки Framework, а не Framework64!/codebase (для указания пути к файлу, чтобы не помещать его в GAC) и /tlb (для создания библиотеки типов):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Bin\Azimuth.dll" /codebase /tlb
Если команда выполнилась успешно, в консоли появится соответствующее сообщение.
Если ваша библиотека на VB.net представляет собой просто набор COM-классов и не реализует сложный интерфейс IInitDone, который требует 1С, загружать её через ПодключитьВнешнююКомпоненту некорректно.
После успешной регистрации через RegAsm мы можем создать объект стандартным способом. Посмотрим на правильный вариант инициализации в коде 1С:
Попытка
Комп = СоздатьОбъект("AddIn.Azimuth1");
Исключение
Сообщить("Не удалось создать COM-объект. Проверьте регистрацию компоненты!");
КонецПопытки;
Если проблема не решилась с первого раза, проверим следующие нюансы:
regsvr32.exe строго из папки C:\Windows\SysWOW64\.Подводя итог: интеграция современных .NET библиотек со старой платформой 1С 7.7 через COM требует внимания к разрядности, правам доступа и использованию специализированных утилит (RegAsm вместо regsvr32). Следуя описанным выше шагам, вы сможете восстановить работу вашего торгового оборудования или других самописных компонент.