Ошибка «Класс не зарегистрирован»: регистрируем COM, .NET и внешние компоненты для 1С 8.3

· 9 мин

Содержание

Чтобы зарегистрировать класс для 1С, запустите командную строку от имени администратора и выполните regsvr32 "C:\Program Files\1cv8\<версия>\bin\comcntr.dll". После этого в коде 1С начнёт работать Новый COMОбъект("V83.COMConnector"), а ошибка Класс не зарегистрирован исчезнет. Для своей .NET-библиотеки вместо regsvr32 нужен RegAsm.exe, а для внешней компоненты формата Native регистрация в Windows не нужна совсем.

Что значит «зарегистрировать класс» и когда это нужно

Windows хранит список COM-классов в реестре. Каждый класс имеет текстовое имя (ProgID, например V83.COMConnector) и идентификатор CLSID, а за CLSID закреплён путь к DLL. Когда код 1С вызывает Новый COMОбъект("Имя"), платформа просит Windows найти класс по имени. Нет записи в реестре — нет объекта.

Типовые ситуации, в которых требуется регистрация:

  • 🔌 COM-соединение с другой базой 1С. Обмен, выгрузка данных, внешние скрипты. Нужен класс V83.COMConnector из файла comcntr.dll.
  • 🖥️ Запуск 1С как сервера автоматизации. Внешняя программа управляет 1С через V83.Application. Регистрируется командой 1cv8.exe /regserver.
  • 📦 Своя библиотека на C# или VB.NET. Сборку .NET Framework нужно сделать видимой для COM и зарегистрировать через RegAsm.exe.
  • 🧩 Сторонняя DLL от поставщика оборудования или сервиса. Сканеры, ККТ старых моделей, криптопровайдеры. Регистрируются через regsvr32 или собственный установщик.
  • 📄 Внешняя обработка, которую вызывают как объект. Здесь Windows ни при чём: «регистрация» выполняется внутри 1С.

Типичный текст ошибки при отсутствующем классе:

Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса

Код 0x800401F3 означает, что ProgID не найден в реестре. Код 0x80040154 (Класс не зарегистрирован) — ProgID найден, но DLL по записанному пути не подходит: файл удалён вместе со старой версией платформы или не совпадает разрядность.

Подготовка: разрядность, версия платформы и место выполнения кода

Частая причина неудачи — не команда, а то, что класс регистрируют не там или не той разрядности. Перед запуском regsvr32 ответьте на три вопроса.

1. Где выполняется код. Если Новый COMОбъект стоит в серверной процедуре, а база клиент-серверная, класс нужен на сервере 1С. Регистрация на компьютере бухгалтера ничего не даст. В файловой базе и в клиентском коде класс нужен на том компьютере, где запущена 1С.

2. Какая разрядность у процесса. 64-битный процесс не загружает 32-битную DLL и наоборот.

Где выполняется кодЧья разрядность важнаОткуда брать comcntr.dll
Толстый или тонкий клиент, файловая базаРазрядность установленного клиента 1СC:\Program Files\1cv8\... (x64) или C:\Program Files (x86)\1cv8\... (x86)
Сервер 1С, серверная процедураРазрядность сервера (рабочих процессов rphost)Каталог bin той версии, под которой работает сервер
Внешний скрипт (VBScript, PowerShell, Python)Разрядность интерпретатора скриптаВерсия той же разрядности

3. Какая версия платформы. Регистрация привязывает класс к конкретному файлу. Если после обновления удалить старую версию платформы, запись в реестре указывает на несуществующий файл. Регистрируйте comcntr.dll из той версии, которая реально установлена и будет работать.

Номер версии проще всего посмотреть в самой 1С: кнопка с «i» в заголовке окна или пункт О программе в главном меню. Каталог с этим номером должен быть в C:\Program Files\1cv8\.

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

Регистрация comcntr.dll для COM-соединения

  1. Нажмите Win, наберите cmd, щёлкните правой кнопкой по «Командная строка» и выберите «Запуск от имени администратора».
  2. Для 64-битной платформы выполните:
regsvr32 "C:\Program Files\1cv8\8.3.xx.xxxx\bin\comcntr.dll"
  1. Для 32-битной платформы на 64-битной Windows используйте 32-битную утилиту:
%windir%\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.xx.xxxx\bin\comcntr.dll"
  1. Дождитесь окна «Успешное выполнение DllRegisterServer». Если окно не нужно (например, в скрипте), добавьте ключ /s.
  2. Перезапустите 1С или службу, из которой выполняется код. Уже запущенный процесс не всегда видит новую регистрацию.

Вместо 8.3.xx.xxxx подставьте номер своей версии. Путь берите в кавычки: в нём есть пробелы.

Если 1С установлена в обеих разрядностях, регистрируйте comcntr.dll для каждой. Записи 32-битных и 64-битных классов в реестре живут раздельно и друг другу не мешают.

