При организации программного обмена данными между базами 1С разных версий разработчики часто сталкиваются с ситуацией, когда код подключения зависает без вывода сообщений об ошибках. В файловом варианте базы решение работает исправно, однако при переходе в клиент-серверный режим попытка подключения из базы на платформе 1С 8.3 к базе на платформе 1С 8.2 бесконечно блокирует процесс. Проанализируем причину такого поведения и разберем способы решения задачи.
Главная причина кроется в архитектуре выполнения кода в клиент-серверном режиме. Когда программный код вызова COMОбъект выполняется на стороне сервера 1С (например, в модуле менеджера, регламентном задании или серверном вызове формы), рабочие процессы rphost.exe ищут нужную библиотеку comcntr.dll непосредственно на том компьютере, где физически запущен сервер 1С 8.3.
Если на физическом сервере 1С 8.3 не установлены компоненты платформы 1С 8.2 или библиотека comcntr.dll версии 8.2 не зарегистрирована в операционной системе Windows, сервер 1С не может инициализировать COM-соединение и зависает при попытке обращения к отсутствующему объекту.
Кроме того, возникновению проблемы могут способствовать следующие факторы:
comcntr.dll от 1С 8.2.usr1cv8) не имеет доступа к каталогу с установленной платформой 8.2 или к разделам реестра Windows.Разберем по шагам наиболее прямое решение проблемы. Чтобы сервер 1С 8.3 мог успешно создавать объект подключения к 8.2, на рабочем сервере 1С 8.3 должны присутствовать необходимые компоненты платформы 8.2.
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"
Если ваш сервер 1С 8.3 работает в 64-разрядном режиме, а библиотека comcntr.dll версии 8.2 доступна только в 32-разрядном исполнении, прямой вызов вызовет сбой или зависание. В этом случае настроим суррогатный процесс Windows через COM+.
dcomcnfg).1C82_COM) и способ активации Серверное приложение.comcntr.dll из папки bin платформы 8.2.Рассмотрим пример правильного создания и обязательного завершения 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 и сбоев по разрядности.