К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как зарегистрировать класс в 1С и подключить его к конфигурации

Как зарегистрировать класс в 1С: COM-класс через regsvr32, внешние компоненты через ПодключитьВнешнююКомпоненту, типовые ошибки и проверка результата.

Под «регистрацией класса» в контексте 1С обычно понимают одну из трёх задач: регистрацию COM-класса внешней библиотеки в Windows, подключение внешней компоненты Native API к информационной базе или регистрацию общего модуля (класса в терминах 1C:EDT и расширений). Все три сценария решаются разными инструментами, и путаница между ними — главная причина ошибок вида «Не удалось создать объект» или «Класс не зарегистрирован».

Ошибка «Класс не зарегистрирован» (код 0x80040154, REGDB_E_CLASSNOTREG) возникает, когда платформа 1С пытается создать COM-объект через Новый COMОбъект(), а операционная система не находит его CLSID в реестре. Причина почти всегда одна: DLL с классом либо вообще не зарегистрирована, либо зарегистрирована не в той разрядности, либо регистрация выполнена от имени другого пользователя.

Ниже разобраны все три сценария с конкретными командами, проверками результата и типичными ошибками. Материал ориентирован на администраторов и разработчиков, работающих с платформой 1С:Предприятие 8.3 на Windows.

Что именно нужно зарегистрировать: определяем сценарий

Прежде чем выполнять какие-либо действия, определите, с каким типом класса вы работаете. От этого зависит весь дальнейший порядок действий.

  • COM-класс из DLL — внешняя библиотека (например, драйвер оборудования, библиотека интеграции), создание объекта идёт через Новый COMОбъект("Имя.Класса"). Регистрируется средствами Windows.
  • Внешняя компонента Native API — специальный формат компонент для 1С, подключается методом ПодключитьВнешнююКомпоненту(). Может храниться в макете конфигурации или в файле.
  • Класс/модуль внутри конфигурации — в 1С нет классической регистрации классов, но общие модули и объекты метаданных должны быть корректно описаны в конфигураторе, чтобы быть доступными из кода.
Маршрут решения

Как выбрать действие

Ошибка 0x80040154 при Новый COMОбъект()Регистрируйте DLL через regsvr32 с учётом разрядности
Ошибка Тип не определён при подключении компонентыИспользуйте ПодключитьВнешнююКомпоненту и проверьте ProgID
Модуль не виден из кода конфигурацииПроверьте флаги Клиент/Сервер в свойствах общего модуля

Регистрация COM-класса через regsvr32

Стандартный способ зарегистрировать COM-класс — утилита regsvr32, входящая в состав Windows. Команда выполняется в командной строке, запущенной от имени администратора: без повышенных прав запись в ветку реестра HKEY_CLASSES_ROOT будет отклонена.

После регистрации проверьте создание объекта простым кодом в 1С:

Попытка

Объект = Новый COMОбъект("MyLib.MyClass");

Сообщить("Объект создан успешно");

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

Разрядность: клиент, сервер и где регистрировать класс

COM-объект создаётся в том процессе, где выполняется код. Если код исполняется на тонком клиенте — класс должен быть зарегистрирован на машине пользователя. Если код выполняется на сервере 1С (серверный вызов, фоновое задание, регламентное задание) — регистрировать DLL нужно на сервере приложений, причём под той разрядностью, под которой работает рабочий процесс rphost.

Частая ситуация: на компьютере разработчика всё работает, а в боевой базе — ошибка «Класс не зарегистрирован». Это означает, что DLL зарегистрирована локально, но не на сервере, либо код исполняется в другом контексте, чем ожидалось.

Подключение внешней компоненты Native API

Внешние компоненты по технологии Native API не требуют regsvr32 — платформа 1С загружает их сама. Компонента подключается методом ПодключитьВнешнююКомпоненту(), которому передаётся либо путь к DLL, либо имя макета конфигурации, в котором компонента хранится в виде ZIP-архива.

Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечати", "PrintComp") Тогда

ОбъектКомпоненты = Новый("AddIn.PrintComp.Printer");

Иначе

Сообщить("Не удалось подключить компоненту");

КонецЕсли;

Второй параметр — ProgID компоненты, он задаётся разработчиком компоненты и указывается в её документации. Объект создаётся конструкцией Новый("AddIn.ProgID.ИмяКласса"). Если вы получаете ошибку «Тип не определён (AddIn...)», значит компонента не подключилась или ProgID указан неверно.

