При работе в 1С через веб-браузер многие разработчики сталкиваются с ошибкой «Ошибка доступа к файлу». Эта ситуация возникает в тот момент, когда процедура на сервере пытается выполнить запись файла на локальный диск пользователя. Давайте разберем, почему так происходит и как правильно организовать процесс выгрузки данных.
Основная причина ошибки заключается в фундаментальном различии работы «толстого» клиента и веб-клиента. В веб-клиенте исполняемый код &НаСервере выполняется на компьютере, где установлен веб-сервер, а не на компьютере пользователя. Следовательно, когда вы пытаетесь записать файл по пути, выбранному через ДиалогВыбораФайла, сервер 1С пытается обратиться к несуществующему для него пути в локальной сети пользователя или не имеет прав доступа к указанной папке.
Сервер и клиент — это разные машины, и сервер ничего не «знает» о папках на вашем компьютере. Попытка использования метода ТабДок.Записать() на сервере с клиентским путем — это логическая ошибка, которую нужно исправлять через передачу данных между уровнями системы.
Чтобы успешно сохранить сформированный отчет (например, в формате Excel), мы должны разделить процесс на два этапа: подготовка данных на сервере и сохранение файла на стороне клиента.
Рассмотрим, как подготовить данные для скачивания. Вместо того чтобы сразу записывать файл, мы сохраняем его во временный файл и помещаем в хранилище:
&НаСервере
Функция ПодготовитьФайлНаСервере(ОбъектДанных)
ТабДок = СформироватьОтчет(ОбъектДанных);
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
Возврат Адрес;
КонецФункции
Метод ПоместитьВоВременноеХранилище возвращает строку (адрес), которую мы передаем на клиент. Это позволяет безопасно переместить сформированный документ через границу «клиент-сервер».
Теперь, когда у нас есть адрес файла в хранилище, мы можем инициировать его скачивание браузером. Для этого на клиенте используется процедура ПолучитьФайл:
&НаКлиенте
Процедура ВыгрузитьНажатие(Команда)
Адрес = ПодготовитьФайлНаСервере();
ПолучитьФайл(Адрес, "Отчет.xlsx", Истина);
КонецПроцедуры
Использование ПолучитьФайл позволяет вызвать стандартный диалог сохранения файла в браузере. Это самое простое и правильное решение, так как оно не требует сложной настройки расширений работы с файлами и корректно работает в любых современных веб-обозревателях.
C:\Users\..., если код выполняется на сервере.НачатьПолучениеФайлаССервера. Это современный стандарт для управляемых форм, который позволяет избежать блокировки интерфейса.ПолучитьФайл выполнить не может.Проанализировав ситуацию, можно сделать вывод: разделение вычислений и взаимодействия с файлами — ключ к стабильной работе веб-приложения на базе 1С. Придерживаясь этого подхода, вы навсегда избавитесь от ошибок доступа и обеспечите пользователям удобный инструмент для выгрузки отчетов.