Как в веб-клиенте 1С организовать выбор файла

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

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

Причина проблемы: Синхронность против Асинхронности

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

Решение 1: Использование метода Показать()

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

Разберем по шагам создание такого вызова:

  1. Создаем объект ДиалогВыбораФайла и устанавливаем нужные параметры (фильтры, заголовок).
  2. Создаем объект ОписаниеОповещения, который указывает на процедуру, которая будет выполнена после того, как пользователь выберет файл.
  3. Вызываем метод Показать().

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


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

&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлы <> Неопределено Тогда
        // Массив ВыбранныеФайлы содержит пути к файлам
        ИмяФайла = ВыбранныеФайлы[0];
        Сообщить("Выбран файл: " + ИмяФайла);
    КонецЕсли;
КонецПроцедуры

Решение 2: Автоматическое преобразование кода

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

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

Решение 3: Современный подход через Асинхронные методы (Promises)

Начиная с версии платформы 8.3.15 и выше, разработчикам доступны еще более удобные механизмы — методы с суффиксом Асинхронно. Проанализируем ситуацию: использование ОписаниеОповещения часто приводит к «лапшеобразному» коду, где логика разрывается между разными процедурами. Асинхронные функции позволяют писать код линейно.

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


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

Важные особенности работы в веб-клиенте

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

  1. Ограничение путей: В целях безопасности веб-клиент не может получить полный путь к файлу на диске пользователя (например, C:\Users\Admin\Desktop\file.txt). Вы получите только имя файла. Работа с содержимым должна идти через двоичные данные или временное хранилище.
  2. Расширение для работы с файлами: Для выполнения некоторых операций (например, интерактивного открытия файла во внешнем приложении) веб-клиенту может потребоваться установка специального расширения браузера. Платформа предложит пользователю установить его при первом вызове соответствующих функций.
  3. Множественный выбор: Если вам нужно позволить пользователю выбирать несколько файлов одновременно, обязательно установите свойство МножественныйВыбор = Истина у объекта ДиалогВыбораФайла. В веб-клиенте это активирует стандартную возможность браузера выбирать файлы через Ctrl или Shift.
  4. Drag-and-Drop: Современный веб-клиент поддерживает перетаскивание файлов прямо в окно браузера. Чтобы это работало, проанализируйте события формы ПроверкаПеретаскивания и ОкончаниеПеретаскивания. Это часто удобнее для пользователя, чем поиск файла через диалоговое окно.

Таблица соответствий методов

Для удобства навигации по методам работы с файлами, рассмотрим основные замены, которые необходимо произвести при адаптации кода:

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

← На главную