COM соединения к базам 1С на различных версиях платформы
Программирование - Практика программирования
COMConnector COM соединение v82.comconnector
Для создания 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
См. также
Специальные предложения
в итоге была ОШИБКА ПРИ СОЗДАНИИ COMОбъект Интерфейс не поддерживается.
После этого выработал инструкцию по установке платформы 1с для работы с COM-соединением, может кому пригодится...
Переустановка платформы 1с, установка сервера:
*Ставим серверную версию из дистрибутива \\Платформа\X.X.XX.XX\windows64.rar на все рабочие сервера 1с
*обязательно ставим возможность подключения через COM-соединение
*обязательно ставим возможность подключения через WEB-соединение
*Ставим клиентскую часть на все компьютеры в сети из дистрибутива \\Платформа\X.X.XX.XX\windows.rar
*Обязательно ставим клиентскую часть на сервера, т.к. без этого не будут работать подключения через COM-объект
*обязательно ставим возможность подключения через WEB-соединение
*ОШИБКА ПРИ СОЗДАНИИ COMОбъект Интерфейс не поддерживается при всех выполненных действиях:
*Например при запуске на сервере 83, COMОбъект 82, тогда необходимо пользователя USR1CV8 добавить в группу Локальные Администраторы (Диспетчер сервера - Конфигурация - Локальные пользователи - группы - Администраторы)
тогда подключение работает в контексте 1cv8.exe...
* правда администраторам придется поступиться безопасностью...
Автору +
Автору огромный +)))

Просмотры 61860
Загрузки 0
Комментарии 24
Создание 07.05.14 11:55
Обновление 07.05.14 11:55
№ Публикации 276794
Рубрики Практика программирования
Кому Программист
Тип файла Нет файла
Платформа Не имеет значения
Конфигурация Не имеет значения
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Раздел учета Не имеет значения
Доступ к файлу Бесплатно (free)
Код открыт Не указано
