Как выгрузить файл из 1С на локальный ПК при работе через веб-сервер?

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

Работа в веб-клиенте 1С кардинально отличается от работы в классическом тонком или толстом клиенте. Многие разработчики сталкиваются с тем, что привычный код, который отлично отрабатывал на собственном сервере, при переходе на веб-сервер начинает выдавать ошибки типа «Файл не обнаружен» или «Неправильный путь к файлу». Давайте разберемся, почему это происходит и как правильно организовать выгрузку файлов для пользователя.

Почему не работает сохранение по пути C:\...?

При использовании веб-клиента браузер работает в так называемой «песочнице». Это строгие ограничения безопасности, которые не позволяют коду 1С, исполняемому на стороне сервера, напрямую обращаться к файловой системе компьютера пользователя. Когда вы пишете путь вида C:\Users\User\Desktop\..., сервер 1С пытается найти этот путь у себя, а не на вашем компьютере. Поскольку на сервере такого пути, как правило, нет, возникает ошибка.

Разбираем алгоритм правильной передачи файла

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

  1. Формируем данные файла (например, объект ТекстовыйДокумент или ДвоичныеДанные) на стороне сервера.
  2. Помещаем эти данные во временное хранилище с помощью метода ПоместитьВоВременноеХранилище.
  3. На стороне клиента вызываем метод ПолучитьФайл, передавая адрес из хранилища.
  4. Позволяем браузеру открыть стандартное диалоговое окно «Сохранить как», чтобы пользователь сам выбрал путь для сохранения.

Реализация решения на практике

Рассмотрим по шагам, как написать этот код правильно. Сначала создадим серверную функцию, которая подготавливает файл, а затем — клиентскую процедуру, которая «забирает» его к пользователю.

Шаг 1: Подготовка данных на сервере

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


&НаСервере
Процедура ПолучитьДанныеФайла(АдресФайла, ПутьКФайлуНаСервере, РезультатПоискаФайла = "") Экспорт 
    МассивФайлов = НайтиФайлы(ПутьКФайлуНаСервере);    
    Если МассивФайлов.Количество() > 0 Тогда    
        ПутьФайла = МассивФайлов[0].ПолноеИмя;    
        Попытка        
            ДанныеФайла = Новый ДвоичныеДанные(ПутьФайла);        
            ПоместитьВоВременноеХранилище(ДанныеФайла, АдресФайла);        
        Исключение        
            АдресФайла = Неопределено;
            РезультатПоискаФайла = " Не удалось прочитать файл на сервере!";
        КонецПопытки;
    Иначе
        АдресФайла = Неопределено;
        РезультатПоискаФайла = " На сервере не найден файл " + ПутьКФайлуНаСервере + "!";        
    КонецЕсли;
КонецПроцедуры

Шаг 2: Клиентская обработка сохранения

На клиенте мы используем полученный адрес для инициирования загрузки. Мы не указываем жесткий путь, а передаем имя файла, которое будет предложено пользователю по умолчанию.


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

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

Помните о следующих нюансах:

Используя этот подход, вы избавитесь от ошибок «Путь не найден» и обеспечите пользователям удобный механизм получения отчетов и выгрузок в веб-интерфейсе 1С. Если вы планируете массовую выгрузку, реализуйте логику последовательного вызова ПолучитьФайл для каждого объекта, либо упаковывайте файлы в ZIP-архив на сервере и скачивайте одним файлом.

← На главную