При работе с несколькими версиями платформы «1С:Предприятие» на одном сервере или рабочей станции специалисты часто сталкиваются с технической коллизией. Ошибка «Существуют активные соединения на другой платформе» возникает в тот момент, когда система пытается инициализировать COM-соединение через библиотеку одной версии (например, 8.3.8), в то время как в памяти уже загружены компоненты или запущены процессы другой версии (например, 8.3.10). В этой статье мы подробно разберем причины возникновения этой ситуации и изучим пошаговые алгоритмы её решения.
Давайте проанализируем механизм работы Windows с объектами 1С. Когда мы вызываем в коде конструктор Новый COMОбъект("V83.COMConnector"), операционная система обращается к системному реестру, чтобы найти путь к библиотеке comcntr.dll, которая зарегистрирована под этим программным идентификатором (ProgID).
Проблема заключается в том, что при установке новой версии платформы 1С автоматически перезаписывает путь в реестре на свою библиотеку. Если на сервере одновременно должны работать базы на разных версиях платформы, возникает ситуация, когда один процесс уже занял ресурсы определенной версии библиотеки, а другой пытается вызвать ту же самую библиотеку, но ожидая иную версию API. Рассмотрим ситуацию подробнее: операционная система не может одновременно поддерживать два разных «состояния» для одного и того же COM-класса в рамках взаимодействующих процессов, если они не изолированы друг от друга.
Этот метод считается наиболее надежным и профессиональным («best practice») в среде системных администраторов и разработчиков 1С. Его суть заключается в создании выделенного системного процесса dllhost.exe для каждой конкретной версии платформы. Таким образом, библиотеки разных версий перестают «видеть» друг друга и конфликтовать. Разберем по шагам, как это настроить:
comexp.msc).1C_COM_8_3_10) и обязательно установим способ активации «Серверное приложение». Это критически важно, так как именно этот флаг заставляет библиотеку запускаться в отдельном процессе.comcntr.dll нужной версии платформы (например, C:\Program Files\1cv8\8.3.10.XXXX\bin\comcntr.dll).После этой настройки при обращении к V83.COMConnector система будет использовать изолированный экземпляр библиотеки, что позволит избежать ошибки о параллельных соединениях на другой платформе.
Если нам необходимо временно восстановить работу конкретной версии или если работа на разных версиях происходит не одновременно, мы можем принудительно указать операционной системе, какую библиотеку считать основной. Рассмотрим, как это сделать через командную строку:
Запустим командную строку (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).
Проанализируем стратегический совет, который часто дают опытные архитекторы 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.