При разработке механизмов интеграции часто возникает ситуация: обработка выгрузки в Excel идеально работает на локальном компьютере программиста, но при запуске в составе регламентного задания на сервере 1С выдает ошибку. Проблема усложняется тем, что даже под правами администратора COMОбъект("Excel.Application") может отказываться инициализироваться или открывать файлы. В этой статье мы подробно разберем причины такого поведения и рассмотрим проверенные способы решения этой технической задачи.
Первым делом проанализируем ситуацию. Когда мы запускаем 1С вручную (толстый или тонкий клиент), приложение выполняется в контексте нашего пользовательского сеанса. У нас есть рабочий стол, временные папки и загруженный профиль пользователя. Регламентное же задание выполняется службой «Агент сервера 1С:Предприятие». Эта служба чаще всего работает под специальной системной учетной записью (например, USR1CV8) или локальной системной учетной записью, у которой нет интерактивного окружения.
Проанализируем ключевой фрагмент кода, который вызывает затруднения:
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки;
Если этот блок отрабатывает успешно, но ошибка возникает на этапе Excel.Workbooks.Open, значит, проблема кроется либо в правах доступа к файлу, либо в особенностях работы самого Excel в неинтерактивном режиме. Рассмотрим способы решения по порядку — от простых к сложным.
Выясним одну из самых неочевидных причин: Excel при запуске через COM-объект требует наличия папки Desktop в профиле пользователя, под которым запущена служба. Для системных служб Windows эти папки по умолчанию отсутствуют. Это классическая «фича» Microsoft Office, без которой объект не инициализируется должным образом в фоновом режиме.
Нам необходимо вручную создать следующие директории на сервере, где установлена 1С:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopВажный момент: после создания этих папок необходимо зайти в их свойства и предоставить полные права доступа (Full Control) пользователю, от имени которого запущена служба сервера 1С. Без этого Excel не сможет создать временные файлы, необходимые для открытия книги.
Разберем ситуацию с путями к файлам. В коде автора используется путь вида \\ivn-srv-25\d$\Buh_Base_8\Обработки\1.xlsx. Использование административных ресурсов (с символом $) — это плохая практика для серверных процессов. Рассмотрим почему:
Проверим доступность файла простым кодом, который не использует Excel, чтобы локализовать проблему:
Процедура ПроверитьДоступностьФайла()
ТестовыйТекст = Новый ТекстовыйДокумент;
ТестовыйТекст.ДобавитьСтроку("Проверка доступа из-под службы 1С");
Попытка
ТестовыйТекст.Записать("\\ivn-srv-25\Обмен\test.txt");
Сообщить("Запись успешна");
Исключение
Сообщить("Ошибка доступа: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если этот код выдает ошибку, значит, дело в правах NTFS или настройках сетевого доступа. Рекомендуем создать обычную общую папку (шару), дать права на уровне «Общего доступа» и на уровне «Безопасности» (NTFS) для пользователя службы 1С.
Если создание папок и проверка прав не помогли, необходимо настроить права на запуск самого приложения Excel через системную оснастку. Проанализируем шаги настройки:
Win + R, введите dcomcnfg и нажмите Enter.Посмотрим на ситуацию со стороны лицензирования. Excel при первом запуске может выводить окна активации, выбора формата файлов или приветственные заставки. В режиме регламентного задания эти окна невидимы, они блокируют поток выполнения, и 1С получает ошибку по таймауту или отказу в доступе.
Чтобы это исключить, выполните следующие действия:
Проанализируем современную практику разработки в 1С. Использование COM-объекта на сервере считается устаревшим и нестабильным методом («bad practice»). Excel не предназначен для работы на стороне сервера в многопоточном режиме. Вместо этого рассмотрим использование встроенного метода 1С, который работает гораздо быстрее и не требует установки Office на сервер.
Посмотрим на пример кода, который сохраняет данные в формате XLSX без использования COM:
// Создаем табличный документ
ТабДок = Новый ТабличныйДокумент;
// ... заполняем ТабДок данными ...
// Сохраняем напрямую в формат Excel 2007+
ПутьКФайлу = "\\ivn-srv-25\Exchange\Result.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Этот метод обладает рядом преимуществ:
Excel.exe.Если вам необходимо именно дописывать данные в существующий файл, как в примере автора, рассмотрите использование внешних компонент (например, на базе библиотек OpenXML или ClosedXML) или предварительное чтение существующего файла в ТабличныйДокумент с последующей перезаписью. Это обеспечит бесперебойную работу ваших регламентных заданий даже после обновлений Windows или переезда на другой сервер.