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

См. также

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


К слову, у класса COMAdminCatalogClass имеется метод Connect, соответственно можно переписать утилиту для удаленной настройки.
7. Алексей _ (iolko) 162 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) 194 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) 194 02.05.17 08:23 Сейчас в теме
(12) Скорей всего можно, только одной comcntr.dll будет недостаточно это точно. Нужно пробовать)
15. Павел Одинцов (Darklight) 07.08.17 10:32 Сейчас в теме
Идея интересная, но у меня имеет место быть проблема. Если создавать COM-объекты разных версий с некоторой паузой между этим созданиями, то всё хорошо, вроде бы.
А, вот, если эту паузу не выдерживать - то возможно возникновение двух ошибок (я так и не смог понять причины и следствия когда какая ошибка возникает, скорее всего сначала первая, а при повторной попытке уже вторая)
Запускалось всё под клиентом одной или второй версии (пробовал и так и так) - файловый вариант.
Основной COM-объект был версии 8.3.10.2252, но даже если к нему обращаться как к "v83.COMConnector" то это ничего не меняло
Последовательность создания COM-объектов не влияет, но если получить первую ошибку, переставить их местами - возникает вторая ошибка
Версия клиента 1С: Предприятие так же не влияет.
Запуск в новом сеансе 1С проблему не решает.

Выполняю такой алгоритм:

ком = новый COMОбъект("V83.COMConnector_8.3.10.2252");
ком.ConnectAgent("srv1");
ком = новый COMОбъект("v83.COMConnector_8.3.8.2054");
ком.ConnectAgent("srv2");


Возникает первая ошибка:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (ConnectAgent)
ком.ConnectAgent("srv2");
по причине:
Неизвестная ошибка


При повторном запуске она повторяется


Переставляем местами создание COM-Объектов
ком = новый COMОбъект("v83.COMConnector_8.3.8.2054");
ком.ConnectAgent("srv2");
ком = новый COMОбъект("V83.COMConnector_8.3.10.2252");
ком.ConnectAgent("srv1");


И возникает вторая ошибка:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(12)}: Ошибка при вызове конструктора (COMОбъект)
ком = новый COMОбъект("V83.COMConnector_8.3.10.2252");
по причине:
-2147024769(0x8007007F): Не найдена указанная процедура.


При повторном запуске она повторяется

