При разработке механизмов загрузки или выгрузки данных в формате Excel программисты 1С часто сталкиваются с ситуацией, когда код идеально работает в файловой базе или на локальной машине разработчика, но выдает критическую ошибку при переносе на сервер. Ошибка «Произошла исключительная ситуация (Microsoft Office Excel): Нет доступа к файлу...» может поставить в тупик, так как файл физически существует, и права на него вроде бы предоставлены. Разберем детально, почему это происходит и как настроить систему для корректной работы.
Первым делом проанализируем код, который вызывает ошибку. В типовом сценарии программист пытается программно создать файл из макета и тут же открыть его через COMОбъект:
ЭтотОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Макет = ЭтотОбработкаОбъект.ПолучитьМакет("МакетШаблонИксел");
Макет.Записать(Путь);
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Книга = Excel.WorkBooks.Open(Путь);
Проблема заключается в том, что в клиент-серверной архитектуре 1С код может выполняться либо на Клиенте (под учетной записью текущего пользователя Windows), либо на Сервере (под учетной записью службы 1С, например, USR1CV8). Если выполнение происходит в процедуре с директивой &НаСервере, то возникают следующие нюансы:
C:\Users\КазаковБВ\Downloads\ — это локальный путь в профиле конкретного пользователя. Серверная служба 1С «не видит» папку Downloads этого пользователя или не имеет прав на вход в его личный профиль, даже если вы дали права «Все» на саму папку.Самый простой и эффективный способ, если бизнес-логика позволяет, — выполнять работу с Excel на стороне клиента. Рассмотрим, как это сделать. Мы разделяем логику: на сервере получаем двоичные данные макета, а на клиенте сохраняем их во временный файл и открываем через COM.
Проанализируем пример кода:
&НаКлиенте
Процедура ВыполнитьОбработкуФайла()
// Получаем данные макета с сервера
ДанныеФайла = ПолучитьМакетНаСервере();
// Определяем временный путь на локальной машине
ПутьКФайлу = КаталогВременныхФайлов() + "temp_excel.xlsx";
ДанныеФайла.Записать(ПутьКФайлу);
Попытка
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.WorkBooks.Open(ПутьКФайлу);
// ... дальнейшая работа с книгой
Исключение
Предупреждение("Ошибка при работе с Excel: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот подход снимает все вопросы с правами доступа к папкам сервера, так как Excel запускается под тем же пользователем, который работает в 1С.
Если работу необходимо выполнить строго на сервере (например, в регламентном задании), нужно подготовить окружение для Microsoft Excel. Выясним причину: Excel при запуске требует наличия папки Desktop в профиле пользователя, под которым запущена служба 1С.
Разберем по шагам, что нужно сделать администратору сервера:
Desktop по следующим путям:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopUSR1CV8), предоставив ему Полный доступ.Без этой папки Excel часто выдает ту самую неинформативную ошибку о «занятости файла» или «отсутствии доступа».
Иногда прав на файловую систему недостаточно, так как блокировка происходит на уровне активации COM-компонента. Проанализируем настройку службы компонентов:
dcomcnfg (Win+R -> dcomcnfg).USR1CV8 есть права на запуск на вкладке Безопасность.Никогда не используйте жестко прописанные пути вроде C:\Users\... в серверном коде. Выясним, как правильно работать с путями. Для записи временных данных используйте функцию КаталогВременныхФайлов(), которая на сервере вернет путь к временной папке службы 1С.
Посмотрим на пример правильной записи файла на сервере:
// Правильное получение пути на сервере
ПутьДляЗаписи = КаталогВременныхФайлов() + "отчет.xlsx";
Макет.Записать(ПутьДляЗаписи);
// Обязательно проверяем, создался ли файл
ФайлНаДиске = Новый Файл(ПутьДляЗаписи);
Если НЕ ФайлНаДиске.Существует() Тогда
ВызватьИсключение "Не удалось создать файл на сервере по пути: " + ПутьДляЗаписи;
КонецЕсли;
Рассмотрим наиболее современный и стабильный способ решения проблемы. Microsoft официально не рекомендует использовать автоматизацию Office (COM) на стороне сервера. Вместо этого в 1С можно использовать встроенный объект ТабличныйДокумент, который умеет сохранять данные в формат XLSX напрямую.
Проанализируем пример сохранения без использования Excel:
ТабДок = Новый ТабличныйДокумент;
// ... заполняем таблицу данными ...
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Преимущества этого метода:
excel.exe в памяти сервера.Выяснив причину ошибки «Нет доступа к файлу», мы понимаем, что она почти всегда сводится к несоответствию контекста выполнения. Если вам нужно быстрое решение — перенесите код на &НаКлиенте. Если задача требует строго серверного выполнения — создайте папку Desktop в системном профиле и используйте КаталогВременныхФайлов(). Но самым надежным архитектурным решением будет отказ от COM в пользу встроенных средств 1С для работы с файлами .xlsx.