Настройка и траблшутинг COM-соединения между базами 1С:Предприятие
При инициализации взаимодействия баз 1С через COM возникают ошибки:
Класс не зарегистрирован (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).Несоответствие версий клиента и сервера 1С:Предприятияпри вызовеV83.COMConnector.- Утечка оперативной памяти на сервере приложений из-за незакрытых COM-сессий в пуле
dllhost.exe. - Падение рабочего процесса
rphostпри выполнении вызовов COM x86 из 64-битного кластера 1С.
1. Архитектура COM-коннектора и проблема разрядности (32 vs 64 bit)
Если сервер 1С:Предприятие работает в 64-битном режиме (rphost.exe x64), он не может напрямую загрузить 32-битный COM-сервер в свое адресное пространство. Для кросс-разрядного взаимодействия или изоляции сбоев используется системное приложение Компоненты служб COM+ (DCOM / dllhost.exe).
2. Регистрация библиотеки comcntr.dll в операционной системе
# Запуск командной строки от имени Администратора
# Для 64-битного сервера 1С:
cd "C:\Program Files\1cv8\8.3.23.1865\bin"
regsvr32 comcntr.dll
# Для 32-битного клиента:
cd "C:\Program Files (x86)\1cv8\8.3.23.1865\bin"
regsvr32 comcntr.dll3. Настройка выделенного приложения COM+ для 32/64-битной изоляции
- Откройте
dcomcnfg(Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+). - Создайте новое приложение: Создать новое приложение -> Имя:
1Cv8_COMConnector-> Свойства активации: Серверное приложение (Server Application). - Укажите учетную запись запуска (локальный пользователь или сервис-аккаунт с правами запуска 1С).
- В созданной ветке перейдите в Компоненты -> Создать компонент -> Установка новых компонентов -> Выберите файл
comcntr.dllиз каталога нужной версии платформы. - В свойствах созданного компонента во вкладке Advanced/Дополнительно включите флаг Разрешить суррогатный процесс 32-бит (при необходимости запуска 32-битного коннектора в 64-битной ОС).
4. Программный код корректного открытия и закрытия COM-соединения
&НаСервере
Процедура ВыполнитьОбменЧерезCOM(СтрокаПодключенияБазы)
// Инициализация коннектора
Попытка
V83Connector = Новый COMОбъект("V83.COMConnector");
Исключение
ЗаписьЖурналаРегистрации("COM", УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка создания V83.COMConnector: " + ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
// Настройка таймаутов пула
V83Connector.MaxConnections = 5;
V83Connector.PoolTimeout = 60;
Попытка
БазаПриемник = V83Connector.Connect(СтрокаПодключенияБазы);
Исключение
V83Connector = Неопределено;
ВызватьИсключение "Не удалось подключиться к информационной базе: " + ОписаниеОшибки();
КонецПопытки;
Попытка
// Выполнение логики в удаленной базе
Запрос = БазаПриемник.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура ГДЕ НЕ ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка данных (строковые/числовые примитивы)
КодТовара = Строка(Выборка.Наименование);
КонецЦикла;
Исключение
ЗаписьЖурналаРегистрации("COM", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
// Явное освобождение COM-ресурсов для предотвращения зависания памяти
БазаПриемник = Неопределено;
V83Connector = Неопределено;
КонецПроцедуры Частые вопросы (FAQ)
Что означает ошибка 'Несоответствие версий клиента и сервера 1С' в COM?
Ошибка возникает, когда зарегистрированная в Windows библиотека comcntr.dll имеет другой релиз сборки (например, 8.3.22.1709), чем версия платформы базы, к которой выполняется подключение (например, 8.3.23.1865). Версии должны совпадать до последнего билда.
Почему нельзя передавать сложные ссылочные типы 1С через COM-соединение напрямую?
Передача сложных типов (СправочникСсылка, ДокументОбъект) приводит к постоянным неявным RPC-вызовам между процессами и утечкам памяти. Передавать следует только простые типы: Строка, Число, Булево, Дата или сериализованные структуры XML/JSON.
Как исправить ошибку REGDB_E_CLASSNOTREG (0x80040154)?
Запустите командную строку от Администратора и выполните перерегистрацию библиотеки: regsvr32 "C:\Program Files\1cv8\<Релиз>\bin\comcntr.dll".
Работает ли COM-соединение на серверах под управлением Linux?
Нет. Механизм COM (Component Object Model) является проприетарной технологией Microsoft Windows. Для взаимодействия баз 1С на Linux следует использовать HTTP/REST сервисы, Web-сервисы (SOAP) или брокеры сообщений.