Работа с файловой системой в веб-клиенте «1С:Предприятия» имеет свои особенности, продиктованные требованиями безопасности современных браузеров. Главная проблема, с которой сталкиваются разработчики при переходе с тонкого клиента на веб-клиент, — это невозможность использования синхронных методов, таких как Выбрать(). В этой статье мы подробно разберем, как правильно реализовать выбор файла, чтобы код работал корректно в любом браузере.
В веб-клиенте браузер не позволяет исполняемому коду блокировать основной поток интерфейса. Метод ДиалогОткрытияФайла.Выбрать() является синхронным: он останавливает выполнение кода до тех пор, пока пользователь не закроет окно выбора. Для веб-среды такой подход неприемлем. Поэтому платформа 1С требует использования асинхронных методов, которые не ждут ответа пользователя «здесь и сейчас», а продолжают работу после того, как событие выбора файла произойдет.
Рассмотрим стандартный способ замены устаревшего метода. Вместо Выбрать() нам необходимо использовать метод Показать(). Проанализируем, как это выглядит на практике. Основное отличие заключается в том, что результат выбора не возвращается сразу в переменную, а обрабатывается в отдельной процедуре (описании оповещения).
Разберем по шагам создание такого вызова:
ДиалогВыбораФайла и устанавливаем нужные параметры (фильтры, заголовок).ОписаниеОповещения, который указывает на процедуру, которая будет выполнена после того, как пользователь выберет файл.Показать().Посмотрим на пример кода:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для загрузки";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
// Массив ВыбранныеФайлы содержит пути к файлам
ИмяФайла = ВыбранныеФайлы[0];
Сообщить("Выбран файл: " + ИмяФайла);
КонецЕсли;
КонецПроцедуры
Если у вас уже есть большой объем написанного кода с синхронными вызовами, 1С предоставляет отличный инструмент для упрощения рефакторинга. Выясним, как им воспользоваться:
В конфигураторе 1С вы можете нажать правой кнопкой мыши на синхронный метод (например, на слово Выбрать) и выбрать в контекстном меню пункт «Преобразовать синхронный вызов в асинхронный». Платформа самостоятельно создаст структуру с ОписаниеОповещения и выделит обработку результата в отдельную процедуру-обработчик. Это значительно экономит время при адаптации конфигурации под веб-клиент.
Начиная с версии платформы 8.3.15 и выше, разработчикам доступны еще более удобные механизмы — методы с суффиксом Асинхронно. Проанализируем ситуацию: использование ОписаниеОповещения часто приводит к «лапшеобразному» коду, где логика разрывается между разными процедурами. Асинхронные функции позволяют писать код линейно.
Для работы с файлами в веб-клиенте рекомендуется использовать ПоместитьФайлыАсинхронно. Этот метод позволяет не просто выбрать файл, но и сразу загрузить его во временное хранилище сервера.
&НаКлиенте
Асинхронная Процедура ВыбратьИЗагрузитьФайл()
ПараметрыДиалога = Новый ПараметрыДиалогаВыбораФайла();
ПараметрыДиалога.Заголовок = "Выберите файл";
Результат = Ждать ПоместитьФайлыАсинхронно(,,, ПараметрыДиалога, УникальныйИдентификатор);
Если Результат <> Неопределено Тогда
Для Каждого Файл Из Результат Цикл
Сообщить("Файл загружен в хранилище: " + Файл.Адрес);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
При работе в браузере крайне важно учитывать следующие нюансы, которые отличают его от работы в обычном приложении:
C:\Users\Admin\Desktop\file.txt). Вы получите только имя файла. Работа с содержимым должна идти через двоичные данные или временное хранилище.МножественныйВыбор = Истина у объекта ДиалогВыбораФайла. В веб-клиенте это активирует стандартную возможность браузера выбирать файлы через Ctrl или Shift.ПроверкаПеретаскивания и ОкончаниеПеретаскивания. Это часто удобнее для пользователя, чем поиск файла через диалоговое окно.Для удобства навигации по методам работы с файлами, рассмотрим основные замены, которые необходимо произвести при адаптации кода:
ДиалогВыбораФайла.Выбрать() используем ДиалогВыбораФайла.Показать().ПоместитьФайл() используем НачатьПомещениеФайла() или ПоместитьФайлыАсинхронно().Вопрос() используем ПоказатьВопрос().Предупреждение() используем ПоказатьПредупреждение().Резюмируем: Переход к работе в веб-клиенте требует от разработчика понимания асинхронной модели событий. Использование метода Показать() или современных асинхронных функций (с ключевым словом Ждать) позволяет создавать стабильные и быстрые решения, которые будут работать одинаково эффективно как в тонком клиенте, так и в любом современном браузере.