Далее - если снова переставить обратно - ошибка будет повторяться

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(10)}: Ошибка при вызове конструктора (COMОбъект)
ком = новый COMОбъект("V83.COMConnector_8.3.10.2252");
по причине:
-2147024769(0x8007007F): Не найдена указанная процедура. [

Спустя минут 15-20 всё проходит - и начинается с начала (с учётом переставленных вызовов создания COM-объектов):


{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (ConnectAgent)
ком.ConnectAgent("srv1");
по причине:
Неизвестная ошибка



Значит COM-объект где-то кешируется (платформой 1С? - мало вероятно - т.к. перезапуск клиента ничего не решает) и при попытке создать повторно (пусть и, в общем-то, другой COM-Объект) идёт обращение к старому и происходит какой-то конфликт версий.

Увы, это почти ставит крест на данной методике. Но, если одновременная (читай последовательная но в одно и то же время в пределах 20 минут) работа не требуется - описанный в статье метод будет работать.
Но, лично мне нужна была одновременная работа :-(
Надо попробовать выполнить те же обращения, но не из 1С - если проблемы не будет, то значит это 1С кеширует (и это можно обойти - но логику работы с COM-объектом придётся выносить за пределы 1С), а если будет.... то нужно что инове придумывать!


Попробовал так же с компонентами редакции 8.2:
ком = новый COMОбъект("v82.COMConnector_8.2.19.80");
ком.ConnectAgent("srv3");	
ком = новый COMОбъект("V82.COMConnector_8.2.19.68");
ком.ConnectAgent("srv4");


В общем-то такая же ситуация, но ошибка всегда на ВТОРОЙ по счёту компоненте (не важно какой она версии!!!) и всегда такая:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(42)}: Ошибка при вызове метода контекста (ConnectAgent)
	ком.ConnectAgent("srv4);
по причине:
Неизвестная ошибка


При этом если создавать и использовать их отдельно (посадил на разные кнопки)
То ситуация такая
1. Любую создаю - всё нормально
2. Создаю вторую - возникает ошибка
3. Создаю первую - ошибки нет
4. Создаю вторую - ошибка
5. Повторно создаю вторую - ошибки нет
6. Снова создаю вторую - ошибки нет
7. Создаю первую - ошибка
8. Создаю первую - ошибки нет
9. Создаю вторую - ошибка
10. Создаю вторую - ошибки нети

То есть первый раз создаётся нормально и если сразу создавать другой версии - будет ошибка - но при повторном создании - ошибки не будет - но она снова будет у первой, что при повторном создании так же ошибки не будет
Поэтому с v82 я написал вот так - и в общем-то оно работает

попытка
ком = новый COMОбъект("v82.COMConnector_8.2.19.80");
ком.ConnectAgent("srv3");	
исключение
	сообщить("v82.COMConnector_8.2.19.80: "+ОписаниеОшибки());
	ком = новый COMОбъект("v82.COMConnector_8.2.19.80");
	ком.ConnectAgent("srv3");	
конецпопытки;
попытка
ком = новый COMОбъект("V82.COMConnector_8.2.19.68");
ком.ConnectAgent("srv4");
исключение
	сообщить("v82.COMConnector_8.2.19.68: "+ОписаниеОшибки());
	ком = новый COMОбъект("V82.COMConnector_8.2.19.68");
	ком.ConnectAgent("srv4");
конецпопытки;
Показать


Значит компонента 8.2 не кэшируется, в отличии от 8.3 :-|


Попытка же написать так же для 8.3
попытка
ком = новый COMОбъект("V83.COMConnector_8.3.10.2252");
ком.ConnectAgent("srv1");	
исключение
	сообщить("V83.COMConnector_8.3.10.2252: "+ОписаниеОшибки());
	ком = новый COMОбъект("V83.COMConnector_8.3.10.2252");
	ком.ConnectAgent("srv1");	
конецпопытки;
попытка
ком = новый COMОбъект("v83.COMConnector_8.3.8.2054");
ком.ConnectAgent("srv2");
исключение
	сообщить("v83.COMConnector_8.3.8.2054: "+ОписаниеОшибки());
	ком = новый COMОбъект("v83.COMConnector_8.3.8.2054");
	ком.ConnectAgent("srv2");
конецпопытки;
Показать



первый раз отработало, но повторный запуск привёл к ошибке
V83.COMConnector_8.3.10.2252:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(38)}: Ошибка при вызове конструктора (COMОбъект): -2147024769(0x8007007F): Не найдена указанная процедура.

это самая первая строка в первой попытке - и эта ошибка дальше стабильно повторялась


Попробовал работать параллельно с компонентами V82 и v82

ком = новый COMОбъект("v82.COMConnector_8.2.19.80");
ком.ConnectAgent("srv3");	
ком = новый COMОбъект("V83.COMConnector_8.3.10.2252");
ком.ConnectAgent("srv1");	


Никаких ошибок не возникает!

Так что - как 1С (или windows) это всё обрабатывают, что возникает такой винегрет из разных ситуаций - непонятно....
Надо ещё разбираться и экспериментировать

Возможно эти проблемы чисто связаны с моей конфигурацией ОС - использую windows 8
А может дело в используемых релизах 1С: Предприятие, клиента и компонент (хотя на клиенте 8.2.19.80 я тоже попробовал - всё то же самое)

Может, у меня просто компоненты как-то неправильно установлены или какие-то заморочки с настройками COM+
Я, например, не нашёл типовых компонент в разделе COM+ как на картинках автора :-(
Хорошо бы кто-то ещё это всё проверил бы на своих конфигурациях платформ и компонент
16. Денис Демидов (disa_da) 08.08.17 10:32 Сейчас в теме
(15)
Посмотрите выше мои комментарии (9) и (10)
У меня тоже сложилось впечатление, что что-то кешируется.
Если делать не через 1С, а через что-то внешнее, например запускать подключение через вызов 1Script - то проблем с кешем нет.
17. Павел Одинцов (Darklight) 08.08.17 14:55 Сейчас в теме
(16) Вот фигня, как же с этим бороться.... создавать обёртку во внешней компоненте - фиговое решение....
Пробовал переименовывать саму dll (чтобы имена разные были - не помогло). Какой же ключ использует 1С для идентификации кешированного значения, ведь они всем отличаются и именем, и CLSID, и даже полным путём к dll, включая имя файла "comcntr.dll"
Что-то ещё в самой dll зашито?
Я вообще на файловой базе пробовал, и клиента перезапускал - эффект первого запуска минут на 10-15 сохраняется - что же это за кеш такой? Кеш windows?
Кеш сбрасывается либоо времени, либо при выходе из сеанса windows.
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)
Прикрепленные файлы:
19. Александр Гапоненко (hair) 28 09.11.17 10:03 Сейчас в теме
(14)
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты 'comcntr' (8.3.8.2054) отличается от версии корневого модуля 'core83' (8.3.8.1652)


Добрый день. Так я не понял, как избавляться от такого сообщения? Подскажите.
До обнаружения этой статьи просто пробовал делать regsvr comctrl, той версии, к базе которой собирался подключаться через COM. Получал точно такую же ошибку, что и сейчас
20. Сергей Яцкевич (Nigmatul) 10.11.17 12:19 Сейчас в теме
(19) Добрый день, я сдался. Вопрос актуальные, но я устал ковыряться в надежде появления надежного решения.
Устанавливать новый сервер ради одной проблемы ну уж муторно.
22. Стас Стас (glime) 61 24.11.17 11:03 Сейчас в теме
23. Сергей Яцкевич (Nigmatul) 24.11.17 12:50 Сейчас в теме
(22)нет, так и забил, хотя актуально, нужно построение отчетов в УТ 10.3 по данным БП 3.0. Обороты из БП 3.0 приходится выгружать через файл выгрузки...... очень не удобно. Ут 10.3 и БП 3.0 на разных платформах, так как 10.3 на новых платформах начинает неадекватно работать.
24. Стас Стас (glime) 61 24.11.17 13:03 Сейчас в теме
18. Екатерина Статкевич (Fecolka) 09.10.17 18:43 Сейчас в теме
Спасибо тебе, золотой ты человек!
21. Дмитрий Конаков (dkonakov) 5 20.11.17 13:49 Сейчас в теме
Тоже актуальный вопрос, может кто-то задаст вопрос на партнерском форуме?
Оставьте свое сообщение