Как исправить ошибку «Нет доступа к файлу» при открытии книги Excel по сети через COM на сервере 1С

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

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

«Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Нет доступа к файлу '\\server\share\file.xlsx'. Это может быть вызвано одной из следующих причин: имени файла или пути не существует; файл используется другой программой...»

При этом обычные текстовые файлы из той же сетевой папки читаются через ТекстовыйДокумент или ДвоичныеДанные без ошибок. Разберем по шагам, почему возникает эта проблема и как ее устранить.

Анализ причин возникновения проблемы

Проанализируем контекст выполнения серверного вызова. Служба сервера 1С:Предприятие по умолчанию запускается от имени локальной системной учетной записи (например, USR1CV8) в изолированной нулевой сессии Windows (Session 0). В таких условиях на работу офисного пакета Microsoft Excel накладывается ряд системных ограничений:

  1. Несоответствие разрядности сервера и пакета Office: Если на сервере установлен 64-разрядный агент 1С, вызов COM-объекта должен адресоваться к соответствующей 64-разрядной версии Microsoft Excel. При 32-разрядном Office компонент Microsoft Excel Application может отсутствовать в основной оснастке настройки DCOM.
  2. Ограничения DCOM и права запуска: Процесс EXCEL.EXE запускается в фоновом режиме без интерактивного рабочего стола. Если удостоверение компонента DCOM не сопоставлено с конкретным пользователем или заблокирован запуск, COM-сервер не может корректно авторизоваться на сетевых ресурсах.
  3. Режим защищенного просмотра (Protected View): По умолчанию Microsoft Excel блокирует или открывает в ограниченном режиме файлы, полученные из сети. Так как в серверном режиме модальные предупреждения отображаться не могут, процесс завершает операцию ошибкой доступа.
  4. Отсутствие прав на создание временных файлов: При вызове метода Open Excel пытается создать скрытый временный файл блокировки вида ~$file.xlsx в той же сетевой папке. Если у учетной записи есть только права на чтение, открытие завершится сбоем.

Шаг 1. Настройка разрядности и прав DCOM-компонента Microsoft Excel

Разберем порядок настройки прав в службе компонентов Windows. Это ключевой этап для корректной работы COM-объекта из-под учетной записи службы 1С:

  1. Убедимся, что разрядность установленного Microsoft Office совпадает с разрядностью сервера 1С (для 64-битного сервера 1С необходим 64-битный MS Office).
  2. Откроем оснастку: Панель управления → Администрирование → Службы компонентов (или выполним команду dcomcnfg).
  3. Перейдем по пути: Компьютеры → Мой компьютер → Настройка DCOM.
  4. Найдем в списке компонент Microsoft Excel Application и откроем его свойства.
  5. На вкладке Безопасность в блоках «Разрешения на запуск и активацию» и «Разрешения на доступ» выберем «Настроить» и предоставим полные права учетной записи, от имени которой запущена служба 1С (например, USR1CV8) и администраторам.
  6. На вкладке Удостоверение переключим переключатель в положение Указанный пользователь, укажем учетную запись администратора сервера (или выделенного пользователя с правами на сеть) и зададим пароль.
  7. Перезагрузим сервер для применения системных политик DCOM.

Шаг 2. Создание системных служебных каталогов Desktop

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

  1. Для 64-разрядных процессов: C:\Windows\System32\config\systemprofile\Desktop
  2. Для 32-разрядных процессов: C:\Windows\SysWOW64\config\systemprofile\Desktop

Предоставим учетной записи службы 1С полные права доступа к созданным каталогам Desktop.

Шаг 3. Настройка параметров безопасности сетевых папок в Excel

Чтобы Excel не блокировал файлы, открываемые по сетевым путям, настроим «Центр управления безопасностью»:

  1. Запустим Microsoft Excel под учетной записью, назначенной в удостоверении DCOM (или под пользователем службы).
  2. Перейдем в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью.
  3. В разделе Надежные расположения установим флаг Разрешить надежные расположения в моей сети.
  4. Нажмем Добавить новое расположение, укажем сетевой путь к общей папке (например, \\192.168.0.32\Share\) и отметим флаг Также доверять всем вложенным папкам.
  5. В разделе Защищенный просмотр снимем все флаги блокировки для файлов из интернета и сетевых расположений.

Шаг 4. Корректное освобождение COM-объектов в коде 1С

Посмотрим на пример кода, позволяющего открыть сетевую книгу Excel, корректно обработать ошибки и гарантированно выгрузить процесс EXCEL.EXE из памяти сервера:


&НаСервереБезКонтекста
Процедура ПрочитатьФайлExcelНаСервере(СетевойПутьКФайлу)
    
    Эксель = Неопределено;
    Книга = Неопределено;
    
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
        Эксель.DisplayAlerts = 0;
        Эксель.Visible = 0;
        
        // Открываем книгу в режиме только для чтения (параметр ReadOnly = Истина)
        Книга = Эксель.Workbooks.Open(СетевойПутьКФайлу, 0, Истина);
        
        // Выполняем чтение необходимых данных из книги
        Лист = Книга.Sheets(1);
        ЗначениеЯчейки = Лист.Cells(1, 1).Value;
        
    Исключение
        ВызватьИсключение "Ошибка при работе с Excel: " + ОписаниеОшибки();
    КонецПопытки;
    
    // Гарантированное закрытие книги и завершение процесса
    Если Книга <> Неопределено Тогда
        Книга.Close(Ложь);
        Книга = Неопределено;
    КонецЕсли;
    
    Если Эксель <> Неопределено Тогда
        Эксель.Quit();
        Эксель = Неопределено;
    КонецЕсли;
    
КонецПроцедуры

Альтернативный вариант: локальное копирование перед открытием

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


&НаСервереБезКонтекста
Процедура ОбработатьФайлЧерезВременныйКаталог(СетевойПутьКФайлу)
    
    ВременныйФайл = ПолучитьИмяВременногоФайла("xlsx");
    КопироватьФайл(СетевойПутьКФайлу, ВременныйФайл);
    
    Эксель = Новый COMОбъект("Excel.Application");
    Эксель.DisplayAlerts = 0;
    
    Попытка
        Книга = Эксель.Workbooks.Open(ВременныйФайл, 0, Истина);
        
        // Чтение данных
        
        Книга.Close(Ложь);
    Исключение
        Эксель.Quit();
        УдалитьФайлы(ВременныйФайл);
        ВызватьИсключение ОписаниеОшибки();
    КонецПопытки;
    
    Эксель.Quit();
    Эксель = Неопределено;
    
    УдалитьФайлы(ВременныйФайл);
    
КонецПроцедуры

Такой подход полностью исключает сетевые задержки при обработке ячеек и обходит ограничения встроенных сетевых политик Microsoft Office.

← На главную