Почему COM-соединение работает в обработке, но падает с ошибкой в регламентном задании?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Нередко разработчики сталкиваются с ситуацией, когда код интеграции через COM-объекты (будь то прямое подключение к внешней базе данных через OLE DB или соединение с другой информационной базой 1С через V83.COMConnector) безупречно выполняется в интерактивной обработке, но при запуске в регламентном или фоновом задании падает с ошибкой на этапе инициализации или метода Connect/Open. Разберем по шагам, почему возникает такое поведение, какие скрытые факторы серверной среды влияют на выполнение кода и как правильно настроить операционную систему и кластер 1С.

Разница контекстов: интерактивный клиент и серверная служба

Главная причина расхождения в поведении заключается в кардинальной разнице между средой запуска клиентского приложения и фонового задания:

  1. Разные учетные записи: При запуске внешней обработки код инициализации COM выполняется в контексте текущего пользователя Windows. Регламентное задание выполняется на сервере приложений 1С рабочим процессом rphost, который запущен от имени служебной учетной записи (по умолчанию это локальный пользователь USR1CV8 либо специально созданная доменная учетная запись). Если у сервисного пользователя нет прав на необходимые каталоги, ветки реестра или запуск компонентов, подключение завершится ошибкой.
  2. Несовпадение разрядности (32-bit и 64-bit): Тонкий или толстый клиент 1С часто запускается как 32-разрядное приложение, использующее соответствующие 32-битные драйверы и библиотеки OLE DB/ODBC. Сервер 1С, как правило, является 64-разрядным. При попытке 64-битного процесса загрузить 32-битный OLE DB провайдер или библиотеку происходит системный сбой с ошибкой вида «Класс не зарегистрирован».
  3. Отсутствие интерактивного профиля: У служебной учетной записи сервера нет загруженного пользовательского профиля. Если переменные среды (такие как ORACLE_HOME, TNS_ADMIN или пути к исполняемым файлам) прописаны только в переменных текущего пользователя, а не в системных переменных операционной системы, рабочий процесс сервера 1С просто не увидит конфигурационные файлы и драйверы.

Анализ кода подключения к Oracle через ADODB

Посмотрим на исходный пример, в котором создается объект соединения с базой 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С:

  1. Установка правильной разрядности клиента СУБД: Если служба сервера 1С является 64-битной, на сервере обязательно должен быть установлен 64-битный клиент Oracle (включая OLE DB Provider for Oracle).
  2. Права файловой системы NTFS: Служебная учетная запись, от имени которой запущена служба сервера 1С, должна иметь права на чтение и выполнение (Read & Execute) на корневую директорию клиента Oracle, а также папку bin и файл tnsnames.ora.
  3. Системные переменные окружения: Перенесем переменные ORACLE_HOME и TNS_ADMIN в раздел «Системные переменные» (System variables), а путь к каталогу bin клиента Oracle добавим в общесистемную переменную Path.

Подключение к базам 1С через V83.COMConnector и настройка служб COM+

Рассмотрим вторую распространенную задачу — подключение регламентным заданием к соседней информационной базе 1С. Типовой код выглядит следующим образом:


Попытка
    Com = Новый COMОбъект("V83.COMConnector");
    ШаблонПодключения = "Srvr='ServerName'; Ref='BaseName'; Usr='User'; Pwd='Password';";
    ПодключениеКБазе = Com.Connect(ШаблонПодключения);
Исключение
    ЗаписьЖурналаРегистрации("Ошибка подключения 1С", 
        УровеньЖурналаРегистрации.Ошибка,,, 
        "Ошибка соединения: " + ОписаниеОшибки());
КонецПопытки;

Если сервер 1С работает под специфической учетной записью или в 64-битном режиме, стандартное обращение к библиотеке comcntr.dll может блокироваться подсистемой DCOM. В этом случае настроим серверное приложение в оснастке «Службы компонентов» (Component Services):

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

Безопасный режим и ограничения платформы

Проанализируем еще одну частую программную причину сбоя: выполнение регламентного задания в безопасном режиме. Если регламентное задание выполняется в безопасном режиме (или вызвано процедурой из общего модуля, у которого установлен признак безопасного режима), платформа 1С блокирует создание любых внешних объектов через команду Новый COMОбъект. В свойствах регламентного задания или общего модуля необходимо убедиться, что безопасный режим отключен, либо при программном вызове передавать значение Ложь в соответствующий параметр.

Современные альтернативы технологии COM

Использование COM-соединений в серверных процессах признано устаревающим подходом. Кроме того, COM-технология полностью несовместима с серверами под управлением Linux. Для надежной интеграции рекомендуется переходить на более устойчивые архитектурные решения:

  1. Внешние источники данных (ВИД): Для работы с реляционными базами данных (Oracle, MS SQL, PostgreSQL) механизм ВИД позволяет подключаться через ODBC, прозрачно сопоставлять таблицы внешних СУБД с метаданными 1С и обращаться к ним обычными запросами на языке 1С без вызова COM.
  2. HTTP-сервисы и REST API: Для обмена данными между конфигурациями 1С наиболее надежным стандартом выступает использование штатных объектов HTTPСоединение и HTTPЗапрос либо протокола OData, что полностью исключает зависимость от платформенных DLL, разрядности библиотек и настроек безопасности Windows.
← На главную