Как правильно подключить DLL, написанную на VB.NET, к 1С:Предприятию 7.7

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

При разработке расширений для платформы 1С 7.7 программисты часто сталкиваются с ситуацией, когда библиотека, написанная на современных языках программирования (например, VB.NET или C#), отказывается загружаться стандартными методами. Рассмотрим типичную ситуацию: у нас есть готовая DLL, но при попытке использовать ЗагрузитьВнешнююКомпоненту система выдает ошибки, связанные с CLSID или отсутствием интерфейса IInitDone. Разберемся по шагам, почему это происходит и как заставить 1С работать с такой библиотекой.

Почему не работает ЗагрузитьВнешнююКомпоненту

Проанализируем причину неудачи. Команда ЗагрузитьВнешнююКомпоненту в 1С 7.7 предназначена исключительно для работы с библиотеками, которые написаны по технологии 1С:Внешние компоненты. Это специфический стандарт, требующий от DLL реализации строго определенных интерфейсов, таких как IInitDone (для инициализации) и ILanguageExtender (для взаимодействия с языком 1С).

Библиотека, созданная на .NET (VB.NET), даже если она помечена как ComVisible, по умолчанию не содержит этих интерфейсов. Именно поэтому 1С выдает ошибку: "отсутствует интерфейс IInitDone". Система просто не понимает, как управлять этой компонентой в рамках своего внутреннего жизненного цикла.

Вариант 1: Использование DLL как COM-объекта (самый простой путь)

Если нам нужно просто вызвать методы из нашей библиотеки, нам не обязательно делать из нее "внешнюю компоненту". Мы можем использовать её как обычный 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. ProgId: Это текстовое имя, по которому мы будем обращаться к объекту из 1С.
  2. Guid: Уникальный идентификатор класса.
  3. ComVisible(True): Делает класс видимым для COM-клиентов.
  4. Пустой конструктор: Без него 1С не сможет инициализировать объект.

Регистрация библиотеки в системе

Поскольку 1С 7.7 — это 32-битное приложение, регистрация .NET-сборки имеет критическое значение. Выясним, как правильно зарегистрировать DLL, чтобы система её "увидела". Нам понадобится утилита regasm.exe, входящая в состав .NET Framework.

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

  1. Перейдем в папку с 32-битной версией .NET Framework (это важно!): C:\Windows\Microsoft.NET\Framework\v4.0.30319\.
  2. Выполним регистрацию с ключом /codebase:

regasm.exe "C:\ПутьКВашейПапке\ProcManLib.dll" /codebase /tlb

Зачем нужен ключ /codebase? Без него Windows будет искать библиотеку только в GAC (Global Assembly Cache) или в папке bin самой 1С. Флаг /codebase прописывает в реестре прямой путь к файлу DLL, где бы он ни находился.

Вызов объекта в коде 1С 7.7

Теперь, когда библиотека зарегистрирована как COM-объект, мы отказываемся от использования ЗагрузитьВнешнююКомпоненту. Вместо этого мы используем стандартный метод СоздатьОбъект. Посмотрим, как теперь выглядит код в 1С:


Попытка
    // Используем ProgId, указанный программистом в коде DLL
    МояВК = СоздатьОбъект("ProcManLib.ProcManLib");
    Результат = МояВК.GetInfo();
    Сообщить(Результат);
Исключение
    Сообщить("Не удалось создать объект ProcManLib! Проверьте регистрацию DLL.");
КонецПопытки;

Вариант 2: Использование библиотек-посредников

Если вы не хотите заниматься регистрацией через regasm на каждом рабочем месте или библиотека написана так, что её сложно переделать под COM, можно воспользоваться сторонними решениями. Проанализируем популярные варианты:

  1. DynWrapX: Позволяет вызывать функции из обычных (не COM) DLL напрямую через передачу параметров. Это избавляет от необходимости регистрировать компоненту, но требует описания типов аргументов в коде 1С.
  2. NetObjectToIDispatch: Специальная внешняя компонента, которая выступает "мостом" между 1С 7.7 и миром .NET. Вы загружаете одну эту компоненту, а через неё уже создаете любые объекты .NET Framework без их предварительной регистрации в реестре.

Типичные ошибки и способы их устранения

Разберем ситуации, когда даже после регистрации объект не создается:

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С становится простой и прозрачной через метод СоздатьОбъект.

← На главную