При разработке расширений для платформы 1С 7.7 программисты часто сталкиваются с ситуацией, когда библиотека, написанная на современных языках программирования (например, VB.NET или C#), отказывается загружаться стандартными методами. Рассмотрим типичную ситуацию: у нас есть готовая DLL, но при попытке использовать ЗагрузитьВнешнююКомпоненту система выдает ошибки, связанные с CLSID или отсутствием интерфейса IInitDone. Разберемся по шагам, почему это происходит и как заставить 1С работать с такой библиотекой.
Проанализируем причину неудачи. Команда ЗагрузитьВнешнююКомпоненту в 1С 7.7 предназначена исключительно для работы с библиотеками, которые написаны по технологии 1С:Внешние компоненты. Это специфический стандарт, требующий от DLL реализации строго определенных интерфейсов, таких как IInitDone (для инициализации) и ILanguageExtender (для взаимодействия с языком 1С).
Библиотека, созданная на .NET (VB.NET), даже если она помечена как ComVisible, по умолчанию не содержит этих интерфейсов. Именно поэтому 1С выдает ошибку: "отсутствует интерфейс IInitDone". Система просто не понимает, как управлять этой компонентой в рамках своего внутреннего жизненного цикла.
Если нам нужно просто вызвать методы из нашей библиотеки, нам не обязательно делать из нее "внешнюю компоненту". Мы можем использовать её как обычный COM-сервер. Для этого программисту на VB.NET нужно правильно подготовить код, а нам — правильно его зарегистрировать в Windows.
Рассмотрим структуру кода на стороне VB.NET, которая необходима для корректной экспозиции класса в COM:
<ComVisible(True), ProgId("ProcManLib.ProcManLib"),
Guid("f6019994-9e8f-459f-8151-b058ca55f3a6"), ClassInterface(ClassInterfaceType.AutoDispatch)>
Public Class ProcManLib
Public Sub New()
' Пустой конструктор обязателен для COM
End Sub
Public Function GetInfo() As String
Return "Работает!"
End Function
End Class
Важные моменты в коде:
Поскольку 1С 7.7 — это 32-битное приложение, регистрация .NET-сборки имеет критическое значение. Выясним, как правильно зарегистрировать DLL, чтобы система её "увидела". Нам понадобится утилита regasm.exe, входящая в состав .NET Framework.
Проанализируем правильный порядок действий в командной строке (запущенной от имени администратора):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\./codebase:
regasm.exe "C:\ПутьКВашейПапке\ProcManLib.dll" /codebase /tlb
Зачем нужен ключ /codebase? Без него Windows будет искать библиотеку только в GAC (Global Assembly Cache) или в папке bin самой 1С. Флаг /codebase прописывает в реестре прямой путь к файлу DLL, где бы он ни находился.
Теперь, когда библиотека зарегистрирована как COM-объект, мы отказываемся от использования ЗагрузитьВнешнююКомпоненту. Вместо этого мы используем стандартный метод СоздатьОбъект. Посмотрим, как теперь выглядит код в 1С:
Попытка
// Используем ProgId, указанный программистом в коде DLL
МояВК = СоздатьОбъект("ProcManLib.ProcManLib");
Результат = МояВК.GetInfo();
Сообщить(Результат);
Исключение
Сообщить("Не удалось создать объект ProcManLib! Проверьте регистрацию DLL.");
КонецПопытки;
Если вы не хотите заниматься регистрацией через regasm на каждом рабочем месте или библиотека написана так, что её сложно переделать под COM, можно воспользоваться сторонними решениями. Проанализируем популярные варианты:
Разберем ситуации, когда даже после регистрации объект не создается:
1. Ошибка разрядности. Если вы зарегистрировали DLL с помощью 64-битного regasm (который лежит в папке Framework64), 1С 7.7 её никогда не увидит. Всегда используйте версию из папки Framework.
2. Отсутствие зависимостей. Если ваша ProcManLib.dll использует другие библиотеки, они должны лежать в той же папке или быть зарегистрированы в GAC. Проверить это можно утилитой Dependency Walker.
3. Версия .NET Framework. Убедитесь, что на компьютере пользователя установлен именно тот .NET Framework, под которым компилировалась библиотека (например, 4.0, 4.5 или 4.8).
Подведем итог: для успешной работы с DLL на VB.NET в 1С 7.7 лучше всего использовать путь COM-объекта. Это требует минимальных правок в коде (добавление атрибутов видимости) и корректной регистрации через regasm /codebase, после чего работа с функционалом библиотеки в 1С становится простой и прозрачной через метод СоздатьОбъект.