Как исправить ошибку при выгрузке данных в Excel через COM-объект на сервере 1С?

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

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

Анализ проблемы: почему Excel «капризничает» на сервере

Первым делом проанализируем ситуацию. Когда мы запускаем 1С вручную (толстый или тонкий клиент), приложение выполняется в контексте нашего пользовательского сеанса. У нас есть рабочий стол, временные папки и загруженный профиль пользователя. Регламентное же задание выполняется службой «Агент сервера 1С:Предприятие». Эта служба чаще всего работает под специальной системной учетной записью (например, USR1CV8) или локальной системной учетной записью, у которой нет интерактивного окружения.

Проанализируем ключевой фрагмент кода, который вызывает затруднения:


Попытка
    Excel = Новый COMОбъект("Excel.Application");
    Excel.DisplayAlerts = 0;
    Excel.Visible = 0;
Исключение
    Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена"); 
    Возврат;
КонецПопытки; 

Если этот блок отрабатывает успешно, но ошибка возникает на этапе Excel.Workbooks.Open, значит, проблема кроется либо в правах доступа к файлу, либо в особенностях работы самого Excel в неинтерактивном режиме. Рассмотрим способы решения по порядку — от простых к сложным.

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

Выясним одну из самых неочевидных причин: Excel при запуске через COM-объект требует наличия папки Desktop в профиле пользователя, под которым запущена служба. Для системных служб Windows эти папки по умолчанию отсутствуют. Это классическая «фича» Microsoft Office, без которой объект не инициализируется должным образом в фоновом режиме.

Нам необходимо вручную создать следующие директории на сервере, где установлена 1С:

  1. Для 64-битных систем (обязательно): C:\Windows\SysWOW64\config\systemprofile\Desktop
  2. Для 32-битных систем (или для подстраховки на 64-битных): C:\Windows\System32\config\systemprofile\Desktop

Важный момент: после создания этих папок необходимо зайти в их свойства и предоставить полные права доступа (Full Control) пользователю, от имени которого запущена служба сервера 1С. Без этого Excel не сможет создать временные файлы, необходимые для открытия книги.

Способ 2. Настройка прав доступа к сетевым ресурсам

Разберем ситуацию с путями к файлам. В коде автора используется путь вида \\ivn-srv-25\d$\Buh_Base_8\Обработки\1.xlsx. Использование административных ресурсов (с символом $) — это плохая практика для серверных процессов. Рассмотрим почему:

Проверим доступность файла простым кодом, который не использует Excel, чтобы локализовать проблему:


Процедура ПроверитьДоступностьФайла()
    ТестовыйТекст = Новый ТекстовыйДокумент;
    ТестовыйТекст.ДобавитьСтроку("Проверка доступа из-под службы 1С");
    Попытка
        ТестовыйТекст.Записать("\\ivn-srv-25\Обмен\test.txt");
        Сообщить("Запись успешна");
    Исключение
        Сообщить("Ошибка доступа: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Если этот код выдает ошибку, значит, дело в правах NTFS или настройках сетевого доступа. Рекомендуем создать обычную общую папку (шару), дать права на уровне «Общего доступа» и на уровне «Безопасности» (NTFS) для пользователя службы 1С.

Способ 3. Конфигурация DCOM (Службы компонентов)

Если создание папок и проверка прав не помогли, необходимо настроить права на запуск самого приложения Excel через системную оснастку. Проанализируем шаги настройки:

  1. Нажмите Win + R, введите dcomcnfg и нажмите Enter.
  2. Перейдите по пути: Службы компонентов — Компьютеры — Мой компьютер — Настройка DCOM.
  3. Найдите в списке Microsoft Excel Application (или по его ID).
  4. Откройте «Свойства», перейдите на вкладку «Безопасность».
  5. В разделах «Права на запуск и активацию» и «Права на доступ» установите переключатель в положение «Настроить» и добавьте пользователя, под которым работает сервер 1С, наделив его всеми правами.
  6. На вкладке «Удостоверение» (Identity) попробуйте временно установить «Интерактивный пользователь», чтобы проверить, запустится ли процесс.

Способ 4. Интерактивная активация Excel

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

Чтобы это исключить, выполните следующие действия:

Рекомендуемый подход: отказ от COM в пользу нативных средств

Проанализируем современную практику разработки в 1С. Использование COM-объекта на сервере считается устаревшим и нестабильным методом («bad practice»). Excel не предназначен для работы на стороне сервера в многопоточном режиме. Вместо этого рассмотрим использование встроенного метода 1С, который работает гораздо быстрее и не требует установки Office на сервер.

Посмотрим на пример кода, который сохраняет данные в формате XLSX без использования COM:


// Создаем табличный документ
ТабДок = Новый ТабличныйДокумент;
// ... заполняем ТабДок данными ...

// Сохраняем напрямую в формат Excel 2007+
ПутьКФайлу = "\\ivn-srv-25\Exchange\Result.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Этот метод обладает рядом преимуществ:

Если вам необходимо именно дописывать данные в существующий файл, как в примере автора, рассмотрите использование внешних компонент (например, на базе библиотек OpenXML или ClosedXML) или предварительное чтение существующего файла в ТабличныйДокумент с последующей перезаписью. Это обеспечит бесперебойную работу ваших регламентных заданий даже после обновлений Windows или переезда на другой сервер.

← На главную