Почему Новый COMОбъект работает в 1С 8.2, но выдает ошибку в 1С 8.3?

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

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

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

Главная причина: контекст исполнения кода (Клиент и Сервер)

Проанализируем ситуацию: в толстом клиенте 1С 8.2 или при работе с обычными формами код по умолчанию исполнялся на стороне клиента, где зарегистрированы все необходимые внешние библиотеки и программы (MS Office, драйверы весов и сканеров).

В управляемом приложении 1С 8.3 при клиент-серверном режиме работы код процедуры часто ошибочно выполняется на сервере (в контексте с директивой &НаСервере или в серверном модуле). Это приводит к сбою по следующим причинам:

  1. Отсутствие компоненты на сервере: COM-сервер или DLL-библиотека зарегистрирована на рабочем столе пользователя (на клиенте), но не установлена на сервере приложений 1С.
  2. Несовпадение разрядности: Служба сервера 1С 8.3 чаще всего является 64-разрядным процессом (rphost.exe). 64-битный процесс сервера не может напрямую загрузить 32-битную COM-библиотеку.
  3. Ограничения прав службы: Служба 1С запускается от имени системной учетной записи (например, usr1cv8), у которой нет локального профиля пользователя и прав на запуск интерактивных GUI-приложений, таких как Excel.

Шаг 1. Проверка и перенос вызова на клиентскую сторону

Если взаимодействие с COM-объектом (например, подключение электронных весов или загрузка локального файла Excel) требуется для конкретного пользователя, вызов конструктора Новый COMОбъект должен выполняться строго на клиенте.

Посмотрим на пример правильного выполнения процедуры в клиенте управляемого приложения:


&НаКлиенте
Процедура ПодключитьВесыНаКлиенте()
    
    Попытка
        Весы = Новый COMОбъект("Controller.ScAuto");
        // Работа с объектом весов
    Исключение
        Сообщить("Не удалось инициализировать COM-объект на клиенте: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

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

Шаг 2. Настройка работы COM-объекта на 64-битном сервере (если вызов нужен на сервере)

Если бизнес-логика требует создания COM-объекта именно в серверном контексте (например, в фоновом или регламентном задании), необходимо настроить среду выполнения на сервере.

1. Использование Служб компонентов (COM+ Application):

Для запуска 32-битных компонентов на 64-битной платформе 1С настроим обертку dllhost.exe:

  1. Откройте «Оснастку службы компонентов» (dcomcnfg).
  2. Перейдите в Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Создайте новое пустое приложение, выберите вариант Серверное приложение (Server application).
  4. В учетных записях укажите пользователя, под которым работает служба сервера 1С, либо системную учетную запись.
  5. В созданное приложение добавьте нужную 32-битную DLL-библиотеку или компонент.

2. Создание каталогов Desktop для MS Excel:

Для работы Excel.Application под учетной записью службы на сервере Windows требуется вручную создать служебные папки профиля:

  1. Для 32-битного Excel: C:\Windows\SysWOW64\config\systemprofile\Desktop
  2. Для 64-битного Excel: C:\Windows\System32\config\systemprofile\Desktop
  3. Назначьте полные права доступа к этим папкам для учетной записи службы 1С.

Современные альтернативы использованию COM

Чтобы избежать проблем с разрядностью и зависимостью от операционной системы Windows, рекомендуется переходить на современные стандарты 1С:

  1. Для работы с файлами Excel: Используйте встроенный объект ТабличныйДокумент и его метод Прочитать() или Записать() с типом файла ТипФайлаТабличногоДокумента.XLSX. Это работает на любых платформах (включая Linux) без применения внешних COM-компонент.
  2. Для торгового оборудования: Переводите драйверы на стандарт Native API (внешние компоненты 1С), которые кроссплатформенны и одинаково успешно работают как в 32-битных, так и в 64-битных клиентах и серверах.
← На главную