Отмена регистрации и перерегистрация после обновления

Чтобы снять регистрацию, добавьте ключ /u:

regsvr32 /u "C:\Program Files\1cv8\8.3.xx.xxxx\bin\comcntr.dll"

После обновления платформы удобно держать небольшой bat-файл и запускать его от имени администратора:

@echo off
set VER=8.3.xx.xxxx
regsvr32 /s "C:\Program Files\1cv8\%VER%\bin\comcntr.dll"
if exist "C:\Program Files (x86)\1cv8\%VER%\bin\comcntr.dll" (
  %windir%\SysWOW64\regsvr32.exe /s "C:\Program Files (x86)\1cv8\%VER%\bin\comcntr.dll"
)
echo Готово

Регистрация 1С как сервера автоматизации

Если внешней программе нужен класс V83.Application, регистрируют исполняемый файл:

"C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8.exe" /regserver

Это отдельная регистрация. comcntr.dll она не заменяет: V83.COMConnector подключается к базе без открытия окна 1С, а V83.Application запускает полноценный процесс клиента.

Проверка из кода 1С

Минимальная проверка, что класс находится и соединение открывается:

&НаСервереБезКонтекста
Процедура ПроверитьКоннекторНаСервере()
	Попытка
		Коннектор = Новый COMОбъект("V83.COMConnector");
		Соединение = Коннектор.Connect("Srvr=""srv1c"";Ref=""buh"";Usr=""Обмен"";Pwd=""пароль"";");
		Сообщить("Соединение установлено");
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

Для файловой базы строка соединения выглядит так: File=""D:\Bases\Buh"";Usr=""Обмен"";Pwd=""пароль"";.

Подключение .NET-сборки как COM-класса

1С не работает с .NET напрямую. Сборку делают видимой для COM, регистрируют, а затем создают как обычный COMОбъект. Речь о .NET Framework 4.x: для .NET 5 и новее регистрация устроена иначе, через отдельный COM-хост.

Что сделать в коде библиотеки

  • ✅ Класс публичный, с публичным конструктором без параметров.
  • ✅ У класса или сборки атрибут [ComVisible(true)].
  • ✅ Задан постоянный [Guid("...")] и [ProgId("MyLib.Converter")], чтобы ProgID не менялся от сборки к сборке.
  • ✅ Сборка подписана строгим именем, если её планируется класть в GAC.
using System.Runtime.InteropServices;

[ComVisible(true)]
[Guid("3C1A2B4D-5E6F-4A7B-8C9D-0E1F2A3B4C5D")]
[ProgId("MyLib.Converter")]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class Converter
{
    public string ToUpper(string text) => text.ToUpperInvariant();
}

GUID в примере условный: сгенерируйте свой (в Visual Studio — «Средства → Создать GUID»).

Регистрация через RegAsm

RegAsm.exe входит в .NET Framework. Разрядность выбирается каталогом:

Процесс 1СУтилита
64-битныйC:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe
32-битныйC:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe

Команда от имени администратора:

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" "D:\Libs\MyLib.dll" /codebase /tlb

Ключ /codebase записывает в реестр путь к файлу, поэтому DLL можно не класть в GAC. Без него сборка должна лежать в GAC или рядом с исполняемым файлом процесса. Отмена — тот же вызов с ключом /u.

После этого в 1С:

Конвертер = Новый COMОбъект("MyLib.Converter");
Результат = Конвертер.ToUpper("накладная");

Не перемещайте DLL после регистрации с /codebase. Путь записан в реестре, и после переноса снова появится Класс не зарегистрирован. Переносите — перерегистрируйте.

Внешние компоненты и внешние обработки: регистрация внутри 1С

Внешняя компонента вместо COM-библиотеки

Если поставщик даёт компоненту в формате Native API, regsvr32 не нужен. Компоненту кладут в общий макет конфигурации (или в макет обработки) и подключают из кода:

Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСканера", "Сканер", ТипВнешнейКомпоненты.Native);
Если Подключено Тогда
	Объект = Новый("AddIn.Сканер.Scanner");
КонецЕсли;

Имя класса после AddIn.Сканер. задаёт разработчик компоненты, его берут из документации. Если ПодключитьВнешнююКомпоненту вернула Ложь на клиенте, компоненту сначала устанавливают на компьютер методом УстановитьВнешнююКомпоненту — пользователь увидит запрос на установку. Компоненты старого типа COM всё ещё встречаются, их регистрируют через regsvr32 по правилам раздела выше.

Внешняя обработка как «класс» с методами

Внешнюю обработку можно использовать как объект: экспортные методы её модуля объекта вызываются через точку. Для этого обработку подключают и создают:

&НаСервереБезКонтекста
Функция ВыполнитьРасчёт(АдресФайла)
	ИмяОбработки = ВнешниеОбработки.Подключить(АдресФайла, , Ложь);
	Обработка = ВнешниеОбработки.Создать(ИмяОбработки);
	Возврат Обработка.Рассчитать(100);
