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