При выполнении серверного кода в 1С:Предприятии разработчики нередко сталкиваются с ситуацией, когда COM-объект Excel.Application успешно создается, локальные файлы открываются без сбоев, но при попытке открыть книгу Excel из сетевого каталога (UNC-пути) возникает исключение:
«Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Нет доступа к файлу '\\server\share\file.xlsx'. Это может быть вызвано одной из следующих причин: имени файла или пути не существует; файл используется другой программой...»
При этом обычные текстовые файлы из той же сетевой папки читаются через ТекстовыйДокумент или ДвоичныеДанные без ошибок. Разберем по шагам, почему возникает эта проблема и как ее устранить.
Проанализируем контекст выполнения серверного вызова. Служба сервера 1С:Предприятие по умолчанию запускается от имени локальной системной учетной записи (например, USR1CV8) в изолированной нулевой сессии Windows (Session 0). В таких условиях на работу офисного пакета Microsoft Excel накладывается ряд системных ограничений:
Microsoft Excel Application может отсутствовать в основной оснастке настройки DCOM.EXCEL.EXE запускается в фоновом режиме без интерактивного рабочего стола. Если удостоверение компонента DCOM не сопоставлено с конкретным пользователем или заблокирован запуск, COM-сервер не может корректно авторизоваться на сетевых ресурсах.Open Excel пытается создать скрытый временный файл блокировки вида ~$file.xlsx в той же сетевой папке. Если у учетной записи есть только права на чтение, открытие завершится сбоем.Разберем порядок настройки прав в службе компонентов Windows. Это ключевой этап для корректной работы COM-объекта из-под учетной записи службы 1С:
dcomcnfg).USR1CV8) и администраторам.Для корректной инициализации неинтерактивного процесса Excel требуются папки профиля рабочего стола. Если их нет, создадим их вручную:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopПредоставим учетной записи службы 1С полные права доступа к созданным каталогам Desktop.
Чтобы Excel не блокировал файлы, открываемые по сетевым путям, настроим «Центр управления безопасностью»:
\\192.168.0.32\Share\) и отметим флаг Также доверять всем вложенным папкам.Посмотрим на пример кода, позволяющего открыть сетевую книгу 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.