Почему зависает COM-соединение из клиент-серверной базы 1С 8.3 к 1С 8.2 и как это исправить?

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

При организации программного обмена данными между базами 1С разных версий разработчики часто сталкиваются с ситуацией, когда код подключения зависает без вывода сообщений об ошибках. В файловом варианте базы решение работает исправно, однако при переходе в клиент-серверный режим попытка подключения из базы на платформе 1С 8.3 к базе на платформе 1С 8.2 бесконечно блокирует процесс. Проанализируем причину такого поведения и разберем способы решения задачи.

Выясним причину зависания COM-соединения

Главная причина кроется в архитектуре выполнения кода в клиент-серверном режиме. Когда программный код вызова COMОбъект выполняется на стороне сервера 1С (например, в модуле менеджера, регламентном задании или серверном вызове формы), рабочие процессы rphost.exe ищут нужную библиотеку comcntr.dll непосредственно на том компьютере, где физически запущен сервер 1С 8.3.

Если на физическом сервере 1С 8.3 не установлены компоненты платформы 1С 8.2 или библиотека comcntr.dll версии 8.2 не зарегистрирована в операционной системе Windows, сервер 1С не может инициализировать COM-соединение и зависает при попытке обращения к отсутствующему объекту.

Кроме того, возникновению проблемы могут способствовать следующие факторы:

  1. Несоответствие разрядности процессов: Служба 64-разрядного сервера 1С 8.3 не может напрямую загрузить 32-разрядную библиотеку comcntr.dll от 1С 8.2.
  2. Отсутствие прав у службы 1С: Учетная запись системной службы 1С (например, usr1cv8) не имеет доступа к каталогу с установленной платформой 8.2 или к разделам реестра Windows.

Способ 1. Установка платформы 8.2 и регистрация библиотеки comcntr.dll

Разберем по шагам наиболее прямое решение проблемы. Чтобы сервер 1С 8.3 мог успешно создавать объект подключения к 8.2, на рабочем сервере 1С 8.3 должны присутствовать необходимые компоненты платформы 8.2.

  1. Установите платформу 1С:Предприятие 8.2 на сервер, где работает служба 1С 8.3. При установке обязательно выберите компонент COM-соединение (Comconnector).
  2. Запустите командную строку от имени Администратора.
  3. Зарегистрируйте библиотеку comcntr.dll платформы 8.2 с учетом разрядности операционной системы и платформы.

Для 32-разрядной библиотеки на 64-битной ОС зарегистрируйте её с помощью утилиты из папки SysWOW64:


C:\Windows\SysWOW64\regsvr32 "C:\Program Files (x86)\1cv82\8.2.19.130\bin\comcntr.dll"

Если используется 64-разрядная версия платформы 8.2, используйте стандартный путь:

regsvr32 "C:\Program Files\1cv82\8.2.19.130\bin\comcntr.dll"

Способ 2. Настройка приложения COM+ для взаимодействия 64-бит и 32-бит

Если ваш сервер 1С 8.3 работает в 64-разрядном режиме, а библиотека comcntr.dll версии 8.2 доступна только в 32-разрядном исполнении, прямой вызов вызовет сбой или зависание. В этом случае настроим суррогатный процесс Windows через COM+.

  1. Откройте оснастку Службы компонентов (выполните команду dcomcnfg).
  2. Перейдите в ветку: Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правой кнопкой мыши и выберите Создать -> Приложение.
  4. В master-мастере выберите «Создать новое приложение», укажите имя (например, 1C82_COM) и способ активации Серверное приложение.
  5. Укажите учетную запись локального администратора для запуска приложения.
  6. В созданной ветке приложения откройте папку Компоненты, нажмите «Создать» -> «Компонент» и укажите файл comcntr.dll из папки bin платформы 8.2.
  7. В свойствах созданного приложения COM+ на вкладке Безопасность снимите флаг Принудительная проверка доступа для приложений.

Корректная обработка COM-соединения в коде 1С

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


&НаСервере
Процедура ПодключитьсяКБазе82()
    
    COMКоннектор = Новый COMОбъект("V82.COMConnector");
    
    СтрокаПодключения = "Srvr=""Server82"";Ref=""Base82"";Usr=""Admin"";Pwd=""Secret"";";
    
    Попытка
        Соединение = COMКоннектор.Connect(СтрокаПодключения);
    Исключение
        ЗаписьЖурналаРегистрации("COM-соединение", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат;
    КонецПопытки;
    
    // Выполнение необходимых операций с базой-приемником
    // ...
    
    // Обязательное очищение ссылок для корректного закрытия сеанса
    Соединение = Неопределено;
    COMКоннектор = Неопределено;
    
КонецПроцедуры

Альтернативные способы интеграции

Использование механизмов COM/DCOM для связи между серверами постепенно уходит в прошлое из-за сложности настройки разрядностей, прав и привязки к операционной системе Windows. Если на сервере источника используется OS Linux, COM-соединения не поддерживаются вовсе.

В качестве более надежных альтернатив рекомендуется проанализировать использование HTTP-сервисов или Web-сервисов (SOAP). Опубликовав веб-сервис на стороне базы 8.2, вы сможете выполнять обращения из базы 8.3 с помощью стандартных объектов HTTPСоединение или WSПрокси без использования внешних DLL и сбоев по разрядности.

← На главную