Долгое время искал возможность подключаться через 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
Начать дискуссию