Клерк.Ру

COM соединения к базам 1С на различных версиях платформы

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

Для создания COM соединения с рабочей станции необходимо наличие в составе установки библиотеки comcntr.dll. Думаю об этом лишний раз напоминать не нужно.

Соответственно, для соединения с БД на различных серверных платформах необходимо иметь в комплекте библиотеки всех нужных версий. 

Предполагается, что клиентские платформы установлены в стандартных каталогах и добраться до библиотек можно по пути типа: C:Program Files (x86)1cv828.2.18.61bincomcntr.dll

Для начала создадим для коннектора обертку COM+, чтобы вызовы происходили не в контексте 1cv8.exe (1cv8c.exe), а в контексте dllhost.exe

📌 Реклама
Отключить

В интернете достаточно публикаций на тему как это сделать... Для начала можно указать comcntr любой имеющейся версии.

При регистрации comcntr.dll в реестре делается запись: 

HKEY_CLASSES_ROOTCLSID{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}InprocServer32 для 32 битной ОС

или HKEY_CLASSES_ROOTWow6432NodeCLSID{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}InprocServer32 для 64 битной ОС

значение по умолчанию которой указывает на расположение загружаемой библиотеки: C:Program Files (x86)1cv828.2.18.61bincomcntr.dll

Этим значением мы и будем оперировать. Перед установкой соединения читаем реестр, проверяем текущую версию коннектора и при необходимости заменяем ее на требуемую. После установки соединения в память загружается dllhost.exe, в контексте которого и работает коннектор. Для инициализации соединения к другой базе (с отличающейся версией платформы), ранее отработавшую библиотеку нужно выгрузить из памяти. К сожалению, у меня не получилось сделать это более цивилизованно, чем taskkill.exe /f /im dllhost.exe. Наверняка можно что-то покрасивее придумать...

📌 Реклама
Отключить

Ну и самое главное: не забываем, что работать это будет только при запуске 1С садминистративными правами. Иначе взлетит исключение.

В итоге получаем примерно такой код:

 

Сам вызов осуществляю примерно так:

Для каждого СтрокаТЧ Из СписокБаз Цикл      
НастроитьКоннектор(СтрокаТЧ.Платформа);      
V8 = Новый COMObject ("V82.COMConnector");        
............    
КонецЦикла  
Если два последовательных соединения требуют коннектора одной и той же версии, то модификации реестра не происходит и библиотека из памяти не выгружается, что несколько сокращает "накладные расходы"... 

 Опробовано на COM соединениях из толстого клиента к серверным базам на платформах 8.2.x.x

Мероприятия

Разместить

Блоги компаний

Создать блог
📌 Реклама
Отключить