Простейший файловый диалог сохранить / открыть для платформы 8.3 - включая мобильный клиент

04.02.25

Разработка - Универсальные функции

Аналог диалога сохранить / выбрать на скорую руку.

В процессе перестройки совместимой консоли запросов выяснился очень неприятный факт: на старых платформах 8.3, а именно 8.3.7 эта консоль не хотела запускаться - не было файловых функций  - не поддерживалась функция НачатьПолучениеФайлаССервера (она появилась в платформе 8.3.15).  И в консоли для того, чтобы обеспечить работу в web-клиенте, достаточно было сделать дополнительную форму обработки и потом просто вызвать эту функцию вместе с формой при необходимости, то с мобильным приложением этот фокус не пройдёт...

Поэтому пришлось обернуть в препроцессор Web-клиента. Но потом выяснилось, что это не единственная проблема - диалога выбора файлов не было на платформе 8.3.7 в мобильном приложении. В данной публикации я рассмотрю самый простой вариант создания такого диалога. 
Отдельно необходимо отметить, что если нужен файловый менеджер, то сейчас на infostart таких решений полно для обычных и управляемых форм, здесь рассматриваются все действия исключительно с помощью функций 1С без любых дополнений и излишеств:

1.    Пройтись по каталогам. 

2.    Выбрать или сохранить файл. 

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

Сам диалог выглядит таким образом (тест из режима УФ в конфигураторе).

 

 

Сам код работы формы:


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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
	//Вставить содержимое обработчика
	//Диалог выбора файлов имеет смысл только для Мобильной плафтформы - остальное на чистых диалогах!!! 
	//файловых функциях.
	#Если ВебКлиент  Тогда
	#иначе
		
		//Эмитируем диалог выбора файла:
		ЭтаФорма.ТекущийКаталог = КаталогДокументов();
		МассивФайлов=НайтиФайлы(ЭтаФорма.ТекущийКаталог,"*.*",Ложь);
		ЭтаФорма.СписокФайлов.Очистить();
		
		//Добавляем путь в предыдущий каталог:
		Попытка
			ФайлКорня= новый Файл(ЭтаФорма.ТекущийКаталог);		
			ЭтаФорма.СписокФайлов.Добавить(ФайлКорня,"..",,ЭтаФорма.КартинкаКаталог);
		исключение
		КонецПопытки;
		Для каждого Эл Из МассивФайлов Цикл
			
			НеДобавлять = Ложь;
			ЭтоСкрытыйФайл   = Эл.ПолучитьНевидимость();
			ЭтоКаталогФайл = Эл.ЭтоКаталог();
			Если ЭтоСкрытыйФайл Тогда НеДобавлять = Истина;
			ИначеЕсли ((ЭтаФорма.РежимДиалога = "Открытие" ИЛИ ЭтаФорма.РежимДиалога = "Сохранение") 
				И ЭтоКаталогФайл = Ложь) Тогда
					
					Если НРег(Эл.Расширение)=НРег(ЭтаФорма.ИмяФайла) Тогда
					Иначе
						
						НеДобавлять = Истина;
						
					КонецЕсли;
					
			ИначеЕсли ЭтаФорма.РежимДиалога = "ВыборКаталога" И ЭтоКаталогФайл = Ложь Тогда НеДобавлять = Истина;							
			КонецЕсли;
			
			Если НеДобавлять = Истина Тогда иначе
				ЭтаФорма.СписокФайлов.Добавить(Эл,Эл.Имя,,?(ЭтоКаталогФайл,ЭтаФорма.КартинкаКаталог,ЭтаФорма.ДефолтнаяКартинка));
			КонецЕсли;
			
		КонецЦикла;
		
	#КонецЕсли
	
	
КонецПроцедуры


&НаКлиенте
Процедура СписокФайловПередУдалением(Элемент, Отказ)
	// Вставить содержимое обработчика.
	Отказ = Истина; //Мы же не файловый менеджер пишем!!!
КонецПроцедуры