КонецФункции

АдресФайла — адрес во временном хранилище, куда клиент предварительно поместил файл .epf. Третий параметр Ложь отключает безопасный режим. Без этого внутри обработки не будут работать COMОбъект, запись файлов и другие привилегированные действия.

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) постоянная регистрация делается через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Обработка должна содержать экспортную функцию СведенияОВнешнейОбработке(), иначе программа откажется её добавлять.

Диагностика: почему класс так и не находится

Начните с реестра. Команда покажет, зарегистрирован ли ProgID и какой у него CLSID:

reg query "HKCR\V83.COMConnector\CLSID"

Затем по полученному CLSID найдите путь к DLL:

reg query "HKCR\CLSID\{ваш-CLSID}\InprocServer32"
reg query "HKCR\WOW6432Node\CLSID\{ваш-CLSID}\InprocServer32"

Первая строка — 64-битная регистрация, вторая — 32-битная. Если путь указывает на каталог удалённой версии платформы, перерегистрируйте DLL из актуальной.

Диагностика: выберите симптом

Чтобы видеть ошибки в рабочей базе, а не только у программиста, пишите их в журнал регистрации:

Исключение
	ЗаписьЖурналаРегистрации("Обмен.COMСоединение", УровеньЖурналаРегистрации.Ошибка, , ,
		ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Смотреть: Администрирование → Обслуживание → Журнал регистрации, отбор по событию «Обмен.COMСоединение».

Права доступа и безопасность

Регистрация пишет в ветку реестра всего компьютера, поэтому без прав администратора regsvr32 и RegAsm завершаются ошибкой 0x80070005. Права нужны только на сам момент регистрации. Пользователям 1С админские права не нужны.

На сервере 1С объект создаёт учётная запись службы (по умолчанию USR1CV8). Проверьте:

  • 🔐 у этой учётной записи есть право чтения каталога с DLL и всех её зависимостей;
  • 🔐 библиотека не требует доступа к профилю пользователя, сетевым дискам или ключам, которых нет у служебной учётной записи;
  • 🔐 если для базы включены профили безопасности, в профиле разрешено использование нужных COM-классов. Иначе платформа запретит создание объекта даже при правильной регистрации.

Перезапуск службы сервера 1С, чтобы рабочие процессы увидели новую регистрацию, обрывает сеансы всех пользователей. Делайте это вне рабочего времени или после предупреждения пользователей.

Не регистрируйте DLL из случайных источников. COM-библиотека выполняется внутри процесса 1С с его правами и получает доступ ко всем данным базы. Берите файлы только из дистрибутива платформы или от проверенного поставщика.

Для V83.Application на сервере дополнительно настраивают права запуска и активации в оснастке «Службы компонентов» (dcomcnfg). Для comcntr.dll это не требуется: библиотека загружается внутрь вызывающего процесса.

Если регистрация не помогла

  • 🔄 Класс зарегистрирован, но процесс старый. Перезапустите 1С, IIS или службу планировщика, откуда вызывается код.
  • 🧭 Код выполняется в другом месте. Добавьте в процедуру Сообщить(ИмяКомпьютера()) и убедитесь, что регистрировали класс именно там.
  • 🧱 Безопасный режим. Внешние обработки, расширения и дополнительные обработки по умолчанию могут работать в безопасном режиме, где COMОбъект недоступен. Отключите его при подключении или в карточке дополнительной обработки, если это допускает политика компании.
  • 🐧 Сервер на Linux. COM — технология Windows. На Linux-сервере Новый COMОбъект не работает, для интеграций используют HTTP-сервисы, веб-сервисы или внешние компоненты Native.
  • 🌐 Веб-клиент. В веб-клиенте COM-объекты недоступны, такой код переносите на сервер или в тонкий клиент.

Частые вопросы

Нужно ли регистрировать comcntr.dll после каждого обновления платформы?
Да, если старую версию удаляют. Регистрация указывает на файл конкретной версии, и после удаления каталога путь становится недействительным.
Можно ли зарегистрировать класс без прав администратора?
Для общей регистрации на компьютер — нет. Права нужны один раз на момент выполнения regsvr32 или RegAsm, дальше класс доступен всем пользователям.
Чем V83.COMConnector отличается от V83.Application?
COMConnector подключается к базе внутри вызывающего процесса без интерфейса и работает быстрее. Application запускает отдельный клиент 1С, через него можно управлять окнами и формами.
Работает ли COMОбъект в 1С:Фреш или другом облаке?
Как правило, нет: в облачных сервисах база работает в безопасном режиме, и создание COM-объектов запрещено. Интеграцию строят через HTTP-сервисы.
Как узнать ProgID чужой DLL?
Посмотрите документацию поставщика. Если её нет, после регистрации найдите в реестре ветку HKCR\CLSID с путём к этой DLL в InprocServer32, ProgID указан в подразделе ProgID.