При разработке на управляемых формах часто возникает ситуация, когда при вызове метода Новый COMObject в процедурах с директивой &НаСервере мы получаем ошибку на терминальном сервере, хотя этот же код идеально работает при локальном выполнении. Давайте разберем, почему это происходит и как это исправить.
Первое, что нужно осознать: директива &НаСервере означает, что код исполняется на сервере 1С. Если сервер 1С и терминальный сервер — это разные машины, то код выполняется в контексте пользователя, от имени которого запущена служба сервера 1С, а не в контексте пользователя, работающего в данный момент в терминальной сессии.
Основные причины сбоев:
Разберемся с правами доступа. COM-объекты управляются через службу DCOM. Чтобы проверить настройки, воспользуемся оснасткой dcomcnfg:
Посмотрим на архитектуру системы. Если сервер 1С установлен как 64-битное приложение, он будет обращаться к веткам реестра 64-битных приложений. Если ваша компонента AddIn.MySQL является 32-битной, она должна быть зарегистрирована в ветке WOW6432Node:
Проверьте следующие пути в реестре:
Для x64: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
Для x86 (WOW6432Node): HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\CLSID
Если компонента там отсутствует, сервер 1С её просто «не увидит» при попытке вызвать Новый COMObject.
Если объект требует доступа к профилю пользователя, помните, что у службы 1С профиль пользователя не загружен. Если компонента AddIn.MySQL при инициализации пытается прочитать настройки из HKEY_CURRENT_USER или пользовательских папок AppData, она выдаст ошибку, так как для службы 1С эти пути ведут в системные папки, а не к пользователю терминала.
Пример корректного вызова в модуле:
&НаСервере
Функция ИнициализироватьКомпоненту()
Попытка
Сайт = Новый COMObject("AddIn.MySQL");
Возврат Сайт;
Исключение
ЗаписьЖурналаРегистрации("Ошибки COM", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Чтобы понять, что именно идет не так, выполним следующие действия:
DCOM или Application Error в момент выполнения кода.AddIn.MySQL библиотекой (DLL) или исполняемым файлом (EXE). EXE-серверы требуют обязательной регистрации в системе и часто зависят от интерактивного сеанса, что делает их крайне неудобными для работы на серверной стороне 1С.Резюмируя, при разделении серверов всегда проверяйте, установлена ли компонента именно на сервере 1С, а не только на терминальном сервере, и хватает ли службе сервера 1С прав на её запуск в рамках текущей политики безопасности Windows.