Почему сервер 1С на Linux не видит путь к файлу на компьютере пользователя и как это исправить?

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

Часто при переносе разработки из файловой базы в клиент-серверный вариант (SQL) или при развертывании сервера 1С на операционной системе Linux разработчики сталкиваются с ошибкой доступа к файлам. Ситуация выглядит так: пользователь выбирает файл на своем рабочем столе, а сервер, работающий на Linux, выдает ошибку, так как пытается найти диск C:\ в своей файловой системе. Давайте разберемся, почему так происходит и как правильно организовать передачу файла.

Суть проблемы: архитектурное разделение

Основная причина ошибки кроется в непонимании того, где именно исполняется программный код. В 1С существует разделение на клиент (компьютер пользователя) и сервер (мощный компьютер, где работает служба 1С). Когда вы вызываете ДиалогВыбораФайла, этот диалог открывается на компьютере пользователя и возвращает строку с путем к файлу в формате Windows (например, C:\Users\User\Desktop\file.xlsx).

Когда вы передаете эту строку на сервер, сервер пытается найти файл C:\... по этому пути у себя на диске. Очевидно, что в Linux нет диска C:, а файлы пользователя находятся на его локальном компьютере, а не в «облаке» сервера. Это типичная ошибка, возникающая при переносе кода из файлового варианта, где клиент и сервер — это один и тот же компьютер.

Как правильно передать файл на сервер

Чтобы сервер мог поработать с файлом, его необходимо физически передать с компьютера пользователя в оперативную память сервера или во временную папку сервера. Для этого используется механизм временного хранилища. Рассмотрим процесс по шагам.

  1. Выбор файла на клиенте: Используем ДиалогВыбораФайла для получения пути к файлу на стороне клиента.
  2. Помещение файла во временное хранилище: Используем метод ПоместитьФайл или НачатьПомещениеФайла. Этот метод берет файл с клиента, передает его содержимое через сеть на сервер и помещает в специальное хранилище, возвращая нам адрес (строку), по которой сервер может этот файл забрать.
  3. Обработка на сервере: Передаем полученный адрес в процедуру на сервере, где с помощью метода ПолучитьИзВременногоХранилища или ПолучитьФайлИзВременногоХранилища мы можем получить данные файла или записать их во временный файл на диске сервера.

Пример правильной реализации

Рассмотрим, как должен выглядеть код для корректной загрузки данных. Мы разделим работу на две части: клиентскую и серверную.

Шаг 1: Клиентский код


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

Шаг 2: Серверный код


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

Важные замечания

При работе в среде Linux следует учитывать следующие особенности:

Используя этот подход, вы обеспечите корректную работу вашей обработки как в файловом, так и в клиент-серверном варианте, независимо от операционной системы, установленной на сервере.

← На главную