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

Администрирование - Системное

Описание способа подключения к базам 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". Или использум для поиска CLSID созданной обертки.

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
03.05.17
12
.zip 15,60Kb 12 Скачать
Обработка для проверки работоспобности соединения с разыми версиями
.epf 6,51Kb
15.04.17
12
.epf 6,51Kb 12 Скачать

См. также

Комментарии
1. Сергей Старых (tormozit) 4278 16.04.17 19:10 Сейчас в теме
1. Название COM классу лучше давать более гибкое. Например V83.COMConnector_Buh, V83.COMConnector_secondary, V83.COMConnector_test. Поэтому в инструменте регистрации хотелось бы соответствующий параметр.
2. Чаще требуется регистрация 64-разрядного варианта. Поэтому в инструменте регистрации хотелось бы соответствующий параметр.
brr; nsirotkin@mail.ru; +2 Ответить 1
2. Илья Козырев (WizaXxX) 181 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) 181 17.04.17 07:45 Сейчас в теме
(3) Я тоже так хотел, но по факту мы после первого раза делаем не регистрацию, а просто псевдоним, и свойство "DLL" именно оно отвечает за путь к нашей dll, ReadOnly
5. Алексей _ (iolko) 145 17.04.17 09:12 Сейчас в теме
Удобно, конечно. Но вот завтра автор пропишет кусок кода в приложение, и все пароли GO к нему в почту и пришли, вместе с IP и портами серверов. (Sorry, идея, конечно очень хорошая, но вот паранойя имеет место быть)
6. Илья Козырев (WizaXxX) 181 17.04.17 09:23 Сейчас в теме
(5) Вот именно для этого, я и выложил исходники) Делаешь clone master ветки и дальше уже делаешь все под себя. Ну или просто руками выполняешь все действия из инструкции, много времени это не занимает, и выполнять нужно всего один раз для каждой версии.


К слову, у класса COMAdminCatalogClass имеется метод Connect, соответственно можно переписать утилиту для удаленной настройки.
7. Алексей _ (iolko) 145 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) 181 20.04.17 17:38 Сейчас в теме
(10) После того как ты создал обертку V83.COMConnector, попробуй выполнить "Исправление" через Программы и компоненты, той версии через которой ты хочешь что бы был V83.COMConnector.

Сейчас попробовал одновременно подключиться к одной базе с помощью разных версий, поведение корректное.
Прикрепленные файлы:
12. Анатолий Бычин (tolyan_ekb) 88 26.04.17 13:00 Сейчас в теме
Подскажите, можно ли таким образом зарегистрировать comcntr.dll для 8.3 без установки платформы на компьютере.
13. Илья Козырев (WizaXxX) 181 02.05.17 08:23 Сейчас в теме
(12) Скорей всего можно, только одной comcntr.dll будет недостаточно это точно. Нужно пробовать)
14. Сергей Яцкевич (Nigmatul) 03.05.17 12:11 Сейчас в теме
Добрый день, спасибо за статью, внесла ясности.

Можете дописать в статью к пункту 8 пояснение.
Что бы найти нужную ветку в реестре необходимо в свойствах компонента скопировать CLSID и по этому ID найти нужную ветку в реестре. Скрин ниже, а то я например заманался искать нужную ветку, а по имени почему-то не находилась (до меня кто-то ковырял реестр)

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты 'comcntr' (8.3.8.2054) отличается от версии корневого модуля 'core83' (8.3.8.1652)
Прикрепленные файлы:
Оставьте свое сообщение