Работа с COM-объектами Microsoft Office в фоновых заданиях 1С часто сопровождается труднодиагностируемыми ошибками. Основная проблема заключается в том, что регламентное задание выполняется в неинтерактивной сессии (Session 0) под учетной записью службы сервера 1С. В таких условиях любые диалоговые окна, запросы подтверждения безопасности или проблемы с доступом к сетевым ресурсам приводят к тому, что процесс EXCEL.EXE «зависает», ожидая ответа пользователя, которого нет перед монитором.
Рассмотрим подробно причины возникновения этой ситуации и разберем проверенные способы решения проблемы.
Проанализируем типичную ситуацию: код регламентного задания пытается открыть файл напрямую из сетевой папки, например \\server\folder\file.xlsx. Даже если служба сервера 1С запущена под доменным пользователем с полными правами, Microsoft Excel при открытии документа из сети часто выдает предупреждение безопасности (Protected View) или сообщение о том, что файл доступен только для чтения. В фоновом режиме это окно блокирует выполнение кода.
Решение: Перед открытием файла через COM-объект необходимо скопировать его из сетевого каталога в локальную временную папку на сервере 1С. Разберем, как это реализовать программно:
// Сначала найдем файлы в сетевом каталоге
НайденныеФайлы = НайтиФайлы(КаталогСетевой, "*.xlsx");
Для Каждого ТекФайл Из НайденныеФайлы Цикл
// Формируем путь к временному локальному файлу
ЛокальныйПуть = ПолучитьИмяВременногоФайла("xlsx");
// Копируем файл из сети на локальный диск сервера
КопироватьФайл(ТекФайл.ПолноеИмя, ЛокальныйПуть);
// Работаем с локальной копией через COM
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = Ложь; // Подавляем лишние сообщения
Попытка
Книга = Excel.Workbooks.Open(ЛокальныйПуть);
// ... выполняем чтение данных ...
Книга.Close(Ложь);
Исключение
// Обработка ошибок
КонецПопытки;
Excel.Quit();
Excel = 0;
// Удаляем временный файл после обработки
УдалитьФайлы(ЛокальныйПуть);
КонецЦикла;
Для корректной инициализации COM-интерфейса Excel требует наличия определенных папок в профиле пользователя, под которым работает служба. Если этих папок нет, Excel может зависнуть на этапе создания объекта Excel.Application.
Выясним, какие папки необходимо создать вручную на сервере (для 64-битных систем):
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopВажно убедиться, что у пользователя, под которым запущен Агент сервера 1С:Предприятие, есть права на чтение и запись в эти каталоги. Это критически важно для работы графических компонентов Office в фоновом режиме.
Даже при работе с локальными файлами Excel может попытаться вывести запрос о сохранении изменений, обновлении связей или проверке орфографии. Рассмотрим основные свойства, которые необходимо установить сразу после инициализации объекта Excel.Application, чтобы минимизировать риск блокировки потока:
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь; // Отключаем вывод предупреждений
Excel.AskToUpdateLinks = Ложь; // Не запрашивать обновление связей
Excel.EnableEvents = Ложь; // Отключаем макросы и события
Excel при запуске всегда пытается инициализировать принтер по умолчанию для расчета областей печати. Если в профиле пользователя службы сервера 1С нет ни одного установленного принтера, процесс может войти в бесконечный цикл ожидания. Рекомендуем установить в системе любой виртуальный принтер (например, Microsoft XPS Document Writer) и назначить его основным для этой учетной записи.
Также стоит проверить настройки в утилите dcomcnfg (Службы компонентов). Для компонента Microsoft Excel Application на вкладке «Удостоверение» (Identity) лучше явно указать данные пользователя (This user), под которым работает сервер 1С, вместо значения «Интерактивный пользователь».
Важно понимать, что компания Microsoft официально не рекомендует использовать Office на стороне сервера. Если задача сводится к простому чтению данных из XLSX, проанализируем более стабильные способы, встроенные в платформу 1С:
ТабличныйДокумент: Начиная с версии 8.3.6, платформа позволяет читать файлы Excel напрямую методом Прочитать(). Это работает на сервере без установленного Microsoft Office и исключает проблемы с зависанием процессов.Применение метода с предварительным копированием файла и настройкой системных папок Desktop в большинстве случаев полностью устраняет «зависание» регламентного задания и обеспечивает стабильную выгрузку данных.