Как решить проблему с инициализацией Новый COMОбъект("Excel.Application") при запуске 1С через планировщик задач?

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

При автоматизации рутинных процессов в 1С разработчики часто прибегают к выгрузке или загрузке данных из файлов Microsoft Excel. Для этого традиционно используется COM-соединение. На локальном компьютере программиста код отрабатывает идеально, но при переносе решения на сервер и настройке автоматического запуска через планировщик задач (Task Scheduler) или регламентные задания фоновые процессы начинают аварийно завершаться на строке инициализации COM-объекта.

В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутренние механизмы операционной системы Windows и рассмотрим по шагам несколько эффективных способов решения проблемы.

Выясняем причину: изоляция сессии 0 (Session 0 Isolation)

Для того чтобы понять суть проблемы, проанализируем ситуацию с точки зрения безопасности операционной системы Windows Server. Начиная с версии Windows Server 2008, Microsoft внедрила строгую политику безопасности — изоляцию Сессии 0 (Session 0 Isolation).

Все службы Windows, а также процессы, запускаемые планировщиком задач в режиме «Выполнять вне зависимости от того, вошел ли пользователь в систему» (Run whether user is logged on or not), запускаются в неинтерактивной Сессии 0. В этой сессии физически отсутствует графический интерфейс (Desktop), а также привычное окружение пользователя (профиль, реестр, папки автозагрузки).

Программа Microsoft Excel изначально разрабатывалась как настольное (интерактивное) приложение. При запуске через Новый COMОбъект("Excel.Application") процесс EXCEL.EXE пытается инициализировать графическую оболочку, прочитать настройки принтера по умолчанию, обратиться к ветке реестра текущего пользователя и проверить наличие папки рабочего стола (Desktop). Не найдя этих компонентов в Сессии 0, процесс Excel либо аварийно завершается, либо «зависает» в памяти навсегда, потребляя ресурсы процессора.

Рассмотрим подробнее основные способы преодоления этой проблемы — от простых системных «костылей» до фундаментальной настройки безопасности DCOM.

Решение 1. Создание системных папок Desktop

Это самый быстрый и проверенный временем способ заставить Excel работать в фоновом режиме. Когда процесс инициализируется под системной учетной записью или в неинтерактивной сессии, он ищет папку Desktop в профиле системы. Если этой папки нет, инициализация прерывается.

Разберем по шагам, как решить эту проблему вручную:

  1. Откройте проводник на сервере, где выполняется задача планировщика.
  2. Перейдите по следующему пути для 64-разрядной версии операционной системы:
    C:\Windows\SysWOW64\config\systemprofile
  3. Проверьте, существует ли в этой папке каталог с именем Desktop. Если его нет, создайте папку вручную. Имя папки должно быть написано строго на английском языке с заглавной буквы.
  4. Теперь перейдите по пути для 32-разрядных процессов:
    C:\Windows\System32\config\systemprofile
  5. Создайте папку Desktop и здесь. Даже если ваша операционная система 64-битная, компоненты Microsoft Office или сама платформа 1С могут быть 32-битными, поэтому папка необходима в обоих каталогах.
  6. Важный нюанс: Нажмите правой кнопкой мыши на каждую из созданных папок Desktop, перейдите на вкладку «Безопасность» (Security) и предоставьте полные права (Full Control) той учетной записи, от имени которой запускается задача в планировщике задач Windows (или пользователю, под которым запущена служба сервера 1С:Предприятие).

После создания этих папок Excel получит фиктивный рабочий стол для своей инициализации, и COM-объект будет создаваться успешно.

Решение 2. Тонкая настройка компоненты DCOM (dcomcnfg)

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

Рассмотрим по шагам процесс настройки:

  1. Нажмите сочетание клавиш Win + R, введите команду dcomcnfg и нажмите Enter. Откроется консоль «Службы компонентов».
  2. Обратите внимание: Если у вас установлена 64-битная операционная система Windows, а пакет MS Office является 32-битным (очень распространенная ситуация), стандартная 64-битная консоль не отобразит Microsoft Excel в списке. В этом случае закройте консоль и запустите ее 32-битную версию через строку «Выполнить»:
    mmc comexp.msc /32
  3. В открывшемся окне перейдите по дереву каталогов: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  4. Найдите в списке элемент Microsoft Excel Application (в русскоязычной версии — «Приложение Microsoft Excel»). Нажмите на него правой кнопкой мыши и выберите «Свойства».
  5. Перейдите на вкладку «Безопасность» (Security):
    • В группе «Разрешения на запуск и активацию» установите переключатель в положение «Настроить» и нажмите кнопку «Изменить». Добавьте учетную запись пользователя, под которой работает служба планировщика или сервера 1С, и отметьте галочками пункты «Локальный запуск» и «Локальная активация».
    • В группе «Разрешения на доступ» также выберите «Настроить» -> «Изменить», добавьте этого пользователя и разрешите ему «Локальный доступ».
  6. Перейдите на вкладку «Удостоверение» (Identity). По умолчанию там активен пункт «Запускающий пользователь» (Launching user). В условиях планировщика это означает запуск от имени системных служб без профиля. Переключите настройку в положение «Указанный пользователь» (This user).
  7. Введите логин и пароль существующей учетной записи администратора сервера (или специально созданной служебной учетной записи). Под этой учетной записью необходимо предварительно зайти на сервер по RDP и хотя бы один раз запустить Excel вручную, чтобы пройти первоначальную настройку пакета Office (согласиться с лицензией, закрыть приветственные окна).

