Как реализовать выбор файла в 1С 8.3 без использования модальных окон?

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

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

Почему важно использовать немодальный режим?

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

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

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

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


&НаКлиенте
Процедура ФайлЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // 1. Указываем, что стандартная обработка выбора не требуется
    СтандартнаяОбработка = Ложь;
    
    // 2. Создаем объект диалога
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Фильтр = "Файлы Excel (*.xls;*.xlsx)|*.xls;*.xlsx|Все файлы (*.*)|*.*";
    ДиалогВыбора.Заголовок = "Выберите файл для загрузки данных";
    ДиалогВыбора.ПредварительныйПросмотр = Ложь;
    ДиалогВыбора.ИндексФильтра = 0;
    ДиалогВыбора.ПроверятьСуществованиеФайла = Истина;
    
    // 3. Формируем описание оповещения. 
    // "ФайлЗагрузкиЗавершение" - имя процедуры, которая выполнится после закрытия диалога.
    // ЭтотОбъект - модуль, где находится эта процедура.
    Оповещение = Новый ОписаниеОповещения("ФайлЗагрузкиЗавершение", ЭтотОбъект, Новый Структура("Диалог", ДиалогВыбора));
    
    // 4. Вызываем диалог немодально
    ДиалогВыбора.Показать(Оповещение);
    
КонецПроцедуры

&НаКлиенте
Процедура ФайлЗагрузкиЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    // Если пользователь нажал "Отмена", массив ВыбранныеФайлы будет равен Неопределено
    Если ВыбранныеФайлы <> Неопределено Тогда
        // Получаем путь к выбранному файлу из массива (в режиме Открытие там один элемент)
        ПутьКФайлу = ВыбранныеФайлы[0];
        // Здесь можно продолжить логику работы с файлом, например, записать путь в реквизит
        Объект.ПутьКФайлу = ПутьКФайлу;
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: Обратите внимание на ключевое слово Экспорт в заголовке процедуры завершения. Выясним причину: платформа должна иметь возможность вызвать эту процедуру извне при завершении работы диалога. Если пропустить это слово, система выдаст ошибку доступа.

Решение 2: Современный асинхронный подход (Асинх/Ждать)

Начиная с версии платформы 8.3.15, появился более изящный способ написания асинхронного кода, который выглядит как обычный последовательный код. Разберем, как упростить нашу задачу с помощью операторов Асинх и Ждать.

В этом случае нам не нужно создавать отдельную экспортную процедуру для оповещения. Весь код можно написать в рамках одного обработчика:


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

Проанализируем ситуацию: использование метода ВыбратьАсинх() позволяет коду «замереть» в точке вызова до момента выбора файла, не блокируя при этом интерфейс программы, что крайне важно, если планируется конвертация JSON/XML/CSV больших объемов. Это делает алгоритм более читаемым и легким в поддержке.

Настройка свойств объекта ДиалогВыбораФайла

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

  1. Фильтр. Позволяет ограничить типы файлов, которые видит пользователь. Формат записи: "Описание|*.расширение". Например: "Текстовые файлы (*.txt)|*.txt".
  2. МножественныйВыбор. Если установить это свойство в значение Истина, пользователь сможет выделить сразу несколько файлов, удерживая клавишу Ctrl.
  3. ПредварительныйПросмотр. Актуально для изображений. Позволяет видеть содержимое файла прямо в окне выбора.
  4. ИндексФильтра. Определяет, какой фильтр будет выбран по умолчанию при открытии окна.

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

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

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

Заключение и выводы

Мы рассмотрели два основных способа реализации выбора файла в немодальном режиме. Первый способ с использованием ОписаниеОповещения является универсальным для всех версий 8.3, в то время как второй (через Асинх/Ждать) является наиболее современным и удобным для написания кода. При выполнении учебных задач (например, "Задачи №2 и №3"), как правило, требуется именно реализация через ДиалогВыбораФайла.Показать(), так как это демонстрирует владение механизмами платформы по работе с асинхронностью.

← На главную