Pull to refresh

Промисэз, промисэз

В 1С появились методы, позволяющие писать код без "ОписанийОповещений". Отличная новость!

&НаКлиенте 
Асинх Процедура КопируемыйФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

Диалог    = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Обещание  = Диалог.ВыбратьАсинх();

Попытка
	Результат  = Ждать Обещание;
	Если ТипЗнч(Результат) = Тип("Массив") И Результат.Количество() Тогда
		КопируемыйФайл = Результат[0];
	Иначе
		Возврат;
	КонецЕсли;
Исключение
	Сообщить(ИнформацияОбОшибке().Описание);	
КонецПопытки;

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

Выглядит отлично! А само копирование?

&НаКлиенте 
Асинх Процедура ЗапуститьКопированиеФайла(Команда)

ИмяКопируемогоФайла                = РазложитьПолноеИмяФайла(КопируемыйФайл).Имя; 
ОбещаниеСкопироватьФайл            = КопироватьФайлАсинх(КопируемыйФайл, Каталог + "\"+ ИмяКопируемогоФайла);
ОбещаниеПредупреждения             = ПредупреждениеАсинх("Файл копируется.", 1); 

Попытка
	Ждать ОбещаниеСкопироватьФайл;
Исключение                 
	Ждать ОбещаниеПредупреждения;  
	Сообщить(ОписаниеОшибки()); 
	Возврат;
КонецПопытки; 

Ждать ОбещаниеПредупреждения;  
ПредупреждениеАсинх("Файл скопирован."); 

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

Но как-то это слишком... Однопоточно что-ли.

А если мы хотим, продолжить интерактивную работу при копировании больших файлов?

Тогда нам нужно запустить копирование в отдельном потоке.

&НаКлиенте 
Асинх Процедура ЗапуститьКопированиеФайла(Команда)
ИмяКопируемогоФайла                = РазложитьПолноеИмяФайла(КопируемыйФайл).Имя; 
Режим                              = РежимДиалогаВопрос.ДаНет;

ИсполняемыйКодПотокаКопирования        = "Ждать КопироватьФайлАсинх(КопируемыйФайл, Каталог + ""\""+ ИмяКопируемогоФайла)";
Идентификатор                          = Новый УникальныйИдентификатор();
ИдентификаторОбещанияПотокаКопирования = Новый Поток(ИсполняемыйКодПотокаКопирования,Идентификатор); 

//Какой-то код.

//А тут нам точно нужен результат.
Пока НЕ(ОбещаниеПотокаИсполнено(ИдентификаторОбещанияПотокаКопирования)) Цикл
КонецЦикла;

Результат = ОбещаниеПотока(ИдентификаторОбещанияПотокаКопирования);

Если НЕ(ТипЗнч(Результат) = Тип("Исключение")) Тогда
	ПолноеИмяСкопированногоФайла = Результат.ОбещаниеПотока;
Иначе         
	ВызватьИсключениеАсинх(Результат);
КонецЕсли;

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.