COM соединения с базами 1С на различных версиях платформы "Без перерегистрации и СМС"

Опубликовал Илья Козырев (WizaXxX) в раздел Администрирование - Системное

Описание способа подключения к базам 1С с помощью ComConnector, на различных версиях платформы.

Значит дело было так. Появилась необходимость подключаться к базам по com соединению, для анализа тамошних объектов метаданных. Проблема оказалась в том, что базы могли работать на разных версиях 1С. Пошел в интернет, искал, читал, но все фигня, в оновном все предлагают держать базы на одной версии, что для меня было невозможным.

Кроме, вот этой статьи. Огромное спасибо автору (Леонид Кириенко) и zakiap

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

Тут уже интересней, но есть пару минусов

1) 1С должна работать от имени учетки с админскими правами.

2) "Варварское" поведение по отношению dllhost.exe :)

3) Могут возникнуть проблемы при одновременном обращении к базам на разных версиях.

Но, как оказалось, самым для меня полезным, оказалась не сама статья, а один из комментариев к ней.

Если присмотрется, то видно, что у него создано несколько оберток для разных версий. Увидев этот коммент, я тут же обрадовался, думал сейчас все расскажут... Но не тут то было, показать, показал, а рассказать забыл)

Инструкция

1. Идем "Панель управления" - "Администрирование" - "Службы компонентов"

2. В оснастке служб компонентов, "Службы компонентов" - "Компьютеры" - "Мой компьютер" - "Приложения COM+"

3. Создаем новое приложение, правой кнопкой по  "Приложения COM+" - "Создать" - "Приложение"

4. Выбираем "Создать новое приложение", называем например "1cv8", тип выбираем "Библиотечное приложение"

должно полчуить так

 

5. Раскрываем "1cv8", правой кнопкой по "Компоненты" - "Создать" - "Компонент".

6. Выбираем вариант "Установка новых компонентов", находим нашу библиотеку comcntr.dll

Находится она в катлоге BIN установленной платформы, у меня например путь такой 

"C:\Program Files (x86)\1cv8\8.3.10.2168\bin\comcntr.dll

должны получить следующую картину 

7. Правой кнопкой по "V83.COMConnector.1" - "Псевдоним...", меняем наименование с "CopyOf.V83.COMConnector.1" на "V83.COMConnector_8.3.9.2033". Данное действие проделываем для всех нужных версий платформ.

8. Открываем "regedit" через пуск или команду "Выполнить", нажимаем F3 и указываем для поиска строку с наименованием созданой нами обертки, например "V83.COMConnector_8.3.9.2033".

9. Ищем значение в ветке "HKEY_LOCAL_MACHINE" у меня путь такой HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{553567A1-0481-4CD0-9F5C-393DD90DB0C3}\ выглядеть должно так

В ветке "InprocServer32" меняем значение у меня, "C:\Program Files (x86)\1cv8\8.3.10.2168\bin\comcntr.dll" на путь к нужной версии длл, в данном случае "C:\Program Files (x86)\1cv8\8.3.9.2033\bin\comcntr.dll". 

Данное дейстие проделываем для всех созданных оберток.

Все готово) Для подключения к конкретной версии базы, в 1С теперь нужно использовать следующую конструкцию


НомерВерсии = "8.3.9.2033";

Соединитель = Новый ComОбъект("V83.COMConnector_" + НомерВерсии);

В файлах утилита, которая выполнит все эти действия автоматически. Подходит для тех у кого 1С лежит в каталоге 

"C:\Program Files (x86)\1cv8". У кого что то отличается, вот ссылка на GitHub . Запустить утилиту нужно от имени администратора. Надеюсь данный материал будет вам полезен)

Скачать файлы

Наименование Файл Версия Размер
ConsoleApp
.zip 15,60Kb
17.04.17
8
.zip 15,60Kb 8 Скачать
Обработка для проверки работоспобности соединения с разыми версиями
.epf 6,51Kb
15.04.17
8
.epf 6,51Kb 8 Скачать

См. также

PowerTools от 1 000
Комментарии
1. Сергей Старых (tormozit) 4168 16.04.17 19:10 Сейчас в теме
1. Название COM классу лучше давать более гибкое. Например V83.COMConnector_Buh, V83.COMConnector_secondary, V83.COMConnector_test. Поэтому в инструменте регистрации хотелось бы соответствующий параметр.
2. Чаще требуется регистрация 64-разрядного варианта. Поэтому в инструменте регистрации хотелось бы соответствующий параметр.
nsirotkin@mail.ru; +1 Ответить 1
2. Илья Козырев (WizaXxX) 149 16.04.17 19:22 Сейчас в теме
(1) Я же делал так, как удобнее мне, а для остальных я предоставил исходники, все что нужно, можно изменить под себя.
3. Фаниль Исламов (fancy) 17.04.17 07:27 Сейчас в теме
А почему сразу при регистрации компоненты не указать нужный путь "C:\Program Files (x86)\1cv8\8.3.9.2033\bin\comcntr.dll" - зачем его менять в regedit?
4. Илья Козырев (WizaXxX) 149 17.04.17 07:45 Сейчас в теме
(3) Я тоже так хотел, но по факту мы после первого раза делаем не регистрацию, а просто псевдоним, и свойство "DLL" именно оно отвечает за путь к нашей dll, ReadOnly
5. Алексей _ (iolko) 139 17.04.17 09:12 Сейчас в теме
Удобно, конечно. Но вот завтра автор пропишет кусок кода в приложение, и все пароли GO к нему в почту и пришли, вместе с IP и портами серверов. (Sorry, идея, конечно очень хорошая, но вот паранойя имеет место быть)
6. Илья Козырев (WizaXxX) 149 17.04.17 09:23 Сейчас в теме
(5) Вот именно для этого, я и выложил исходники) Делаешь clone master ветки и дальше уже делаешь все под себя. Ну или просто руками выполняешь все действия из инструкции, много времени это не занимает, и выполнять нужно всего один раз для каждой версии.


