Значит дело было так. Появилась необходимость подключаться к базам по 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 . Запустить утилиту нужно от имени администратора. Надеюсь данный материал будет вам полезен)
1. Название COM классу лучше давать более гибкое. Например V83.COMConnector_Buh, V83.COMConnector_secondary, V83.COMConnector_test. Поэтому в инструменте регистрации хотелось бы соответствующий параметр.
2. Чаще требуется регистрация 64-разрядного варианта. Поэтому в инструменте регистрации хотелось бы соответствующий параметр.
(1) Я же делал так, как удобнее мне, а для остальных я предоставил исходники, все что нужно, можно изменить под себя.
А почему сразу при регистрации компоненты не указать нужный путь «C:Program Files (x86)1cv88.3.9.2033incomcntr.dll» — зачем его менять в regedit?
(3) Я тоже так хотел, но по факту мы после первого раза делаем не регистрацию, а просто псевдоним, и свойство «DLL» именно оно отвечает за путь к нашей dll,ReadOnly
(5) Вот именно для этого, я и выложил исходники) Делаешь clone master ветки и дальше уже делаешь все под себя. Ну или просто руками выполняешь все действия из инструкции, много времени это не занимает, и выполнять нужно всего один раз для каждой версии.
К слову, у класса COMAdminCatalogClass имеется метод Connect, соответственно можно переписать утилиту для удаленной настройки.
(6)Вопрос полностью снят.
Поддерживаем большой зоопарк серверов и баз. Com объекты, зарегистрированные через компоненты могут работать не стабильно. Соединения проходят нормально, а дальше могут быть разные «чудеса».
Не могу понять что я делаю не так, но у меня не получается решить таким способом подключение к разным версиям из одной базы.
Например, есть следующее окружение:
— 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» нужной версии использовать, но и выполнять подключение из соответствующей версии клиента/сервера.
Подскажите, у кого получилось так настроить, не было ли похожей проблемы?
Кажется я понял в чем дело — система кэширует 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 так не получается, т.к. при старте сервера подгружается соответствующая версия в кэш и в дальнейшем используется она.
(10) После того как ты создал обертку V83.COMConnector, попробуй выполнить «Исправление» через Программы и компоненты, той версии через которой ты хочешь что бы был V83.COMConnector.
Сейчас попробовал одновременно подключиться к одной базе с помощью разных версий, поведение корректное.
Подскажите, можно ли таким образом зарегистрировать comcntr.dll для 8.3 без установки платформы на компьютере.
(12) Скорей всего можно, только одной comcntr.dll будет недостаточно это точно. Нужно пробовать)
Добрый день, спасибо за статью, внесла ясности.
Можете дописать в статью к пункту 8 пояснение.
Что бы найти нужную ветку в реестре необходимо в свойствах компонента скопировать CLSID и по этому ID найти нужную ветку в реестре. Скрин ниже, а то я например заманался искать нужную ветку, а по имени почему-то не находилась (до меня кто-то ковырял реестр)
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ (8.3.8.2054) отличается от версии корневого модуля ‘core83’ (8.3.8.1652)
(15)
Посмотрите выше мои комментарии (9) и (10)
У меня тоже сложилось впечатление, что что-то кешируется.
Если делать не через 1С, а через что-то внешнее, например запускать подключение через вызов 1Script — то проблем с кешем нет.
(16) Вот фигня, как же с этим бороться…. создавать обёртку во внешней компоненте — фиговое решение….
Пробовал переименовывать саму dll (чтобы имена разные были — не помогло). Какой же ключ использует 1С для идентификации кешированного значения, ведь они всем отличаются и именем, и CLSID, и даже полным путём к dll, включая имя файла «comcntr.dll»
Что-то ещё в самой dll зашито?
Я вообще на файловой базе пробовал, и клиента перезапускал — эффект первого запуска минут на 10-15 сохраняется — что же это за кеш такой? Кеш windows?
Кеш сбрасывается либоо времени, либо при выходе из сеанса windows.
Спасибо тебе, золотой ты человек!
(14)
Добрый день. Так я не понял, как избавляться от такого сообщения? Подскажите.
До обнаружения этой статьи просто пробовал делать regsvr comctrl, той версии, к базе которой собирался подключаться через COM. Получал точно такую же ошибку, что и сейчас
(19) Добрый день, я сдался. Вопрос актуальные, но я устал ковыряться в надежде появления надежного решения.
Устанавливать новый сервер ради одной проблемы ну уж муторно.
Тоже актуальный вопрос, может кто-то задаст вопрос на партнерском форуме?
(20)Привет, разобрался?
(22)нет, так и забил, хотя актуально, нужно построение отчетов в УТ 10.3 по данным БП 3.0. Обороты из БП 3.0 приходится выгружать через файл выгрузки…… очень не удобно. Ут 10.3 и БП 3.0 на разных платформах, так как 10.3 на новых платформах начинает неадекватно работать.
(23)жаль.
(6)
VC2017 comunity использую для компиляции приложения под frame work 3.5 только проходит сборка, и при запуске выходит ошибка:
«сборка создана в более поздней версии среды выполнения чем текущая и не может быть загружена»
Хотя скомпелированный файл запускается без ошибок, только пути у меня не стандартные.
Что не так?
Framework 3.5sp1 и 4.0. стоят.
Система Windows 7 x64.
VC2017 comunity использую для компиляции приложения под frame work 3.5 только проходит сборка, и при запуске выходит ошибка:
«сборка создана в более поздней версии среды выполнения чем текущая и не может быть загружена»
Хотя скомпилированный файл запускается без ошибок, только пути у меня не стандартные.
Что не так?
Framework 3.5sp1 и 4.0. стоят.
Система Windows 7 x64.
Добрый день, подскажите после создания Alias с нужной платформой (поменяв папку, и скорректировав регистр) требуется перезагрузка сервера? Спасибо.
(28) Требуемую dll загрузил через regsvr32. Но выскакивает ошибка Значение не является значением объектного типа (Connect) ???
В командной строке убираем регистрацию новой dll:
regsvr32 /u C:1cv88.3.10.2667incomcntr.dll
затем регистрируем старую (подходящую для старого сервера), например:
regsvr32 C:1cv88.3.9.1818incomcntr.dll
(30) Спасибо за ответ. Только новая dll тоже нужна, ее используют бухгалтера. Если я сделаю выше описанные операции, я так понимаю, что у меня будет зарегистрирована только старая dll, к новой подключиться будет невозможно? Я правильно понял? Спасибо.
При выполнении вышеописанных операций будет доступна только старая dll. Как вариант, можно использовать к-л скрипт, чтобы быстро перерегистрировать нужную dll.
Лучше всего использовать одну и ту же платформу на всех базах (у себя мы пришли к такому выводу).
(32) Сергей, а как же тогда весь выше описанный пост? Именно от перерегистрации и хотели уйти (описывая вышесказанное). Может как вариант создать 27. MaximkaSM (MaximkaSM) создав компоненты в отдельных приложениях СОМ ?
ComОбъект = ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя();
Прошу помощи.
Никак не могу подключиться из базы на платформе 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): Класс не зарегистрирован»
Создавал алиасы под разные версии, ошибки те же.
Как подружить две платформы?
(27)
Как создать отдельные приложения, при создании второго ругается на то что уже есть такое приложение, зарегистрировано
А без админских прав никак это не запустить?
Неудобно же очень.
Это получается, что только администраторы должны пользоваться этими компонентами что-ли?
(39) Если я правильно помню, там есть раздел «Роли», и в нем вы моете предоставить доступ к компоненте и другим пользователям или группа пользователей.
(40) Спасибо! посмотрим это…
Спасибо! При непонятной заморочке соединения известной конструкторской программы и APPIUS PLM помогли первые 6 пунктов инструкции.
Не получается пункт 6. Выбираем вариант «Установка новых компонентов», находим нашу библиотеку comcntr.dll.
Выскакивает ошибка: «Этот объект уже зарегистрирован»!? Ничего не создается (компонент V83.COMConnector.1).
(43) Оказалось, что у меня уже есть компонент V83.COMConnector.1, использовал его. Правильно ли?
(44) COM соединения V83.COMConnector с ограниченными возможностями меня не устраивает из-за нехватки функционала: метод объекта не обнаружен (СтрокаСоединенияИнформационнойБазы), работа с формами. Возможны ли OLE соединения V83.Application с базами 1С на различных версиях платформы «Без перерегистрации и СМС»?
вот решение:
https://infostart.ru/public/1109511/
(36), спасибо. До того как это сделал получал ошибку:
-2147024769(0x8007007F): Не найдена указанная процедура.
Но после того, как сделал получил:
Отказано в доступе.
Зашёл в свойство COM приложения к которому привязан компонент и на закладке Безопасность установил «Уровень проверки безопасности для вызовов» в «Отсутсвует».
После этого соединение заработало как надо.
(48), ещё снял галку «Принудительная проверка доступа для приложения».
Спасибо огромное за статью. COM-соединение между версиями 8.2 и 8.3 работоспособно
(45)
Нашел кто вариант решения?