COM соединения к базам 1С на различных версиях платформы
Для создания COM соединения с рабочей станции необходимо наличие в составе установки библиотеки comcntr.dll. Думаю об этом лишний раз напоминать не нужно.
Соответственно, для соединения с БД на различных серверных платформах необходимо иметь в комплекте библиотеки всех нужных версий.
Предполагается, что клиентские платформы установлены в стандартных каталогах и добраться до библиотек можно по пути типа: C:\Program Files (x86)\1cv82\8.2.18.61\bin\comcntr.dll
Для начала создадим для коннектора обертку COM+, чтобы вызовы происходили не в контексте 1cv8.exe (1cv8c.exe), а в контекстеdllhost.exe.
В интернете достаточно публикаций на тему как это сделать… Для начала можно указать comcntr любой имеющейся версии.
При регистрации comcntr.dll в реестре делается запись:
HKEY_CLASSES_ROOT\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32 для 32 битной ОС
или HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32 для 64 битной ОС
значение по умолчанию которой указывает на расположение загружаемой библиотеки: C:\Program Files (x86)\1cv82\8.2.18.61\bin\comcntr.dll
Этим значением мы и будем оперировать. Перед установкой соединения читаем реестр, проверяем текущую версию коннектора и при необходимости заменяем ее на требуемую. После установки соединения в память загружается dllhost.exe, в контексте которого и работает коннектор. Для инициализации соединения к другой базе (с отличающейся версией платформы), ранее отработавшую библиотеку нужно выгрузить из памяти. К сожалению, у меня не получилось сделать это более цивилизованно, чем taskkill.exe /f /im dllhost.exe. Наверняка можно что-то покрасивее придумать…
Ну и самое главное: не забываем, что работать это будет только при запуске 1С с административными правами. Иначе взлетит исключение.
В итоге получаем примерно такой код:
Функция ОбновитьКлючРеестра(знач Ключ, знач ТребуемаяВерсия) WshShell = Новый COMОбъект("WScript.Shell"); Значение = WshShell.RegRead(Ключ); Значение1= СтрЗаменить(Значение, "\", Символы.ПС); ВерсияОпределена = ложь; Для ТекНомер=1 По СтрЧислоСтрок(Значение1) Цикл ТекущаяВерсия = СтрПолучитьСтроку(Значение1, ТекНомер); Если Лев(ТекущаяВерсия,2)="8." Тогда ВерсияОпределена = истина; прервать; КонецЕсли; КонецЦикла; Если ВерсияОпределена и ТекущаяВерсия<>ТребуемаяВерсия Тогда Значение = СтрЗаменить(Значение, ТекущаяВерсия, ТребуемаяВерсия); WshShell.RegWrite(Ключ, Значение); Возврат Истина; иначе Возврат ложь; КонецЕсли; КонецФункции Процедура НастроитьКоннектор(знач ТребуемаяВерсия) Обновлен = ОбновитьКлючРеестра("HKEY_CLASSES_ROOT\CLSID\{2B0C1632-A199-4350-AA2D-2AEE3D2D573A}\InprocServer32\", ТребуемаяВерсия); Если Обновлен Тогда ЗапуститьПриложение("taskkill.exe /f /im dllhost.exe",,Истина); КонецЕсли; КонецПроцедуры
Сам вызов осуществляю примерно так:
Для каждого СтрокаТЧ Из СписокБаз Цикл НастроитьКоннектор(СтрокаТЧ.Платформа); V8 = Новый COMObject ("V82.COMConnector"); ............ КонецЦикла
Если два последовательных соединения требуют коннектора одной и той же версии, то модификации реестра не происходит и библиотека из памяти не выгружается, что несколько сокращает «накладные расходы»…
Опробовано на COM соединениях из толстого клиента к серверным базам на платформах 8.2.x.x
Источник: http://infostart.ru/public/276794/