COM з’єднання з базами 1С на різних версіях платформи "Без перереєстрації та СМС"
Значить, справа була так. Виникла необхідність підключатися до баз по 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\\ має виглядати так
У гілці "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С тепер потрібно використовувати наступну конструкцію
У файлах утиліта, яка виконає всі ці дії автоматично. Підходить для тих, у кого 1С лежить в каталозі
Завантажити файли
Спеціальні пропозиції










(5) Ось саме для цього, я і виклав вихідники) Робиш clone master гілки і далі вже робиш усе під себе. Ну або просто руками виконуєш всі дії з інструкції, багато часу це не займає, і виконувати потрібно лише один раз для кожної версії.
До речі, класCOMAdminCatalogClassмає метод Connect, відповідно можна переписати утиліту для віддаленої настройки.
Не можу зрозуміти що я роблю не так, але мені не вдається вирішити таким способом підключення до різних версій з однієї бази. Наприклад, є таке оточення: - 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не працює. На клієнті виводиться помилка: "Процедура входу до пункту ?handle@ModuleLoader@core@@QAEPAUHINSTANCE__@@XZ не може бути розташована в динамічній 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" потрібної версії використовувати, а й підключатися з відповідної версії клієнта/сервера. Підкажіть, у кого вийшло так настроїти, чи не було схожої проблеми?
Здається я зрозумів у чому справа - система кешує 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.
Зараз спробував одночасно підключитися до однієї бази за допомогою різних версій, поведінка коректна.
Ідея цікава, але я маю місце бути проблема. Якщо створювати COM-об'єкти різних версій з деякою паузою між цими створіннями, то все гаразд. А, ось, якщо цю паузу не витримувати - то можливе виникнення двох помилок (я так і не зміг зрозуміти причини та наслідки коли якась помилка виникає, швидше за все спочатку перша, а при повторній спробі вже друга) Запускалося все під клієнтом однієї чи другої версії (пробував і так і так) – файловий варіант. Основний COM-об'єкт був версії 8.3.10.2252, але навіть якщо до нього звертатися як до "v83.COMConnector" це нічого не змінювало Послідовність створення COM-об'єктів не впливає, але якщо отримати першу помилку, переставити їх місцями - виникає друга помилка Версія клієнта 1С: Підприємство також не впливає. Запуск у новому сеансі 1С проблему не вирішує.
Виконую такий алгоритм:
Виникає перша помилка:
При повторному запуску вона повторюється
Переставляємо місця створення COM-Об'єктів
І виникає друга помилка:
При повторному запуску вона повторюється
Далі – якщо знову переставити назад – помилка повторюватиметься
Через хвилин 15-20 все проходить - і починається з початку (з урахуванням переставлених викликів створення COM-об'єктів):
Значить COM-об'єкт десь кешується (платформою 1С? - мало ймовірно - тому що перезапуск клієнта нічого не вирішує) і при спробі створити повторно (нехай і, загалом, інший COM-Об'єкт) йде звернення до старого і відбувається якийсь конфлікт версій.
На жаль, це майже ставить хрест на цій методиці. Але, якщо одночасна (читай послідовна але водночас у межах 20 хвилин) робота не потрібна - описаний у статті метод буде працювати. Але, особисто мені потрібна була одночасна робота :-( Треба спробувати виконати ті ж звернення, але не з 1С - якщо проблеми не буде, то це 1С кешує (і це можна обійти - але логіку роботи з COM -об'єктом доведеться виносити за межі 1С), а якщо буде, то потрібно що інше вигадувати!
Загалом така ж ситуація, але помилка завжди на ДРУГИЙ за рахунком компоненті (не важливо якої вона версії.) І завжди така:
При цьому якщо створювати та використовувати їх окремо (посадив на різні кнопки) То ситуація така 1. Будь-яку створюю - все нормально 2. Створю другу – виникає помилка 3. Створюю першу - помилки немає 4. Створю другу – помилка 5. Повторно створюю другу - помилки немає 6. Знову створюю другу - помилки немає 7. Створюю першу - помилка 8. Створюю першу - помилки немає 9. Створю другу – помилка 10. Створю другу - помилки неті
Тобто вперше створюєтьсянормально і якщо відразу створювати іншу версію - буде помилка - але при повторному створенні - помилки не буде - але вона знову буде у першої, що при повторному створенні так само помилки не буде Тому з v82 я написав ось так - і загалом воно працює
Значить компонент 8.2 не кешується, на відміну від 8.3 :-
Спроба написати так само для 8.3
вперше відпрацювало, але повторний запуск призвів до помилки V83.COMConnector_8.3.10.2252:
це перший рядок у першій спробі - і ця помилка далі стабільно повторювалася
Спробував працювати паралельно з компонентами V82 та v82
Жодних помилок не виникає!
Так що – як 1С (або windows) це все обробляють, що виникає такий вінегрет із різних ситуацій – незрозуміло. Треба ще розбиратися та експериментувати
Можливо ці проблеми суто пов'язані з моєю конфігурацією ОС - використовую windows 8 А може справа у релізах 1С, що використовуються: Підприємство, клієнта і компонент (хоча на клієнті 8.2.19.80 я теж спробував - все те ж саме)