К слову, у класса COMAdminCatalogClass имеется метод Connect, соответственно можно переписать утилиту для удаленной настройки.
7. Алексей _ (iolko) 139 17.04.17 11:48 Сейчас в теме
(6)Вопрос полностью снят.
8. родственник (родственник) 19.04.17 18:32 Сейчас в теме
Поддерживаем большой зоопарк серверов и баз. Com объекты, зарегистрированные через компоненты могут работать не стабильно. Соединения проходят нормально, а дальше могут быть разные "чудеса".
9. Денис Демидов (disa_da) 20.04.17 11:43 Сейчас в теме
Не могу понять что я делаю не так, но у меня не получается решить таким способом подключение к разным версиям из одной базы.
Например, есть следующее окружение:
- 32-х разрядные клиент-серверные версии 8.3.8.2054 (далее 8.3.8) и 8.3.9.2170 (далее 8.3.9) и соответственно две службы и две серверные базы на этих версиях.
- платформы поставлены по возрастанию версии, соответственное к 8.3.8 не подключится, так как последняя зарегистрировалась 8.3.9

Делаю по инструкции и назначаю алиас для 8.3.8 - "V83.COMConnector_838_x32", меняю путь в реестре и так далее.

Вхожу в базу на 8.3.8:
- через "V83.COMConnector_838_x32" к 8.3.8 работает подключение на клиенте и на сервере (подключение выполняется в коде &НаКлиенте и &НаСервере соответственно)
- через "V83.COMConnector" к 8.3.9 не работает . На клиенте выводится ошибка:
"The procedure entry point ?handle@ModuleLoader@core@@QAEPAUHINSTANCE__@@XZ could not be located in the dynamic link library C:\Program Files (x86)\1cv8\8.3.9.2170\bin\comcntr.dll."
и далее вторая ошибка
"-2147-24769(0x8007007F) The specified module could not be found.".
На сервере только вторая ошибка.

Вхожу в базу на 8.3.9:
- через "V83.COMConnector_838_x32" к 8.3.8 не работает . На клиенте и сервере выводится "Произошла исключительная ситуация (V83.ComConnector.1): Версия компоненты 'comcntr' (8.3.8.2054) отличается от версии корневого модуля 'core83' (8.3.9.2170)
- через "V83.COMConnector" к 8.3.9 работает

В результате требуется не только "V83.COMConnector" нужной версии использовать, но и выполнять подключение из соответствующей версии клиента/сервера.
Подскажите, у кого получилось так настроить, не было ли похожей проблемы?
10. Денис Демидов (disa_da) 20.04.17 14:47 Сейчас в теме
Кажется я понял в чем дело - система кэширует comcntr.dll (или его часть, например core83, т.к на него ругается) и при следующих обращениях использует модуль из кэша, а не получает его по имени коннектора.

Провел такой эксперимент:
- развернул платформу 8.2
- захожу в базу на 8.2, подключаюсь к 8.3.8 через "V83.COMConnector_838_x32" (в серверном коде), в 8.3.9 через "V83.COMConnector" подключение не работает
- рестарт сервера
- захожу в базу снова, но первым подключаюсь в 8.3.9 - работает, а после этого к 8.3.8 уже не работает.

Таким образом в 8.2 возможно подключение к любой версии, но не к двум одновременно.
А в 8.3 так не получается, т.к. при старте сервера подгружается соответствующая версия в кэш и в дальнейшем используется она.
11. Илья Козырев (WizaXxX) 149 20.04.17 17:38 Сейчас в теме
(10) После того как ты создал обертку V83.COMConnector, попробуй выполнить "Исправление" через Программы и компоненты, той версии через которой ты хочешь что бы был V83.COMConnector.

Сейчас попробовал одновременно подключиться к одной базе с помощью разных версий, поведение корректное.
Прикрепленные файлы:
12. Анатолий Бычин (tolyan_ekb) 87 26.04.17 13:00 Сейчас в теме
Подскажите, можно ли таким образом зарегистрировать comcntr.dll для 8.3 без установки платформы на компьютере.