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 не будет опубликован. Обязательные поля помечены *