Почему при программном открытии Excel в 1С возникает ошибка и процесс запускается под другим пользователем?

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

При выгрузке или загрузке данных через COM-объект Excel.Application разработчики часто сталкиваются с ситуацией, когда строка кода ExcelПриложение = Новый COMОбъект("Excel.Application"); завершается с ошибкой. При этом в диспетчере задач сервера процесс excel.exe появляется не у текущего пользователя, а у другого разработчика или администратора, работающего на той же машине.

Рассмотрим подробно причины возникновения такой проблемы в многопользовательской серверной среде и разберем по шагам проверенные способы ее решения.

Анализ причины возникновения ошибки

Проанализируем ситуацию, которая происходит на терминальном сервере под управлением Windows. Ошибка и некорректное распределение процессов вызываются следующими факторами:

  1. Настройки компонента DCOM по умолчанию: В операционной системе Windows для компонента Microsoft Excel по умолчанию может быть задан параметр удостоверения «Интерактивный пользователь» (Interactive User). На терминальном сервере это приводит к тому, что запрос на создание COM-объекта направляется в сеанс того пользователя, чья сессия в данный момент считается активной. В результате файл excel.exe фоново запускается в чужой учетной записи.
  2. Зависшие фоновые процессы: Если при предыдущих запусках обработка аварийно завершилась до вызова метода закрытия или свойства ExcelПриложение.Visible = Истина, процесс excel.exe остается «висеть» в памяти. При повторных попытках обращения он блокирует инициализацию новых объектов.
  3. Неявный переход на сервер: В управляемых формах вызов создания COM-объекта из модуля формы может случайно произойти в серверном контексте (например, внутри процедуры с директивой &НаСервере). В этом случае объект пытается создаться от имени учетной записи службы «1С:Предприятие».

Способ 1. Завершение зависших процессов Excel

Разберем первоочередные действия при возникновении сбоя. Если процесс ранее не завершился корректно, его необходимо снять из памяти сервера.

  1. Откройте Диспетчер задач (Task Manager) на сервере.
  2. Перейдите на вкладку Подробности (Details) или Процессы (Processes).
  3. Найдите все запущенные процессы excel.exe и завершите их.

Для предотвращения подобных ситуаций в коде 1С всегда используйте блок Попытка ... Исключение и гарантированно закрывайте приложение в секции очистки ресурсов:


&НаКлиенте
Процедура БезопаснаяРаботаСExcel()
    ExcelПриложение = Неопределено;
    Попытка
        ExcelПриложение = Новый COMОбъект("Excel.Application");
        ExcelПриложение.Visible = Ложь;
        
        // Выполнение необходимых операций с файлом
        
        ExcelПриложение.Quit();
        ExcelПриложение = Неопределено;
    Исключение
        Если ExcelПриложение <> Неопределено Тогда
            ExcelПриложение.Quit();
            ExcelПриложение = Неопределено;
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Способ 2. Настройка параметров DCOM в Windows

Чтобы заставить операционную систему запускать Excel строго от имени того пользователя, который инициировал вызов из 1С, настроим службу DCOM на сервере.

  1. Нажмите сочетание клавиш Win + R и введите команду dcomcnfg (если используется 32-битный Microsoft Office на 64-разрядной ОС Windows, запускайте консоль командой comexp.msc /32).
  2. Перейдите по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  3. В списке компонентов найдите Microsoft Excel Application и откройте его свойства через контекстное меню.
  4. Перейдите на вкладку Удостоверение (Identity).
  5. Переключите переключатель с положения «Интерактивный пользователь» на «Запускающий пользователь» (The launching user).
  6. Нажмите Применить и OK.

После сохранения этих настроек процесс excel.exe будет формироваться строго под учетной записью того пользователя Windows, который выполнил запуск обработки в 1С.

Способ 3. Контроль контекста исполнения (&НаКлиенте)

Выясним, где именно должен создаваться COM-объект. Создание объектов Microsoft Office крайне не рекомендуется выполнять на стороне сервера 1С.

Убедитесь, что функция или процедура, вызывающая Новый COMОбъект("Excel.Application"), имеет директиву компиляции &НаКлиенте:


&НаКлиенте
Процедура ОткрытьФайлНаКлиенте()
    #Если Клиент Тогда
        ТаблицаExcel = Новый COMОбъект("Excel.Application");
        // Работа с объектом на стороне клиента
    #КонецЕсли
КонецПроцедуры

Способ 4. Создание системных папок профиля (для работы на сервере)

Если специфика задачи требует создания COM-объекта именно на стороне сервера (например, в фоновом задании), необходимо предусмотреть наличие папок профиля для системного окружения. Без них 64-разрядная ОС Windows блокирует запуск Excel в неинтерактивном режиме.

  1. Создайте каталог: C:\Windows\System32\config\systemprofile\Desktop
  2. Создайте каталог: C:\Windows\SysWOW64\config\systemprofile\Desktop
  3. Предоставьте полный доступ к этим папкам для учетной записи, от имени которой запущен служба сервера 1С (например, USR1CV8).

Альтернативные способы работы с файлами Excel без COM-объекта

Поскольку автоматизация Microsoft Excel через COM имеет официальные ограничения от Microsoft и часто вызывает подвисание процессов на серверах, рассмотрим более надежные альтернативные решения.

1. Использование встроенного объекта «ТабличныйДокумент»

Платформа 1С позволяет читать и сохранять файлы форматов .xlsx и .xls штатными средствами. Этот способ не требует установки Excel на сервер или клиентский ПК и одинаково стабильно работает в любом контексте:


// Чтение файла XLSX без использования Excel
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Files\Data.xlsx");

// Сохранение табличного документа в XLSX
ТабДок.Записать("C:\Files\Output.xlsx", ТипФайлаТабличногоДокумента.XLSX);

2. Использование технологии ADO / OLE DB

Если необходимо быстро прочитать данные из файла Excel большого объема, можно обращаться к нему как к базе данных через `ADODB.Connection`. Это работает значительно быстрее COM-автоматизации и не запускает процесс `excel.exe`.

← На главную