Параллельное использование нескольких версий COM control (несколько версий платформ)


















Краткая инструкция по использованию нескольких версий com control.

1. Открываем службу компонентов, добавляем новое приложение COM+ наименование произвольное:

 

 

2. Внутри созданного приложения выбираем компоненты и жмем Добавить новый компонент:

 

Вводим путь для платформы номер 1:
C:Program Files1cv88.3.9.2233inComcntrl.dll  — Соответственно библиотека версии 8.3.9.2033

Создастся компонент с именем "V83.COMConnector.1" Его необходимо переименовать. 

После установки НЕСКОЛЬКИХ компонентов потребуется обращаться поименно в зависимости от версии, которая будет присвоена, для этого по вновь созданному компоненту жмем правой кнопкой — псевдоним:

Задаем ему имя "V8.3.9.2033.COMConnector" (при инициализации новых объектов будем создавать их по заданному имени) — можете придумать свое.

 

В этом же окне Поле "Новый код CLSID" — копируем в блокнот нам потребуется оно чуть позднее — делаем пометку что это версия 2233, чтоб не забыть. ({3E006D3E-D351-4446-851D-D8CF792E205A} — V8.3.9.2033

В списке появится 2 компонента, старый можно удалить:

 

Создаем вторую нужную нам версию 

 


 

 

Указываем путь до второй версии:

В моем случае это 8.3.6.2041 —  C:Program Files1cv88.3.6.2041incomcntr.dll

Так же задаем псевдоним, чтоб не путаться а старую версию удаляем:

 

 

Теперь самое важное:

После регистрации мы увидим, что Windows К компоненте 8.3.9 привязал более позднюю зарегистрированную:

Открываем реестр пуск — выполнить — regedit

Идем в корень реестра и нажимаем CTRL+F — Ищем CLSID компоненты, которая не соответствует, на моем примере  это — {3E006D3E-D351-4446-851D-D8CF792E205A}

 

 

 

 

На этом настройка Windows окончена, для инициализации нужной компоненты используем код вида:

COMConnector = Новый COMObject("V8.3.9.2033.COMConnector");  

Или

COMConnector = Новый COMObject("V8.3.6.2041.COMConnector");  

P.S. если вы захотите использовать 3,4,5 компонтентов — после каждой регистрации нужного компонента необходимо перепроверить все ветки реестра CLSID — Убедится что каждой компоненте адрес библиотеки соответствует

32 Comments

  1. kolya_tlt

    и где же ты был пару месяцев назад?

    Reply ↓
  2. swimdog

    Мы перешли на 8.3.10 и выкинули все старье

    Reply ↓
  3. DenisCh

    Это всё на сервере?

    А если файловые? Или код НаКлиенте работает? Тогда на каждом компе выполнять?

    Я правильно понимаю?

    Reply ↓
  4. Team leader

    (2) И что это означает? там коннектор не используется?

    Reply ↓
  5. swimdog

    (4) Нет, там используются коннекторы одного типа. Для одной версии не нужны такие заморочки.

    Reply ↓
  6. qvvert

    (3) на сервере

    Reply ↓
  7. sisdrou

    Спасибо. Жаль запоздалая статья. Уже проделан танец с бубном)

    Reply ↓
  8. DrAku1a

    Может, кто-то ещё всё это автоматизирует — сделает в виде обработки (которая будет автоматом регать платформу) или в виде программы-настройщика?..

    Reply ↓
  9. qvvert

    (8) Режим полного лентяя))) а что можно и сделать)))

    Reply ↓
  10. Darklight

    Боян (хоть и с более подробными картинками). Вот тут уже подымалась данная тема

    https://infostart.ru/public/610960/

    Там же и программа настройщик.

    Там же, в комментариях описаны возникающие, при этом, проблемы 🙁

    Reply ↓
  11. qvvert

    (10)

    Пардоньте, НЕ видел. Действительно те же яйца только в профиль, но добывались самостоятельно.

    Reply ↓
  12. Darklight

    (5)И что, в 8.3.10 можно писать

     Новый COMObject(«V8.3.COMConnector»); 

    и соединяться с любым релизом 10-й версии платформы, и 8.3.10.1212, и с 8.3.10.2561 и с 8.3.10.2685…

    ???

    Reply ↓
  13. obsfromekb

    Тема действительно не нова, но изложена подробно и наглядно.

    От себя могу только сказать, что то, что здесь изложено, не панацея для случаев, когда в рамках одного сеанса windows происходит постоянное обращение к COM-объектам 1С разных версий. Первый вызов всегда отрабатывает корректно, но в дальнейшем могут возникать проблемы (как я понимаю Приложение COM+ попадает в кэш и системе становится не важно к какой компоненте мы обращаемся, если Приложение уже используется).

    Решил так, перед каждый вызовом COM:

     Попытка
    ЗапуститьПриложение(«taskkill.exe /f /im dllhost.exe»,,Истина);
    КоннекторV8 = Новый COMObject(«V83.COMConnector_8.3.5»);
    Reply ↓
  14. karimov_m

    Полезно.

    Надо дописать, что манипуляции с добавлением компонентов и реестром (по идее) надо делать на том же сервере, где стоит сервер приложения. Конечно же, если подразумевается создание COM-объекта на сервере..

    Также интересна реализация такого приема:

    На сервере поднимается 2-3 COM-соединения к базе (типа пул), далее с клиентов поступают запросы/инвоки на какие-либо действия (в той базе, по которой организовался пул) и некий алгоритм обрабатывает эти запросы клиентов к другому приложению (конфигурации) по COM. Тем самым можно организовать «прослойку» (типа API) к другой базе по COM с жестко определенным функционалом + возможная выгода в использовании лицензий (пул из трех COM-соединений может обрабатывать (в порядке очереди) много больше реальных «клиентов»)

    Reply ↓
  15. karimov_m

    (13)Можно попробовать посмотреть на вкладку Activation в свойствах компонента.

    1. Убрать пулы

    2. Выбрать опцию «Must be activated in the callers context»

    Reply ↓
  16. Darklight

    (14)Идея с пулами COM-соединений на сервере (например, в фоновых заданиях), конечно, интересная, но, покуда нет эффективного решения по обмену между сессиями — она будет интересна только для узкого круга задач, где нет необходимости в интенсивном выполнении команд. Зачастую, такие медленные задачи вполне справляются самостоятельно порождая com-соединения. А по лицензиям (что важно только для длительных задач) — тут уж сами выбирайте — либо длинная очередь медленных задач, либо ультрокороткая — но с большим расходом лицензий.

    Reply ↓
  17. karimov_m

    (16)а в чем именно нужен обмен между сессиями? Синхронизацию или длительное хранение общей для всех сессий информации можно организовать в самом механизме пулов, если организовать его в виде вызовов «API пула соединений»

    Reply ↓
  18. Darklight

    (17)Работа с пулами подразумевает передачу им порции данных для выполнения и возврат результата.

    Reply ↓
  19. karimov_m

    (18) Работа с пулами подразумевает использование пулов, не более=)

    Сама задача — организации доступ к некой ИС(1С база1) посредством сторонней ИС (1С база2) из другой системы («1с база3» — собственно откуда идут клиенты базы «1с база1» через «1С база2») и состоит в эмуляции доступа к 1С базе 1 клиентам базы 1С база3. Только вместо прямого создания соединения из 1С база3 к 1С база1, это происходт через 1С база2 — где формируется пул. А уж какие там данные ходят и что необходимо делается — это уже отдельная логика и детали реализации.. Пулы в 1С база2 — для механизма кэширования обращений к 1С базе1. Что-то такое есть вроде в конфигурации «Интеграция» от tormozit

    Reply ↓
  20. Darklight

    (19)Вот эта логика и детали организации тут и будет узким местом!

    Reply ↓
  21. karimov_m

    (20)мм.. ну ок, пусть будет узким для вас)

    Как говориться, смотря как приготовить;) Речь же не о гонке производительности а в целом об архитектуре. Так то если судить то вся 1С — одно большое «узкое место», быстрее как бы напрямую делать запросы к SQL серверу..

    Reply ↓
  22. Darklight

    (21)Я свои доводы по поводу пулов COM-соединений привёл. Если считаете, что это годится в иных случаях — приведите свои.

    Reply ↓
  23. karimov_m

    (22) какие доводы? Что они «узкое место» ? Так это зависит от задачи же. Поверьте, не все задачи являются оптимизационными.

    Reply ↓
  24. e-9

    Добавил первый компонент (8.3.6.2390) успешно; ставлю второй (8.3.10.2561) — валится с ошибкой 80110802 (см. скрин), не добавляется.

    Что может быть не так?

    Reply ↓
  25. e-9

    (24) уточню: ОС Windows 7 64-bit

    Reply ↓
  26. karimov_m

    (25) теневое копирование включено на системном диске?

    После того как добавил второй компонент (и после изменений соотв.ветки реестра). перезагрузите систему. Ошибка может уйти..

    Reply ↓
  27. user982256

    (24) У меня такая же проблема, рсскажите удалось победить?

    Reply ↓
  28. e-9

    (27) убедил заказчика синхронизировать версии платформ)

    …моя трабла возникла на моем компе, где стоит голая семерка без обнов — мож, чего-то там просто не хватает.

    Reply ↓
  29. user982256

    (28) А я решил проблему следующим образом — насоздавал кучу (сколько надо версий, в моем случае 4) псевдономов и в реестре для каждого псевдонима (искать по clsid) сменил физический путь к dll и все взлетело. Так же обращаю внимание на то что COM компоненты должны быть зарегистрированны как серверный компонент — а то проблемы с последовательным конекторов разной версии.

    Reply ↓
  30. kislitsin

    Воспользовался вашей статьей, столкнулся с проблемой

    COMConnector = Новый COMObject(ИмяCOMСоединителя()); // «V83.COMConnector»

    по причине:

    -2147024769(0x8007007F): Не найдена указанная процедура.

    Не в курсе как это решить ?

    Reply ↓
  31. KAPACEB.AA

    (25)

    Мне удалось обойти эту ошибку используя библиотеки разной разрядности для компонент. Одну dll выбирал из каталога Program Files, а другую из Program Files x86, установив предварительно две версии клиента.

    Reply ↓
  32. KAPACEB.AA

    (27)

    См. комментарий (31)

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *