При организации интеграции между конфигурациями 1С через COM-соединение разработчики часто сталкиваются с ошибкой инициализации объекта V83.ComConnector с кодом -2147221164 (0x80040154): Класс не зарегистрирован, а также с трудностями при создании объектов с явной типизацией в удаленной базе. Разберем по шагам причины возникновения этой системной ошибки, способы ее устранения в зависимости от разрядности платформы, а также правильные приемы создания типизированных таблиц значений через внешнее подключение.
Посмотрим на типовой фрагмент кода, в котором выполняется подключение к удаленной информационной базе:
Попытка
Соединение = Новый COMобъект("V83.ComConnector");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Если в системе не зарегистрирована соответствующая динамическая библиотека или возникает несоответствие разрядностей процессов, операционная система возвращает ошибку 0x80040154. Выясним причину такого поведения:
rphost). Если 64-битный сервер 1С пытается вызвать 32-битную библиотеку comcntr.dll, Windows не сможет загрузить ее напрямую в адресное пространство процесса.USR1CV8), у нее могут отсутствовать права на чтение веток реестра HKEY_CLASSES_ROOT или доступ к DCOM.Разберем базовый вариант исправления, когда компонента физически установлена, но не зарегистрирована в реестре операционной системы. Команду регистрации необходимо выполнять от имени администратора.
Для 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"
Рассмотрим ситуацию, когда на сервере установлен 64-битный сервер 1С:Предприятия, но модуль comcntr.dll доступен только в 32-разрядной версии (или требуется изолировать процесс соединения). В этом случае помогает создание выделенного приложения COM+ в оснастке «Службы компонентов» Windows:
dcomcnfg в командной строке).V83_COM, и устанавливаем тип Серверное приложение).comcntr.dll.После успешной инициализации соединения перейдем к вопросу типизации структуры данных. Проанализируем исходную задачу: создание типизированной таблицы значений во внешней базе.
Важно помнить: нельзя смешивать контексты разных баз. Если таблица создается во внешней базе, то и объекты метаданных, типы и квалификаторы должны создаваться исключительно через метод 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).