Регистрация общего модуля (класса) в конфигураторе

Если под «классом» понимается собственный программный модуль, то в конфигураторе он оформляется как общий модуль: в дереве конфигурации откройте ветку «Общие» → «Общие модули», добавьте новый объект и задайте имя. Именно это имя станет «именем класса» при обращении из кода: МойМодуль.МояФункция().

Обратите внимание на флаги в свойствах модуля: «Клиент (управляемое приложение)», «Сервер», «Внешнее соединение». Если модуль помечен только как серверный, обращение к нему из клиентского кода вызовет ошибку «Переменная не определена». Для модулей, доступных и на клиенте, и на сервере, включайте оба флага и при необходимости «Вызов сервера».

После добавления модуля обновите конфигурацию базы данных (F7), иначе изменения не попадут в рабочую базу. Проверка простая: в любом другом модуле начните вводить имя общего модуля — контекстная подсказка должна его показать.

Проверка результата и диагностика ошибок

Контрольные точки

Как проверить результат

Создание COM-объекта
Норма

Новый COMОбъект() выполняется без исключения

Тревожный признак

Ошибка 0x80040154 — класс не зарегистрирован или неверная разрядность

Подключение компоненты
Норма

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

Тревожный признак

Возвращает Ложь — проверьте путь, макет и совместимость платформы

Доступность общего модуля
Норма

Модуль виден в контекстной подсказке и вызывается

Тревожный признак

Переменная не определена — проверьте флаги контекста и обновление конфигурации

Если регистрация прошла, а объект не создаётся, проверьте реестр: для 64-разрядного класса запись должна быть в HKCR\CLSID\{GUID}, для 32-разрядного на 64-битной системе — в HKCR\WOW6432Node\CLSID\{GUID}. Также убедитесь, что у учётной записи, под которой работает процесс 1С, есть права на чтение DLL и ветки реестра.

Типичные ошибки
01
Регистрация 32-битной DLL через regsvr32 из System32 — класс попадает не в тот раздел реестра, и 1С его не находит
02
Регистрация DLL только на клиенте, тогда как код выполняется на сервере 1С — ошибка проявляется только в боевой базе
03
Запуск regsvr32 без прав администратора — регистрация молча не выполняется или завершается ошибкой доступа
04
Неверный ProgID при подключении Native API компоненты — ошибка Тип не определён
05
Забытое обновление конфигурации базы данных после добавления общего модуля — модуль не виден в рабочей базе

Часто задаваемые вопросы

Можно ли зарегистрировать COM-класс без прав администратора?

Да, существует регистрация на уровне пользователя (registration-free COM или запись в HKCU вместо HKCR), но стандартный regsvr32 этого не делает. Для большинства сценариев с 1С проще получить права администратора и выполнить обычную регистрацию.

Почему после регистрации 1С всё равно выдаёт «Класс не зарегистрирован»?

Чаще всего несовпадение разрядности: 32-битная DLL не видна 64-битному процессу 1С и наоборот. Также проверьте, что код выполняется на той машине, где выполнена регистрация — клиент или сервер.

Чем отличается COM-объект от внешней компоненты Native API?

COM-объект регистрируется в Windows и создаётся через Новый COMОбъект(). Компонента Native API загружается самой платформой через ПодключитьВнешнююКомпоненту, работает без записи в реестр и переносится вместе с конфигурацией в макете.

Где взять ProgID компоненты, если документации нет?

ProgID обычно указан в исходниках компоненты или в манифесте внутри ZIP-архива (файл INFO.XML). Для COM-класса ProgID можно посмотреть в реестре в ветке HKCR по имени класса.

Нужно ли заново регистрировать компоненту после обновления платформы 1С?

COM-классы в реестре Windows от обновления платформы не зависят. А вот внешние компоненты Native API могут потребовать новой сборки, если изменилась версия интерфейса компонент — проверяйте совместимость при смене версии платформы.

Итог

Что важно запомнить

COM-класс регистрируется через regsvr32 от администратора с правильной разрядностью, компонента Native API — через ПодключитьВнешнююКомпоненту в коде, общий модуль — через конфигуратор с верными флагами контекста. Всегда проверяйте результат тестовым созданием объекта и учитывайте, на какой машине выполняется код.