Как загрузить файл на сервер в веб-клиенте 1С без установки расширения для работы с файлами?

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

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

Выясним причину требования расширения браузера

Код управляемого приложения в веб-клиенте исполняется внутри изолированной среды браузера (Sandbox). Браузер из соображений безопасности блокирует прямой программный доступ JavaScript к локальной файловой системе пользователя. Платформа 1С запрашивает установку расширения только в тех случаях, когда код пытается:

  1. Напрямую обратиться к локальным путям на диске через объект Файл или метод НайтиФайлы.
  2. Программно сохранить файл по строго заданному локальному пути на клиенте без участия пользователя.
  3. Проверить существование локального файла до его выбора.
  4. Использовать устаревшие синхронные методы работы с файлами.

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

Решение через асинхронное помещение файла во временное хранилище

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

Посмотрим на пример клиентского и серверного кода:


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

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

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

Разбор работы метода на разных типах клиентов

Проанализируем ключевые особенности реализации:

  1. Интерактивный режим: Параметр Интерактивно = Истина инициирует открытие диалога выбора файла встроенными средствами браузера (элемент input type="file"), что полностью снимает требование подключать внешнюю компоненту.
  2. Уникальный идентификатор: Передача УникальныйИдентификатор формы в качестве пятого параметра связывает временное хранилище с временем жизни формы.
  3. Различие с групповой загрузкой: В старых релизах платформы метод НачатьПомещениеФайлов требовал расширения для множественного выбора, в то время как единичное НачатьПомещениеФайла успешно работало без него.

Современные асинхронные методы платформы (8.3.15 и выше)

В современных версиях платформы 1С:Предприятие механизмы работы с файловой системой были обновлены. Теперь для одиночной и множественной загрузки без расширения рекомендуется использовать объект ПараметрыДиалогаПомещенияФайлов и асинхронные методы:


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

Как отдавать файлы пользователю без расширения

Для выгрузки файла обратно на компьютер клиента в веб-интерфейсе также не требуется расширение, если сохранение выполняется через загрузчик браузера:

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

Ограничения при отказе от расширения

Разберем ограничения, с которыми придется считаться при работе исключительно через браузерный API:

  1. Отсутствие полных путей: В веб-клиенте невозможно узнать полный путь к файлу на диске клиента (например, C:\Folder\file.pdf) — доступно только его имя.
  2. Невозможность «тихого» сохранения: Программа не может в фоновом режиме без ведома пользователя записать файл в строго заданную папку на локальном компьютере.
  3. Клиентские манипуляции: Методы вроде КопироватьФайл, УдалитьФайлы, СоздатьКаталог на клиенте работать не будут. Все операции преобразования данных должны выполняться на сервере.

При использовании Библиотеки стандартных подсистем (БСП) рекомендуется применять методы общего модуля ФайловаяСистемаКлиент (например, ЗагрузитьФайл), которые автоматически адаптируют вызовы под текущий тип клиента и платформу.

← На главную