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