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)1cv88.3.10.2168incomcntr.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_MACHINESOFTWAREClassesWow6432NodeCLSID{553567A1-0481-4CD0-9F5C-393DD90DB0C3} выглядеть должно так

В ветке «InprocServer32» меняем значение у меня, «C:Program Files (x86)1cv88.3.10.2168incomcntr.dll» на путь к нужной версии длл, в данном случае «C:Program Files (x86)1cv88.3.9.2033incomcntr.dll». 

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

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


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

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

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

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

46 Comments

  1. tormozit

    1. Название COM классу лучше давать более гибкое. Например V83.COMConnector_Buh, V83.COMConnector_secondary, V83.COMConnector_test. Поэтому в инструменте регистрации хотелось бы соответствующий параметр.

    2. Чаще требуется регистрация 64-разрядного варианта. Поэтому в инструменте регистрации хотелось бы соответствующий параметр.

    Reply
  2. WizaXxX

    (1) Я же делал так, как удобнее мне, а для остальных я предоставил исходники, все что нужно, можно изменить под себя.

    Reply
  3. fancy

    А почему сразу при регистрации компоненты не указать нужный путь «C:Program Files (x86)1cv88.3.9.2033incomcntr.dll» — зачем его менять в regedit?

    Reply
  4. WizaXxX

    (3) Я тоже так хотел, но по факту мы после первого раза делаем не регистрацию, а просто псевдоним, и свойство «DLL» именно оно отвечает за путь к нашей dll, ReadOnly

    Reply
  5. WizaXxX

    (5) Вот именно для этого, я и выложил исходники) Делаешь clone master ветки и дальше уже делаешь все под себя. Ну или просто руками выполняешь все действия из инструкции, много времени это не занимает, и выполнять нужно всего один раз для каждой версии.

    К слову, у класса COMAdminCatalogClass имеется метод Connect, соответственно можно переписать утилиту для удаленной настройки.

    Reply
  6. iolko

    (6)Вопрос полностью снят.

    Reply
  7. родственник

    Поддерживаем большой зоопарк серверов и баз. Com объекты, зарегистрированные через компоненты могут работать не стабильно. Соединения проходят нормально, а дальше могут быть разные «чудеса».

    Reply
  8. disa_da

    Не могу понять что я делаю не так, но у меня не получается решить таким способом подключение к разным версиям из одной базы.

    Например, есть следующее окружение:

    — 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)1cv88.3.9.2170incomcntr.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» нужной версии использовать, но и выполнять подключение из соответствующей версии клиента/сервера.

    Подскажите, у кого получилось так настроить, не было ли похожей проблемы?

    Reply
  9. disa_da

    Кажется я понял в чем дело — система кэширует 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 так не получается, т.к. при старте сервера подгружается соответствующая версия в кэш и в дальнейшем используется она.

    Reply
  10. WizaXxX

    (10) После того как ты создал обертку V83.COMConnector, попробуй выполнить «Исправление» через Программы и компоненты, той версии через которой ты хочешь что бы был V83.COMConnector.

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

    Reply
  11. tolyan_ekb

    Подскажите, можно ли таким образом зарегистрировать comcntr.dll для 8.3 без установки платформы на компьютере.

    Reply
  12. WizaXxX

    (12) Скорей всего можно, только одной comcntr.dll будет недостаточно это точно. Нужно пробовать)

    Reply
  13. Nigmatul

    Добрый день, спасибо за статью, внесла ясности.

    Можете дописать в статью к пункту 8 пояснение.

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

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

    Reply
  14. Darklight
    Reply
  15. disa_da

    (15)

    Посмотрите выше мои комментарии (9) и (10)

    У меня тоже сложилось впечатление, что что-то кешируется.

    Если делать не через 1С, а через что-то внешнее, например запускать подключение через вызов 1Script — то проблем с кешем нет.

    Reply
  16. Darklight

    (16) Вот фигня, как же с этим бороться…. создавать обёртку во внешней компоненте — фиговое решение….

    Пробовал переименовывать саму dll (чтобы имена разные были — не помогло). Какой же ключ использует 1С для идентификации кешированного значения, ведь они всем отличаются и именем, и CLSID, и даже полным путём к dll, включая имя файла «comcntr.dll»

    Что-то ещё в самой dll зашито?

    Я вообще на файловой базе пробовал, и клиента перезапускал — эффект первого запуска минут на 10-15 сохраняется — что же это за кеш такой? Кеш windows?

    Кеш сбрасывается либоо времени, либо при выходе из сеанса windows.

    Reply
  17. Fecolka

    Спасибо тебе, золотой ты человек!

    Reply
  18. hair

    (14)

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

    Добрый день. Так я не понял, как избавляться от такого сообщения? Подскажите.

    До обнаружения этой статьи просто пробовал делать regsvr comctrl, той версии, к базе которой собирался подключаться через COM. Получал точно такую же ошибку, что и сейчас

    Reply
  19. Nigmatul

    (19) Добрый день, я сдался. Вопрос актуальные, но я устал ковыряться в надежде появления надежного решения.

    Устанавливать новый сервер ради одной проблемы ну уж муторно.

    Reply
  20. dkonakov

    Тоже актуальный вопрос, может кто-то задаст вопрос на партнерском форуме?

    Reply
  21. glime

    (20)Привет, разобрался?

    Reply
  22. Nigmatul

    (22)нет, так и забил, хотя актуально, нужно построение отчетов в УТ 10.3 по данным БП 3.0. Обороты из БП 3.0 приходится выгружать через файл выгрузки…… очень не удобно. Ут 10.3 и БП 3.0 на разных платформах, так как 10.3 на новых платформах начинает неадекватно работать.

    Reply
  23. glime

    (23)жаль.

    Reply
  24. Alexander08

    (6)

    COMAdminCatalogClass

    VC2017 comunity использую для компиляции приложения под frame work 3.5 только проходит сборка, и при запуске выходит ошибка:

    «сборка создана в более поздней версии среды выполнения чем текущая и не может быть загружена»

    Хотя скомпелированный файл запускается без ошибок, только пути у меня не стандартные.

    Что не так?

    Framework 3.5sp1 и 4.0. стоят.

    Система Windows 7 x64.

    Reply
  25. Alexander08

    VC2017 comunity использую для компиляции приложения под frame work 3.5 только проходит сборка, и при запуске выходит ошибка:

    «сборка создана в более поздней версии среды выполнения чем текущая и не может быть загружена»

    Хотя скомпилированный файл запускается без ошибок, только пути у меня не стандартные.

    Что не так?

    Framework 3.5sp1 и 4.0. стоят.

    Система Windows 7 x64.

    Reply
  26. rabanik

    Добрый день, подскажите после создания Alias с нужной платформой (поменяв папку, и скорректировав регистр) требуется перезагрузка сервера? Спасибо.

    Reply
  27. rabanik

    (28) Требуемую dll загрузил через regsvr32. Но выскакивает ошибка Значение не является значением объектного типа (Connect) ???

    Reply
  28. s.gavrilov

    В командной строке убираем регистрацию новой dll:

    regsvr32 /u C:1cv88.3.10.2667incomcntr.dll

    затем регистрируем старую (подходящую для старого сервера), например:

    regsvr32 C:1cv88.3.9.1818incomcntr.dll

    Reply
  29. rabanik

    (30) Спасибо за ответ. Только новая dll тоже нужна, ее используют бухгалтера. Если я сделаю выше описанные операции, я так понимаю, что у меня будет зарегистрирована только старая dll, к новой подключиться будет невозможно? Я правильно понял? Спасибо.

    Reply
  30. s.gavrilov

    При выполнении вышеописанных операций будет доступна только старая dll. Как вариант, можно использовать к-л скрипт, чтобы быстро перерегистрировать нужную dll.

    Лучше всего использовать одну и ту же платформу на всех базах (у себя мы пришли к такому выводу).

    Reply
  31. rabanik

    (32) Сергей, а как же тогда весь выше описанный пост? Именно от перерегистрации и хотели уйти (описывая вышесказанное). Может как вариант создать 27. MaximkaSM (MaximkaSM) создав компоненты в отдельных приложениях СОМ ?

    Reply
  32. Rust

    ComОбъект = ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя();

    Reply
  33. KroVladS

    Прошу помощи.

    Никак не могу подключиться из базы на платформе 8.3.4 к базе на платформе 8.3.10 через COMОбъект(«V83.COMConnector»)

    Если зарегистрирована comcntr.dll из 8.3.4, то отваливается в момент V8.Connect, с ошибкой про разные версии клиента и сервера, что логично.

    Если зарегистрирована comcntr.dll из 8.3.10, то отваливается ещё на моменте создания COMОбъект, с ошибкой «Точка входа в процедуру ?handle@ModuleLoader@core@@QAEPAUHINSTANCE__@@XZ не найдена в библиотеке DLL core83.dll.» «-2147221164(0x80040154): Класс не зарегистрирован»

    Создавал алиасы под разные версии, ошибки те же.

    Как подружить две платформы?

    Reply
  34. mulder242

    (27)

    Как создать отдельные приложения, при создании второго ругается на то что уже есть такое приложение, зарегистрировано

    Reply
  35. zaxarovsky

    А без админских прав никак это не запустить?

    Неудобно же очень.

    Это получается, что только администраторы должны пользоваться этими компонентами что-ли?

    Reply
  36. WizaXxX

    (39) Если я правильно помню, там есть раздел «Роли», и в нем вы моете предоставить доступ к компоненте и другим пользователям или группа пользователей.

    Reply
  37. zaxarovsky

    (40) Спасибо! посмотрим это…

    Reply
  38. omil

    Спасибо! При непонятной заморочке соединения известной конструкторской программы и APPIUS PLM помогли первые 6 пунктов инструкции.

    Reply
  39. M_Volkov

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

    Выскакивает ошибка: «Этот объект уже зарегистрирован»!? Ничего не создается (компонент V83.COMConnector.1).

    Reply
  40. M_Volkov

    (43) Оказалось, что у меня уже есть компонент V83.COMConnector.1, использовал его. Правильно ли?

    Reply
  41. M_Volkov

    (44) COM соединения V83.COMConnector с ограниченными возможностями меня не устраивает из-за нехватки функционала: метод объекта не обнаружен (СтрокаСоединенияИнформационнойБазы), работа с формами. Возможны ли OLE соединения V83.Application с базами 1С на различных версиях платформы «Без перерегистрации и СМС»?

    Reply
  42. 2michael

    вот решение:

    https://infostart.ru/public/1109511/

    Reply
  43. alexbur

    (36), спасибо. До того как это сделал получал ошибку:

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

    Но после того, как сделал получил:

    Отказано в доступе.

    Зашёл в свойство COM приложения к которому привязан компонент и на закладке Безопасность установил «Уровень проверки безопасности для вызовов» в «Отсутсвует».

    После этого соединение заработало как надо.

    Reply
  44. alexbur

    (48), ещё снял галку «Принудительная проверка доступа для приложения».

    Reply
  45. user902161

    Спасибо огромное за статью. COM-соединение между версиями 8.2 и 8.3 работоспособно

    Reply
  46. ZAOSTG

    (45)

    V83.Application

    Нашел кто вариант решения?

    Reply

Leave a Comment

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