При выполнении серверного кода или регламентных заданий разработчики часто сталкиваются с ошибкой доступа при вызове метода Записать() у объекта ТабличныйДокумент. Текст ошибки обычно выглядит следующим образом:
Ошибка при вызове метода контекста (Записать) по причине: Ошибка доступа к файлу -2147287035(0x80030005): Отказано в доступе.
Выясним причину возникновения этой проблемы и разберем по шагам рабочие способы её решения в среде Linux.
Когда сохранение выполняется на сервере (особенно в регламентных и фоновых заданиях, где отсутствует клиентский контекст), запись файла происходит от имени системной учетной записи, под которой запущен рабочий процесс сервера 1С (обычно это usr1cv8). Ошибка доступа чаще всего вызвана одной из следующих причин:
D:\export\file.xls) на сервере Linux приводит к тому, что платформа 1С пытается сопоставить этот путь с текущим рабочим каталогом процесса. В результате путь искажается или обрезается, вызывая системную ошибку 0x80030005.usr1cv8: Каталог записи может иметь права для пользователей Windows или Samba, но быть недоступным для чтения и записи системной учетной записи 1С в самой ОС Linux.XLS (Excel 97–2003) требует формирования двоичного OLE-контейнера. На платформе Linux создание OLE-структур файловой системы может блокироваться операционной системой при отсутствии прав на временные дескрипторы.Рассмотрим надежный паттерн разработки, который позволяет обойти проблемы с прямым созданием файлов в расшаренных или монтированных каталогах. Сначала сохраняем табличный документ во временную папку сервера с помощью КаталогВременныхФайлов(), а затем перемещаем его командой ПереместитьФайл().
Разберем пример кода для серверного модуля:
ИмяФайлаВоВременномКаталоге = КаталогВременныхФайлов() + "export_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "") + ".xlsx";
// Записываем табличный документ во временный каталог сервера
ТабДокумент.Записать(ИмяФайлаВоВременномКаталоге, ТипФайлаТабличногоДокумента.XLSX);
// Указываем итоговый путь в POSIX-формате Linux
ЦелевойПуть = "/var/export/Файл.xlsx";
// Перемещаем файл в целевой каталог
ПереместитьФайл(ИмяФайлаВоВременномКаталоге, ЦелевойПуть);
Этот подход гарантирует, что у процесса 1С гарантированно будут права на создание файла во временном каталоге ОС, а операции файлового обмена пройдут корректно.
Если код выполняется на сервере Linux, пути к каталогам должны соответствовать стандартам POSIX (начинаться с системного корня /):
/mnt/share/export/file.xlsx или /var/export/file.xlsx.usr1cv8):
chown -R usr1cv8:grp1cv8 /var/export/
chmod -R 775 /var/export/
cifs-utils с явным указанием прав доступа для пользователя 1С (параметры uid и gid при монтировании в /etc/fstab).Посмотрим на выбор формата файла. Формат ТипФайлаТабличногоДокумента.XLS устарел и опирается на сложную структуру Compound File Binary Format. На Linux-серверах рекомендуется использовать формат XLSX (ТипФайлаТабличногоДокумента.XLSX).
Выгрузка в XLSX выполняется платформой через стандартное формирование ZIP-архива с XML-структурой. Это работает быстрее, более отказоустойчиво на не-Windows платформах и не вызовет ошибок OLE-хранилища.