Нередко разработчики сталкиваются с ситуацией, когда код интеграции через COM-объекты (будь то прямое подключение к внешней базе данных через OLE DB или соединение с другой информационной базой 1С через V83.COMConnector) безупречно выполняется в интерактивной обработке, но при запуске в регламентном или фоновом задании падает с ошибкой на этапе инициализации или метода Connect/Open. Разберем по шагам, почему возникает такое поведение, какие скрытые факторы серверной среды влияют на выполнение кода и как правильно настроить операционную систему и кластер 1С.
Главная причина расхождения в поведении заключается в кардинальной разнице между средой запуска клиентского приложения и фонового задания:
rphost, который запущен от имени служебной учетной записи (по умолчанию это локальный пользователь USR1CV8 либо специально созданная доменная учетная запись). Если у сервисного пользователя нет прав на необходимые каталоги, ветки реестра или запуск компонентов, подключение завершится ошибкой.ORACLE_HOME, TNS_ADMIN или пути к исполняемым файлам) прописаны только в переменных текущего пользователя, а не в системных переменных операционной системы, рабочий процесс сервера 1С просто не увидит конфигурационные файлы и драйверы.Посмотрим на исходный пример, в котором создается объект соединения с базой Oracle через OLE DB:
ADODBConnection = Новый COMОбъект("ADODB.Connection");
ADODBCommand = Новый COMОбъект("ADODB.Command");
Попытка
ADODBConnection.Open("Provider=OraOLEDB.Oracle;Password=SecretPass;User ID=load_user;Data Source=msc-srv.corp/ods;Persist Security Info=False");
ADODBCommand.ActiveConnection = ADODBConnection;
Исключение
ТекстОшибки = "Ошибка при подключении к СУБД Oracle: " + ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Интеграция Oracle", УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);
КонецПопытки;
При падении в фоновом задании стандартная функция ОписаниеОшибки() часто сообщает лишь общее сообщение об исключении COM. Чтобы выяснить точную причину сбоя на стороне Oracle (например, сетевые проблемы, неверные учетные данные или сбой драйвера), детализируем обработку исключения с помощью коллекции Errors объекта ADO:
Попытка
ADODBConnection.Open(СтрокаПодключения);
Исключение
Для Каждого ОшибкаADO Из ADODBConnection.Errors Цикл
ЗаписьЖурналаРегистрации("Сбой Oracle ADO",
УровеньЖурналаРегистрации.Ошибка,,,
"Код ошибки: " + ОшибкаADO.NativeError + "; Описание: " + ОшибкаADO.Description);
КонецЦикла;
КонецПопытки;
Если регламентное задание падает на вызове ADODBConnection.Open, выполним следующие системные проверки на сервере, где функционирует кластер 1С:
bin и файл tnsnames.ora.ORACLE_HOME и TNS_ADMIN в раздел «Системные переменные» (System variables), а путь к каталогу bin клиента Oracle добавим в общесистемную переменную Path.Рассмотрим вторую распространенную задачу — подключение регламентным заданием к соседней информационной базе 1С. Типовой код выглядит следующим образом:
Попытка
Com = Новый COMОбъект("V83.COMConnector");
ШаблонПодключения = "Srvr='ServerName'; Ref='BaseName'; Usr='User'; Pwd='Password';";
ПодключениеКБазе = Com.Connect(ШаблонПодключения);
Исключение
ЗаписьЖурналаРегистрации("Ошибка подключения 1С",
УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка соединения: " + ОписаниеОшибки());
КонецПопытки;
Если сервер 1С работает под специфической учетной записью или в 64-битном режиме, стандартное обращение к библиотеке comcntr.dll может блокироваться подсистемой DCOM. В этом случае настроим серверное приложение в оснастке «Службы компонентов» (Component Services):
dcomcnfg).V83COMConnector, и активируем переключатель Серверное приложение.comcntr.dll из каталога нужной платформы 1С (папка bin).Проанализируем еще одну частую программную причину сбоя: выполнение регламентного задания в безопасном режиме. Если регламентное задание выполняется в безопасном режиме (или вызвано процедурой из общего модуля, у которого установлен признак безопасного режима), платформа 1С блокирует создание любых внешних объектов через команду Новый COMОбъект. В свойствах регламентного задания или общего модуля необходимо убедиться, что безопасный режим отключен, либо при программном вызове передавать значение Ложь в соответствующий параметр.
Использование COM-соединений в серверных процессах признано устаревающим подходом. Кроме того, COM-технология полностью несовместима с серверами под управлением Linux. Для надежной интеграции рекомендуется переходить на более устойчивые архитектурные решения:
HTTPСоединение и HTTPЗапрос либо протокола OData, что полностью исключает зависимость от платформенных DLL, разрядности библиотек и настроек безопасности Windows.