Разработка и Конфигурация · 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С нет классической регистрации классов, но общие модули и объекты метаданных должны быть корректно описаны в конфигураторе, чтобы быть доступными из кода.
Как выбрать действие
Регистрация 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Объект() выполняется без исключения
Ошибка 0x80040154 — класс не зарегистрирован или неверная разрядность
ПодключитьВнешнююКомпоненту возвращает Истина
Возвращает Ложь — проверьте путь, макет и совместимость платформы
Модуль виден в контекстной подсказке и вызывается
Переменная не определена — проверьте флаги контекста и обновление конфигурации
Если регистрация прошла, а объект не создаётся, проверьте реестр: для 64-разрядного класса запись должна быть в HKCR\CLSID\{GUID}, для 32-разрядного на 64-битной системе — в HKCR\WOW6432Node\CLSID\{GUID}. Также убедитесь, что у учётной записи, под которой работает процесс 1С, есть права на чтение DLL и ветки реестра.
Часто задаваемые вопросы
Можно ли зарегистрировать 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 — через ПодключитьВнешнююКомпоненту в коде, общий модуль — через конфигуратор с верными флагами контекста. Всегда проверяйте результат тестовым созданием объекта и учитывайте, на какой машине выполняется код.