Этот шаг привязывает запуск COM-объекта Excel к конкретному пользователю, у которого гарантированно есть рабочий профиль в системе, что решает большинство проблем совместимости.

Решение 3. Настройка параметров планировщика задач Windows

Посмотрим на настройки самой задачи в Task Scheduler. Если вы запускаете батник, запускающий 1С, поведение системы сильно зависит от параметров безопасности задачи.

Проанализируем две стратегии настройки вкладки «Общие» (General):

  1. Интерактивный режим: Если в свойствах задачи выбрать опцию «Выполнять только при вошедшем в систему пользователе» (Run only when user is logged on). В этом случае задача будет запускаться в интерактивной сессии пользователя. Проблем с Excel не возникнет вообще, так как у процесса будет доступ к реальному рабочему столу. Недостаток метода: на сервере всегда должна быть активна (хотя бы заблокирована) сессия этого пользователя.
  2. Запуск под выделенной учетной записью: Если выбран режим «Выполнять вне зависимости от того, вошел ли пользователь», никогда не используйте встроенную системную учетную запись SYSTEM (Система). Настройте запуск задачи от имени специально созданного локального или доменного пользователя, входящего в группу администраторов сервера.

Решение 4. Обходной путь через интерактивную RDP-сессию

Если служба безопасности вашей компании наотрез отказывается вносить изменения в папки systemprofile и настраивать DCOM, можно прибегнуть к программному обходному пути.

Мы можем настроить автоматический вход пользователя в систему при старте сервера (Autologon), а запуск батника поместить в автозагрузку пользователя или в планировщик с признаком интерактивного выполнения. Это гарантирует, что 1С запустится в полноценном пользовательском сеансе со всеми правами на инициализацию графических интерфейсов Excel.

Решение 5. Устранение несовместимости разрядностей приложений

Еще одна неочевидная проблема кроется в разнице разрядностей 1С и Microsoft Office. Если сервер 1С работает под управлением 64-битного процесса, а на сервере установлен 32-битный MS Excel, прямой вызов Новый COMОбъект("Excel.Application") завершится ошибкой «Интерфейс не поддерживается».

Для исправления этой ситуации рекомендуется придерживаться правила: разрядность платформы 1С и пакета Microsoft Office на сервере должна совпадать. Если это невозможно, проблему совместимости разрядностей решают созданием COM+ приложения-обертки (через службу компонентов Windows), которое выступает в роли посредника (прокси) между 32-битным Excel и 64-битной платформой 1С.

Практические рекомендации по оптимизации кода 1С

Даже при успешной инициализации COM-объекта разработчики часто сталкиваются с проблемой «зависания» процессов EXCEL.EXE в диспетчере задач сервера. Это происходит из-за того, что 1С не освобождает ссылки на объекты Excel должным образом.

Рассмотрим пример правильного и безопасного написания кода для работы с COM-объектом в 1С:


Попытка
    Эксель = Новый COMОбъект("Excel.Application");
Исключение
    ЗаписьЖурналаРегистрации("Интеграция.Excel", 
        УровеньЖурналаРегистрации.Ошибка, , , 
        "Не удалось запустить Excel: " + ОписаниеОшибки());
    ВызватьИсключение "Ошибка инициализации COM-объекта Excel. Проверьте системные настройки.";
КонецПопытки;

Попытка
    // Делаем окно Excel невидимым для фонового режима
    Эксель.Visible = Ложь;
    Эксель.DisplayAlerts = Ложь; // Отключаем все предупреждения и диалоговые окна
    
    // Открываем книгу для работы
    Книга = Эксель.Workbooks.Open(ПутьКФайлу);
    Лист = Книга.Sheets(1);
    
    // Пример чтения данных
    ЗначениеЯчейки = Лист.Cells(1, 1).Value;
    
    // Закрываем книгу с сохранением изменений (или без)
    Книга.Close(Ложь);
Исключение
    // В случае ошибки обязательно пытаемся корректно закрыть Excel
    Если ЗначениеЗаполнено(Эксель) Тогда
        Эксель.Quit();
        Эксель = Неопределено;
    КонецЕсли;
    
    ЗаписьЖурналаРегистрации("Интеграция.Excel", 
        УровеньЖурналаРегистрации.Ошибка, , , 
        "Ошибка при обработке файла: " + ОписаниеОшибки());
    ВызватьИсключение ОписаниеОшибки();
КонецПопытки;

// Корректное завершение работы в штатном режиме
Эксель.Quit();
Эксель = Неопределено;

Важное правило: Обратите внимание, что в конце работы мы обязательно вызываем метод Quit() у объекта Excel, а затем явно присваиваем переменной значение Неопределено. Это гарантирует своевременное уничтожение COM-объекта в операционной системе и предотвращает утечку оперативной памяти на сервере.

Если ваша задача состоит исключительно в формировании файлов отчетов, рассмотрите возможность полного отказа от COM-технологий. Платформа 1С:Предприятие 8.3 обладает встроенными механизмами для сохранения табличных документов в формате XLSX без использования стороннего программного обеспечения:


ТабДок = Новый ТабличныйДокумент;
// Заполняем табличный документ данными...
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Этот метод работает на любой операционной системе (включая Linux-серверы), выполняется в разы быстрее, абсолютно стабилен в фоновом режиме и не требует установки Microsoft Office на сервере.

← На главную