Как исправить ошибку «Класс не зарегистрирован» при COM-соединении и правильно типизировать колонки таблицы значений?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При организации интеграции между конфигурациями 1С через COM-соединение разработчики часто сталкиваются с ошибкой инициализации объекта V83.ComConnector с кодом -2147221164 (0x80040154): Класс не зарегистрирован, а также с трудностями при создании объектов с явной типизацией в удаленной базе. Разберем по шагам причины возникновения этой системной ошибки, способы ее устранения в зависимости от разрядности платформы, а также правильные приемы создания типизированных таблиц значений через внешнее подключение.

Анализируем ошибку инициализации V83.ComConnector

Посмотрим на типовой фрагмент кода, в котором выполняется подключение к удаленной информационной базе:


Попытка 
    Соединение = Новый COMобъект("V83.ComConnector");   
Исключение
    Сообщить(ОписаниеОшибки());
    Возврат;
КонецПопытки;

Если в системе не зарегистрирована соответствующая динамическая библиотека или возникает несоответствие разрядностей процессов, операционная система возвращает ошибку 0x80040154. Выясним причину такого поведения:

  1. Несоответствие контекста выполнения и разрядности: вызов кода может происходить на клиенте (например, в 32-разрядном тонком клиенте) или на сервере (в 64-разрядном рабочем процессе rphost). Если 64-битный сервер 1С пытается вызвать 32-битную библиотеку comcntr.dll, Windows не сможет загрузить ее напрямую в адресное пространство процесса.
  2. Отсутствие регистрации библиотеки: при установке платформы компонент COM-соединения регистрируется не всегда автоматически, либо регистрация затирается после обновления версий технологической платформы.
  3. Права доступа сервисной учетной записи: если код выполняется на сервере 1С под учетной записью (например, USR1CV8), у нее могут отсутствовать права на чтение веток реестра HKEY_CLASSES_ROOT или доступ к DCOM.

Способ 1. Регистрация comcntr.dll нужной разрядности

Разберем базовый вариант исправления, когда компонента физически установлена, но не зарегистрирована в реестре операционной системы. Команду регистрации необходимо выполнять от имени администратора.

Для 64-разрядного сервера 1С или 64-разрядного клиента регистрируем 64-битную библиотеку из каталога Program Files:

regsvr32 "C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll"

Если же вызов COMобъект происходит внутри 32-разрядного приложения на 64-разрядной Windows, необходимо использовать 32-битную утилиту regsvr32, расположенную в системном каталоге SysWOW64, и библиотеку из папки Program Files (x86):


C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.XX.XXXX\bin\comcntr.dll"

Способ 2. Настройка вызова 32-битного COM-коннектора из 64-битного сервера через приложение COM+

Рассмотрим ситуацию, когда на сервере установлен 64-битный сервер 1С:Предприятия, но модуль comcntr.dll доступен только в 32-разрядной версии (или требуется изолировать процесс соединения). В этом случае помогает создание выделенного приложения COM+ в оснастке «Службы компонентов» Windows:

  1. Открываем оснастку Службы компонентов (выполняем команду dcomcnfg в командной строке).
  2. Переходим по ветке: Компьютеры > Мой компьютер > Приложения COM+.
  3. Создаем новое приложение COM+ (выбираем пункт Создать новое приложение, указываем имя, например, V83_COM, и устанавливаем тип Серверное приложение).
  4. В свойствах удостоверения указываем системную учетную запись или пользователя, обладающего достаточными правами на сервере.
  5. В созданном приложении открываем папку Компоненты и создаем новый компонент через пункт Импорт компонентов, которые уже зарегистрированы, либо выбираем Установка новых компонентов и указываем путь к файлу comcntr.dll.
  6. В свойствах добавленного компонента проверяем вкладку Безопасность и убеждаемся, что учетная запись службы сервера 1С имеет полный доступ к вызову объекта.

Как правильно создавать и типизировать ТаблицуЗначений через COM-соединение

После успешной инициализации соединения перейдем к вопросу типизации структуры данных. Проанализируем исходную задачу: создание типизированной таблицы значений во внешней базе.

Важно помнить: нельзя смешивать контексты разных баз. Если таблица создается во внешней базе, то и объекты метаданных, типы и квалификаторы должны создаваться исключительно через метод NewObject соединения с удаленной базой. Метод Тип("...") напрямую через COM вызвать невозможно, поэтому для получения системных типов используется ОписаниеТипов.

Посмотрим на корректный пример инициализации типизированной таблицы значений в базе-приемнике:


// Создаем таблицу значений в пространстве удаленной базы
ТЗУТ = БазаУТ.NewObject("ТаблицаЗначений");

// Создаем описания типов через COM-соединение
ОписательСклада = БазаУТ.NewObject("ОписаниеТипов", "СправочникСсылка.Склады");
ОписательНоменклатуры = БазаУТ.NewObject("ОписаниеТипов", "СправочникСсылка.Номенклатура");

// Добавляем типизированные колонки
ТЗУТ.Колонки.Добавить("Склад", ОписательСклада);
ТЗУТ.Колонки.Добавить("Номенклатура", ОписательНоменклатуры);

// Пример добавления числовой колонки с квалификаторами
МассивТиповЧисла = БазаУТ.NewObject("Массив");
МассивТиповЧисла.Добавить(БазаУТ.NewObject("ОписаниеТипов", "Число").Типы().Получить(0));

КвалификаторЧисла = БазаУТ.NewObject("КвалификаторыЧисла", 15, 2);
ОписательКоличества = БазаУТ.NewObject("ОписаниеТипов", МассивТиповЧисла, , , КвалификаторЧисла);
ТЗУТ.Колонки.Добавить("Количество", ОписательКоличества);

Если же таблица значений создается в текущей базе, типизировать ее ссылочными типами из удаленной базы недопустимо. В этом случае колонки либо оставляют универсальными (без жесткой типизации), либо передают данные через примитивные типы (строка с УИД, код, наименование), сериализуя их в форматы JSON или XML.

Освобождение ресурсов и современные альтернативы

Завершая работу с COM-соединением, всегда помним о корректном закрытии сеанса. COM-подключение удерживает клиентскую лицензию до момента полного уничтожения объекта в памяти. Для явного завершения работы присваиваем переменной пустое значение:

Соединение = Неопределено;

Стоит также учитывать, что технология COM является устаревающей (deprecated), привязана исключительно к операционной системе Windows и не поддерживается на серверах под управлением Linux. Для надежного и масштабируемого межсерверного обмена рекомендуется переходить на современные кроссплатформенные протоколы: HTTP-сервисы, Web-сервисы (SOAP) или стандартный интерфейс OData (REST API).

← На главную