Почему возникает ошибка доступа к файлу при загрузке из Excel в клиент-серверной базе на Linux и как её исправить?

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

Разберем ситуацию, с которой часто сталкиваются разработчики при переносе баз из файлового режима в клиент-серверный на ОС Linux. Суть проблемы проста: когда база работает на Windows, путь к файлу вроде C:\Docs\import.xlsx понятен операционной системе сервера. Однако при работе в модели «клиент-сервер» сервер 1С, работающий под Linux, физически не имеет доступа к локальным дискам вашего компьютера. Попытка обратиться к пути C:\... на стороне сервера неминуемо приведет к ошибке доступа.

Понимание причины ошибки

В архитектуре 1С:Предприятие клиентское приложение и сервер 1С — это разные сущности. Сервер 1С исполняет код в своей изолированной среде и не «видит» файловую систему вашего персонального компьютера. Когда вы пытаетесь передать серверу путь к файлу, сервер пытается найти этот путь в своей директории, где его, разумеется, нет. Для решения этой задачи необходимо изменить подход к передаче данных: вместо передачи пути к файлу, мы должны передать сами данные файла.

Решение проблемы: использование временного хранилища

Самым надежным и стандартизированным методом в современной платформе 1С является использование механизма временного хранилища. Мы помещаем файл с клиента во временное хранилище, передаем серверу адрес этого хранилища, а затем сервер самостоятельно получает данные и записывает их во временный файл в своей среде.

Пошаговая реализация загрузки файла

Рассмотрим процесс реализации на конкретном примере. Весь процесс делится на две основные части: клиентскую и серверную.

  1. Клиентская часть: Выбор файла пользователем и его «помещение» в память сервера.
  2. Серверная часть: Получение двоичных данных, их запись во временный файл и последующая обработка (чтение Excel).

Пример программного кода

Для начала работы на стороне клиента используем метод НачатьПомещениеФайла. Этот метод откроет диалог выбора файла, а после выбора отправит файл во временное хранилище 1С.


&НаКлиенте
Процедура ЗагрузитьДанные(Команда)    
    АдресФайлаВоВременномХранилище = "";    
    ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеЗавершение", ЭтотОбъект);
    НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаВоВременномХранилище, Объект.ВыбранноеИмяФайла,, УникальныйИдентификатор);    
КонецПроцедуры

После того как файл успешно помещен во временное хранилище, вызывается процедура завершения. В ней мы передаем полученный Адрес на сервер.


&НаКлиенте
Процедура ЗагрузитьДанныеЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Результат Тогда        
        ЗагрузитьДанныеНаСервере(Адрес, Файл.Расширение);
    КонецЕсли;    
КонецПроцедуры

Теперь самое важное — серверная часть. Здесь мы используем ПолучитьИзВременногоХранилища, чтобы превратить адрес в ДвоичныеДанные, и создаем временный файл средствами 1С.


&НаСервере
Процедура ЗагрузитьДанныеНаСервере(АдресФайлаВоВременномХранилище, Расширение)    
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
    ДвоичныеДанные.Записать(ИмяВременногоФайла);            
    
    // Выполняем действия с файлом, например, чтение
    Объект.табДокумент.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);    
    
    // Обязательно удаляем временный файл, чтобы не занимать место
    УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры

Важные рекомендации при работе с файлами на сервере

При использовании данной схемы следует учитывать несколько критических аспектов, чтобы ваша обработка работала стабильно и не вызывала проблем с производительностью:

Применяя этот подход, вы навсегда решите проблему «отсутствия доступа» к файлам, так как сервер больше не будет пытаться обращаться к файловой системе клиента, а будет работать с потоком данных, который вы ему предоставили через безопасный механизм временного хранилища.

← На главную