Как устранить ошибку «Существуют активные соединения на другой платформе» при использовании COM-соединения в 1С?

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

При работе с несколькими версиями платформы «1С:Предприятие» на одном сервере или рабочей станции специалисты часто сталкиваются с технической коллизией. Ошибка «Существуют активные соединения на другой платформе» возникает в тот момент, когда система пытается инициализировать COM-соединение через библиотеку одной версии (например, 8.3.8), в то время как в памяти уже загружены компоненты или запущены процессы другой версии (например, 8.3.10). В этой статье мы подробно разберем причины возникновения этой ситуации и изучим пошаговые алгоритмы её решения.

Почему возникает конфликт версий COM-соединения?

Давайте проанализируем механизм работы Windows с объектами 1С. Когда мы вызываем в коде конструктор Новый COMОбъект("V83.COMConnector"), операционная система обращается к системному реестру, чтобы найти путь к библиотеке comcntr.dll, которая зарегистрирована под этим программным идентификатором (ProgID).

Проблема заключается в том, что при установке новой версии платформы 1С автоматически перезаписывает путь в реестре на свою библиотеку. Если на сервере одновременно должны работать базы на разных версиях платформы, возникает ситуация, когда один процесс уже занял ресурсы определенной версии библиотеки, а другой пытается вызвать ту же самую библиотеку, но ожидая иную версию API. Рассмотрим ситуацию подробнее: операционная система не может одновременно поддерживать два разных «состояния» для одного и того же COM-класса в рамках взаимодействующих процессов, если они не изолированы друг от друга.

Способ 1. Изоляция компонентов через «Службы компонентов» (COM+)

Этот метод считается наиболее надежным и профессиональным («best practice») в среде системных администраторов и разработчиков 1С. Его суть заключается в создании выделенного системного процесса dllhost.exe для каждой конкретной версии платформы. Таким образом, библиотеки разных версий перестают «видеть» друг друга и конфликтовать. Разберем по шагам, как это настроить:

  1. Откроем оснастку «Службы компонентов» (через Панель управления — Администрирование или командой comexp.msc).
  2. В дереве консоли перейдем по пути: «Службы компонентов» — «Компьютеры» — «Мой компьютер» — «Приложения COM+».
  3. Нажмем правую кнопку мыши на узле «Приложения COM+» и выберем «Создать» — «Приложение».
  4. В мастере установки выберем «Создать новое приложение», введем понятное имя (например, 1C_COM_8_3_10) и обязательно установим способ активации «Серверное приложение». Это критически важно, так как именно этот флаг заставляет библиотеку запускаться в отдельном процессе.
  5. На этапе выбора учетной записи укажем пользователя, от имени которого будет запускаться процесс (обычно это пользователь, под которым работает сервер 1С).
  6. После создания приложения зайдем в него, перейдем в папку «Компоненты», нажмем «Создать» — «Компонент».
  7. Выберем пункт «Установка новых компонентов» и укажем путь к файлу comcntr.dll нужной версии платформы (например, C:\Program Files\1cv8\8.3.10.XXXX\bin\comcntr.dll).

После этой настройки при обращении к V83.COMConnector система будет использовать изолированный экземпляр библиотеки, что позволит избежать ошибки о параллельных соединениях на другой платформе.

Способ 2. Ручная перерегистрация библиотеки через Regsvr32

Если нам необходимо временно восстановить работу конкретной версии или если работа на разных версиях происходит не одновременно, мы можем принудительно указать операционной системе, какую библиотеку считать основной. Рассмотрим, как это сделать через командную строку:

Запустим командную строку (CMD) от имени администратора и выполним следующую команду для регистрации версии 8.3.10:

regsvr32 "C:\Program Files\1cv8\8.3.10.2561\bin\comcntr.dll"

Или для версии 8.3.8:

regsvr32 "C:\Program Files\1cv8\8.3.8.1652\bin\comcntr.dll"

Важный нюанс: этот метод помогает только «здесь и сейчас». Как только запустится процесс, жестко требующий другую версию, ошибка вернется. Также помните о разрядности: если вы используете 64-битный сервер 1С, вам необходимо регистрировать библиотеку из папки Program Files, а не Program Files (x86).

Способ 3. Переход на HTTP-сервисы и Web-сервисы

Проанализируем стратегический совет, который часто дают опытные архитекторы 1С. Технология COM является устаревшей и сильно зависит от операционной системы Windows, прав доступа к реестру и разрядности процессов. Современный подход к интеграции между базами 1С (особенно на платформе 8.3) подразумевает использование HTTP-сервисов.

Почему это решает проблему? HTTP-сервисы работают через веб-сервер (IIS или Apache) и используют стандартные протоколы передачи данных. В этом случае базе-клиенту вообще не нужно иметь установленную платформу той же версии, что и у базы-сервера. Вы просто отправляете запрос и получаете ответ в формате JSON или XML.

Рассмотрим пример того, как мог бы выглядеть вызов данных через HTTP вместо COM-соединения:


Соединение = Новый HTTPСоединение("server-name", , "user", "password");
Запрос = Новый HTTPЗапрос("/ваша_база/hs/my_service/v1/get_data");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    ДанныеJSON = Ответ.ПолучитьТелоКакСтроку();
    // Обработка полученных данных
КонецЕсли;

Такой подход полностью исключает возникновение ошибок типа V83.COMConnector, так как библиотеки COM в этом процессе просто не участвуют.

Дополнительные аспекты: права доступа и разрядность

Выясним еще одну возможную причину неудачи. Иногда ошибка «Существуют активные соединения» может быть косвенно вызвана отсутствием прав у пользователя, под которым работает служба 1С, на чтение веток реестра или доступ к папке bin другой платформы. При установке новой версии (например, 8.3.8 после 8.3.10) инсталлятор может изменить владельцев ключей реестра HKEY_CLASSES_ROOT\CLSID\{...}.

Посмотрим на ситуацию с точки зрения разрядности: если внешнее приложение (например, Excel или самописная утилита на C#) является 32-битным, оно будет искать 32-битную версию comcntr.dll. Если сервер 1С при этом 64-битный, возникнет конфликт окружений. Решение через COM+ (Способ 1) также позволяет обойти и эту проблему, так как в настройках приложения COM+ можно явно указать разрядность процесса.

Резюме по решению проблемы

Для оперативного исправления ситуации в рамках текущей архитектуры мы рекомендуем использовать настройку приложения COM+. Это позволит разнести разные версии платформы по разным адресным пространствам. В долгосрочной же перспективе следует рассмотреть отказ от COM-технологий в пользу HTTP-сервисов, что сделает вашу систему более стабильной, кроссплатформенной и независимой от специфических настроек реестра Windows.

← На главную