При разработке механизмов автоматической загрузки данных из файлов Excel в 1С часто возникает ситуация, когда код идеально работает в интерактивном режиме (на клиенте или сервере в обычном вызове), но завершается критической ошибкой -2147024891(0x80070005): Отказано в доступе при попытке выполнить его через фоновое или регламентное задание. Проанализируем причины этой проблемы и разберем по шагам все способы её решения.
Рассмотрим ситуацию: когда мы запускаем обработку вручную, код выполняется от имени текущего пользователя Windows, у которого, как правило, есть права на запуск приложений Microsoft Office и наличие рабочего стола (интерактивной сессии). Фоновое задание запускается на сервере от имени специальной системной учетной записи (обычно это USR1CV8), под которой работает служба сервера 1С:Предприятия. У этого пользователя по умолчанию нет прав на использование интерфейсных приложений через COM, а также отсутствуют необходимые пути в профиле для инициализации графического движка Excel.
// Ошибка возникает на этой строке:
Эксель = Новый COMObject("Excel.Application");
Первым делом нам необходимо предоставить пользователю USR1CV8 права на запуск и активацию приложения Excel. Рассмотрим, как это сделать через консоль настройки компонентов:
dcomcnfg.{00020812-0000-0000-C000-000000000046}).USR1CV8, предоставив ему полные права.Проанализируем вкладку "Удостоверение" подробнее. Если выбрано "Запускающий пользователь", а служба 1С работает под USR1CV8, Excel попытается создаться в сессии этого пользователя, которой не существует. Именно поэтому переключение на "Указанный пользователь" решает проблему в большинстве случаев.
Даже если права даны, Excel может выдавать ошибку, так как при старте он ищет папку Desktop в профиле пользователя, который его запускает. У системных учетных записей эти папки отсутствуют. Нам необходимо создать их вручную.
Разберем пути, которые нужно создать в зависимости от разрядности операционной системы и сервера 1С:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopВнимание: после создания папок убедимся, что у пользователя USR1CV8 (или того, что указан в DCOM) есть права "Полный доступ" на эти каталоги. Без этого Excel не сможет создать временные файлы при инициализации.
Посмотрим на ситуацию со стороны офисного пакета. При первом запуске Excel часто выводит окно приветствия, предложение активировать продукт или принять лицензионное соглашение. Фоновое задание не может нажать кнопку "ОК" в невидимом окне, и процесс просто "зависает" или сбрасывается по таймауту с ошибкой доступа.
Чтобы решить это, выполним следующие действия:
USR1CV8, если используется она).При написании кода для фонового задания крайне важно отключать все интерактивные сообщения самого Excel. Рассмотрим пример правильной инициализации объекта COM:
Попытка
Эксель = Новый COMObject("Excel.Application");
// Отключаем вывод предупреждений
Эксель.DisplayAlerts = Ложь;
// Запрещаем интерактивность (Excel не будет ждать ввода от пользователя)
Эксель.Interactive = Ложь;
// Делаем приложение невидимым (обязательно для сервера)
Эксель.Visible = Ложь;
Исключение
ЗаписьЖурналаРегистрации("Ошибка.ЗагрузкаПрайса",
УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось создать объект Excel: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Использование DisplayAlerts = Ложь предотвращает остановку процесса, если файл содержит битые ссылки или требует обновления связей при открытии.
Проанализируем надежность технологии. Использование COMObject("Excel.Application") на стороне сервера — это ресурсоемкая и зачастую нестабильная операция. Процессы EXCEL.EXE могут "подвисать" в памяти, потреблять много ресурсов и требовать сложной настройки прав, которую мы разобрали выше.
Если задача заключается только в чтении данных из файла .xlsx, рассмотрим более современные и быстрые способы, которые не требуют установки Microsoft Office на сервер и не зависят от прав DCOM:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Подведем итог: если использование COM неизбежно, последовательно выполним настройку прав пользователя в DCOM, создадим папки Desktop в профиле системы и убедимся, что Excel не выдает диалоговых окон при запуске. Если же есть возможность использовать встроенный метод Прочитать(), это станет лучшим решением для стабильной работы вашего фонового задания.