Как настроить COM-соединение с базами 1С разных версий на одном сервере без перерегистрации библиотек?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции различных информационных систем на базе 1С часто возникает необходимость установить COM-соединение между базами, работающими на разных версиях платформы (например, обмен между 8.3.10 и 8.3.14). Основная проблема заключается в том, что стандартная регистрация библиотеки comcntr.dll через regsvr32 позволяет «видеть» в системе только одну версию компонента — ту, которая была зарегистрирована последней. Попытка добавить вторую библиотеку в «Службы компонентов» (COM+) часто наталкивается на ошибку "Этот объект уже зарегистрирован". В данной статье мы разберем, как обойти это ограничение и правильно настроить среду для работы с несколькими версиями платформы одновременно.

Почему возникает ошибка «Этот объект уже зарегистрирован»?

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

Чтобы решить эту задачу, нам необходимо использовать механизм изоляции компонентов. Рассмотрим по шагам, как правильно подготовить систему.

Шаг 1. Очистка текущей регистрации компонентов

Прежде чем приступать к созданию «оберток» в COM+, рекомендуется корректно разрегистрировать имеющиеся библиотеки, чтобы избежать конфликтов. Для этого воспользуемся утилитой regsvr32. Важно помнить о разрядности вашей системы и используемой платформы 1С.

Для 64-битной библиотеки выполните в командной строке (от имени администратора):


regsvr32 /u "C:\Program Files\1cv8\8.3.10.2466\bin\comcntr.dll"
regsvr32 /u "C:\Program Files\1cv8\8.3.14.1779\bin\comcntr.dll"

Если вы используете 32-битную версию платформы на 64-битной Windows, необходимо использовать версию regsvr32, расположенную в папке C:\Windows\SysWOW64\.

Шаг 2. Создание приложений в Службах компонентов (COM+)

Для того чтобы система могла одновременно работать с разными версиями comcntr.dll, мы создадим для каждой версии отдельное «Серверное приложение» в консоли «Службы компонентов» (Component Services). Это позволит запускать библиотеку в изолированном процессе dllhost.exe.

  1. Откройте «Панель управления» — «Администрирование» — «Службы компонентов».
  2. Перейдите в ветку "Приложения COM+" и выберите «Создать» — «Приложение».
  3. В мастере установки выберите «Создать новое приложение». Введите понятное имя, например, 1C_COM_8_3_10.
  4. На этапе выбора способа активации обязательно укажите "Серверное приложение".
  5. На вкладке «Удостоверение» (Identity) укажите пользователя, под которым будет запускаться этот процесс (обычно это системная учетная запись или специально созданный пользователь с правами доступа к папкам 1С).
  6. После создания приложения перейдите в папку «Компоненты» внутри него. Нажмите «Создать» — «Компонент».
  7. Выберите «Установка новых компонентов» и укажите путь к comcntr.dll нужной версии.

Если на этом этапе вы снова видите ошибку "Этот объект уже зарегистрирован", попробуйте сначала импортировать компонент, который уже зарегистрирован в системе, а затем в его свойствах изменить путь к файлу. Однако более надежным способом является временное переименование веток реестра или использование экспорта/импорта MSI-пакетов COM+, где в конфигурационном файле вручную меняются ссылки на файлы.

Шаг 3. Использование уникальных имен (ProgID)

После того как мы создали обертки в COM+, нам нужно иметь возможность обращаться к ним из кода 1С. По умолчанию Новый COMОбъект("V83.COMConnector") будет обращаться к той версии, которая зарегистрирована в реестре как основная. Чтобы обращаться к конкретной версии, разберем программный способ.

Для каждой созданной «обертки» в реестре Windows можно создать уникальный ProgID. Например, V83.COMConnector.8.3.10. Это делается путем редактирования ветки HKEY_CLASSES_ROOT, где создается новый ключ, ссылающийся на CLSID нашей обертки. Тогда в коде мы сможем писать:


// Пример обращения к конкретной версии платформы
НомерВерсии = "8.3.10.2466";
Попытка
    Соединитель = Новый COMОбъект("V83.COMConnector_" + СтрЗаменить(НомерВерсии, ".", "_"));
Исключение
    Соединитель = Новый COMОбъект("V83.COMConnector"); // Откат на стандартный метод
КонецПопытки;

Различия между V83.COMConnector и V83.Application

Выясним важную причину, почему иногда разработчики сталкиваются с ошибками вида "Метод объекта не обнаружен (СтрокаСоединенияИнформационнойБазы)". Существует два принципиально разных способа создания COM-соединения:

1. COM-соединение (V83.COMConnector):

2. OLE-соединение (V83.Application):

Если вам требуется функционал, который есть только в Application, но нет в COMConnector, вам придется использовать именно его, однако управление версиями для V83.Application осуществляется через системные настройки ассоциаций файлов 1С и реестр.

Настройка прав доступа в Службах компонентов

Проанализируем ситуацию, когда соединение не устанавливается из-за прав. При использовании COM+ процесс запускается от имени указанного вами пользователя. Убедитесь, что:

  1. У этого пользователя есть права «Чтение и выполнение» на папку bin соответствующей версии платформы 1С.
  2. Пользователь включен в группу «Пользователи распределенного COM» (Distributed COM Users).
  3. В настройках безопасности созданного COM+ приложения на вкладке «Безопасность» снят флаг «Принудительная проверка доступа для приложений», либо настроены соответствующие роли.

Рассмотренный метод использования COM+ является наиболее стабильным и «чистым» способом поддержки многоверсионности на одном сервере. Он избавляет от необходимости постоянно использовать regsvr32 при переключении между задачами обмена данными.

← На главную