В процессе перестройки совместимой консоли запросов выяснился очень неприятный факт: на старых платформах 8.3, а именно 8.3.7 эта консоль не хотела запускаться - не было файловых функций - не поддерживалась функция НачатьПолучениеФайлаССервера (она появилась в платформе 8.3.15). И в консоли для того, чтобы обеспечить работу в web-клиенте, достаточно было сделать дополнительную форму обработки и потом просто вызвать эту функцию вместе с формой при необходимости, то с мобильным приложением этот фокус не пройдёт...
Поэтому пришлось обернуть в препроцессор Web-клиента. Но потом выяснилось, что это не единственная проблема - диалога выбора файлов не было на платформе 8.3.7 в мобильном приложении. В данной публикации я рассмотрю самый простой вариант создания такого диалога.
Отдельно необходимо отметить, что если нужен файловый менеджер, то сейчас на infostart таких решений полно для обычных и управляемых форм, здесь рассматриваются все действия исключительно с помощью функций 1С без любых дополнений и излишеств:
1. Пройтись по каталогам.
2. Выбрать или сохранить файл.
Очевидно, что похожие диалоги и ранее могли создаваться для мобильных приложений 1С. Здесь приведен простейший код заготовки как это можно сделать с учетом имеющихся возможностей 1с мобильного клиента и платформы.
Сам диалог выглядит таким образом (тест из режима УФ в конфигураторе).
Сам код работы формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Вставить содержимое обработчика
ЭтаФорма.КартинкаКаталог = БиблиотекаКартинок.ВыбратьИзСписка;
ЭтаФорма.ИмяФайла ="."+ЭтаФорма.Параметры.Расширение;
ЭтаФорма.РежимДиалога = ЭтаФорма.Параметры.РежимДиалога;
Элементы.Сохранить.Видимость = (ЭтаФорма.РежимДиалога = "Сохранение");
Элементы.Открыть.Видимость = (Элементы.Сохранить.Видимость = Ложь);
ЭтаФорма.Заголовок = ЭтаФорма.Заголовок +"( "+ЭтаФорма.РежимДиалога+" )"
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
//Вставить содержимое обработчика
//Диалог выбора файлов имеет смысл только для Мобильной плафтформы - остальное на чистых диалогах!!!
//файловых функциях.
#Если ВебКлиент Тогда
#иначе
//Эмитируем диалог выбора файла:
ЭтаФорма.ТекущийКаталог = КаталогДокументов();
МассивФайлов=НайтиФайлы(ЭтаФорма.ТекущийКаталог,"*.*",Ложь);
ЭтаФорма.СписокФайлов.Очистить();
//Добавляем путь в предыдущий каталог:
Попытка
ФайлКорня= новый Файл(ЭтаФорма.ТекущийКаталог);
ЭтаФорма.СписокФайлов.Добавить(ФайлКорня,"..",,ЭтаФорма.КартинкаКаталог);
исключение
КонецПопытки;
Для каждого Эл Из МассивФайлов Цикл
НеДобавлять = Ложь;
ЭтоСкрытыйФайл = Эл.ПолучитьНевидимость();
ЭтоКаталогФайл = Эл.ЭтоКаталог();
Если ЭтоСкрытыйФайл Тогда НеДобавлять = Истина;
ИначеЕсли ((ЭтаФорма.РежимДиалога = "Открытие" ИЛИ ЭтаФорма.РежимДиалога = "Сохранение")
И ЭтоКаталогФайл = Ложь) Тогда
Если НРег(Эл.Расширение)=НРег(ЭтаФорма.ИмяФайла) Тогда
Иначе
НеДобавлять = Истина;
КонецЕсли;
ИначеЕсли ЭтаФорма.РежимДиалога = "ВыборКаталога" И ЭтоКаталогФайл = Ложь Тогда НеДобавлять = Истина;
КонецЕсли;
Если НеДобавлять = Истина Тогда иначе
ЭтаФорма.СписокФайлов.Добавить(Эл,Эл.Имя,,?(ЭтоКаталогФайл,ЭтаФорма.КартинкаКаталог,ЭтаФорма.ДефолтнаяКартинка));
КонецЕсли;
КонецЦикла;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура СписокФайловПередУдалением(Элемент, Отказ)
// Вставить содержимое обработчика.
Отказ = Истина; //Мы же не файловый менеджер пишем!!!
КонецПроцедуры
&НаКлиенте
Процедура СписокФайловПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
// Вставить содержимое обработчика.
Отказ = Истина; //Мы же не файловый менеджер пишем!!!
КонецПроцедуры
&НаКлиенте
Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Вставить содержимое обработчика.
Если Элемент.ТекущиеДанные=Неопределено Тогда
иначе
ВыбранФайл = Элемент.ТекущиеДанные.Значение;
Если ВыбранФайл.ЭтоКаталог() Тогда
//Эмитируем переход в поле каталог:
Если Элемент.ТекущиеДанные.Представление = ".." Тогда
ЭтаФорма.ТекущийКаталог = ВыбранФайл.Путь;
Иначе
ЭтаФорма.ТекущийКаталог = ВыбранФайл.ПолноеИмя;
КонецЕсли;
МассивФайлов=НайтиФайлы(ЭтаФорма.ТекущийКаталог,"*.*",Ложь);
ЭтаФорма.СписокФайлов.Очистить();
//Добавляем путь в предыдущий каталог (кроме корня диска):
Попытка
ФайлКорня= новый Файл(ЭтаФорма.ТекущийКаталог);
ЭтаФорма.СписокФайлов.Добавить(ФайлКорня,"..",,ЭтаФорма.КартинкаКаталог);
исключение
КонецПопытки;
Для каждого Эл Из МассивФайлов Цикл
НеДобавлять = Ложь;
ЭтоСкрытыйФайл = Эл.ПолучитьНевидимость();
ЭтоКаталогФайл = Эл.ЭтоКаталог();
Если ЭтоСкрытыйФайл Тогда НеДобавлять = Истина;
ИначеЕсли ((ЭтаФорма.РежимДиалога = "Открытие" ИЛИ ЭтаФорма.РежимДиалога = "Сохранение")
И ЭтоКаталогФайл = Ложь) Тогда
Если НРег(Эл.Расширение)=НРег(ЭтаФорма.ИмяФайла) Тогда
Иначе
НеДобавлять = Истина;
КонецЕсли;
ИначеЕсли ЭтаФорма.РежимДиалога = "ВыборКаталога" И ЭтоКаталогФайл = Ложь Тогда
НеДобавлять = Истина;
КонецЕсли;
Если НеДобавлять = Истина Тогда иначе
Размер =?(ЭтоКаталогФайл,"","("+Строка(Эл.Размер())+" байт)");
ЭтаФорма.СписокФайлов.Добавить(Эл,Эл.Имя+" "+Размер,,?(ЭтоКаталогФайл,ЭтаФорма.КартинкаКаталог,ЭтаФорма.ДефолтнаяКартинка));
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СохранитьКоманда(Команда)
// Вставить содержимое обработчика.
Массив= новый Массив;
Массив.Добавить(ЭтаФорма.ТекущийКаталог + ЭтаФорма.ИмяФайла);
ЭтаФорма.Закрыть(Массив);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьКоманда(Команда)
// Вставить содержимое обработчика.
ТекФайл = Элементы.СписокФайлов.ТекущиеДанные.Значение;
Результат =(ЭтаФорма.РежимДиалога = "Открытие" И ТекФайл.ЭтоКаталог() = Ложь);
ЭтаФорма.Закрыть(новый Структура("РежимДиалога,Файл,Результат",ЭтаФорма.РежимДиалога,ТекФайл,Результат));
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаПриИзменении(Элемент)
// Вставить содержимое обработчика.
СписокФайловВыбор(Элементы.СписокФайлов, Неопределено, Неопределено, Ложь);
КонецПроцедуры
Обработать полученные изменения можно уже на исходной форме. Открывать рекомендую с помощью ключа в событии ОписаниеОповещенияОЗакрытии. Например, для расширения файлов .q1c диалог выглядит таким образом:
Замечание: опубликованный код является заготовкой.