&НаКлиенте
Процедура СписокФайловПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	// Вставить содержимое обработчика.
	Отказ = Истина; //Мы же не файловый менеджер пишем!!!

КонецПроцедуры

&НаКлиенте
Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	// Вставить содержимое обработчика.
	Если Элемент.ТекущиеДанные=Неопределено Тогда
	иначе
		
		ВыбранФайл = Элемент.ТекущиеДанные.Значение;
		Если ВыбранФайл.ЭтоКаталог() Тогда 
			//Эмитируем переход в поле каталог: 			
			Если Элемент.ТекущиеДанные.Представление = ".." Тогда
			
				ЭтаФорма.ТекущийКаталог = ВыбранФайл.Путь;
			
			Иначе
			
				ЭтаФорма.ТекущийКаталог = ВыбранФайл.ПолноеИмя;
			
			КонецЕсли;
			
			МассивФайлов=НайтиФайлы(ЭтаФорма.ТекущийКаталог,"*.*",Ложь);
			ЭтаФорма.СписокФайлов.Очистить();
			//Добавляем путь в предыдущий каталог (кроме корня диска):
			Попытка
				ФайлКорня= новый Файл(ЭтаФорма.ТекущийКаталог);		
				ЭтаФорма.СписокФайлов.Добавить(ФайлКорня,"..",,ЭтаФорма.КартинкаКаталог);
			исключение
			КонецПопытки;
			
			Для каждого Эл Из МассивФайлов Цикл
				
				НеДобавлять = Ложь;
				ЭтоСкрытыйФайл   = Эл.ПолучитьНевидимость();
				ЭтоКаталогФайл = Эл.ЭтоКаталог();
				
				Если ЭтоСкрытыйФайл Тогда НеДобавлять = Истина;
				ИначеЕсли ((ЭтаФорма.РежимДиалога = "Открытие" ИЛИ ЭтаФорма.РежимДиалога = "Сохранение") 
					И ЭтоКаталогФайл = Ложь) Тогда
					
					Если НРег(Эл.Расширение)=НРег(ЭтаФорма.ИмяФайла) Тогда
					Иначе
						
						НеДобавлять = Истина;
						
					КонецЕсли;
					
				ИначеЕсли ЭтаФорма.РежимДиалога = "ВыборКаталога" И ЭтоКаталогФайл = Ложь  Тогда
					
					НеДобавлять = Истина;
					
				КонецЕсли;
				
				Если НеДобавлять = Истина Тогда иначе
					
					Размер =?(ЭтоКаталогФайл,"","("+Строка(Эл.Размер())+" байт)");					
					ЭтаФорма.СписокФайлов.Добавить(Эл,Эл.Имя+" "+Размер,,?(ЭтоКаталогФайл,ЭтаФорма.КартинкаКаталог,ЭтаФорма.ДефолтнаяКартинка));
					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЕсли;	
		
	КонецЕсли;

КонецПроцедуры


&НаКлиенте
Процедура СохранитьКоманда(Команда)
	// Вставить содержимое обработчика.
	Массив= новый Массив;
	Массив.Добавить(ЭтаФорма.ТекущийКаталог + ЭтаФорма.ИмяФайла);
	ЭтаФорма.Закрыть(Массив);
		
КонецПроцедуры


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


&НаКлиенте
Процедура ИмяФайлаПриИзменении(Элемент)
	// Вставить содержимое обработчика.
	
	СписокФайловВыбор(Элементы.СписокФайлов, Неопределено, Неопределено, Ложь);
	
КонецПроцедуры

Обработать полученные изменения можно уже на исходной форме. Открывать рекомендую с помощью ключа в событии ОписаниеОповещенияОЗакрытии. Например, для расширения файлов .q1c диалог выглядит таким образом:

 

 

Замечание: опубликованный код является заготовкой.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3318    Abysswalker    7    

44

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6169    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    48208    dimanich70    83    

169

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7257    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    60141    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9034    ke.92@mail.ru    17    

68
Для отправки сообщения требуется регистрация/авторизация