Асинхронные методы реализованы в 1С уже сравнительно давно, но редко используются разработчиками. Виной тому - отсутствие рабочих примеров и наличие до сих пор работающих старых методов (ПоместитьВоВременноеХранилище, НачатьПомещениеФайла, НачатьПомещениеФайлаНаСервер), которые хорошо описаны и снабжены работающими примерами.
Моя цель зафиксировать и предоставить рабочий пример, тем, кто захочет воспользоваться современным методом НачатьПомещениеФайлаНаСервер.
#Область ОбработчикиКомандФормы
&НаКлиенте
Асинх Процедура ЗагрузитьСтатьи(Команда)
// Описание параметров диалога помещения файлов
//ПараметрыДиалогаПомещенияФайлов = Новый Структура;
//ПараметрыДиалогаПомещенияФайлов.Вставить("Заголовок", "Выберите файл статей");
//ПараметрыДиалогаПомещенияФайлов.Вставить("МножественныйВыбор", Ложь);
//ПараметрыДиалогаПомещенияФайлов.Вставить("Фильтр", "xlsx (*.xlsx)|*.xlsx");
//ПараметрыДиалогаПомещенияФайлов.Вставить("ИндексФильтра", 0);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Выберите файл статей", Ложь, "xlsx (*.xlsx)|*.xlsx", 0);
Обещание = ПоместитьФайлНаСерверАсинх( , , , ПараметрыДиалога, ЭтаФорма.УникальныйИдентификатор);
Результат = Ждать Обещание;
Если Результат <> Неопределено Тогда
Попытка
ПрочитатьФайл(Результат.Адрес);
Исключение
ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ПоказатьПредупреждение(,НСтр("ru = 'Операция не может быть выполнена по причине:'") + Символы.ПС + ТекстСообщения);
КонецПопытки;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервереБезКонтекста
Процедура ПрочитатьФайл(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяФайла);
табДок = Новый ТабличныйДокумент;
Попытка
табДок.Прочитать(ИмяФайла);
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Загрузка статей'"),
УровеньЖурналаРегистрации.Ошибка,,,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КоличествоСтрок = табДок.ВысотаТаблицы;
ГлубинаИерархии = 6;
Для каждого Область из табДок.Области Цикл
ИмяСправочника = Область.Имя;
Менеджер = Справочники[ИмяСправочника];
Если Менеджер = Неопределено Тогда
Менеджер = Справочники.СтатьиДвиженияДенежныхСредств;
КонецЕсли;
РодительскаяГруппаСправочника = Менеджер.НайтиПоНаименованию("Загруженные справочники");
ГруппыИерархии = Новый Массив(ГлубинаИерархии);
ГруппыИерархии.Вставить(0, РодительскаяГруппаСправочника);
ТекущаяГруппа = ГруппыИерархии[0];
Для НомерСтроки = Область.Верх + 1 по Область.Низ Цикл
Наименование = Строка(табДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0;") + "C" + 2).ТекущаяОбласть.Текст);
Тип = Строка(табДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0;") + "C" + 3).ТекущаяОбласть.Текст);
ДоходРасход = Строка(табДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0;") + "C" + 4).ТекущаяОбласть.Текст);
Если Лев(Тип, 6) = "Группа" Тогда
Уровень = Число(Прав(Тип, 1)) + 1;
НоваяГруппа = Менеджер.СоздатьГруппу();
НоваяГруппа.Наименование = Наименование;
НоваяГруппа.Родитель = ГруппыИерархии[Уровень - 1];
НоваяГруппа.Записать();
ТекущаяГруппа = НоваяГруппа.Ссылка;
ГруппыИерархии[Уровень] = ТекущаяГруппа;
ИначеЕсли Тип = "Статья" Тогда
НоваяСтатья = Менеджер.СоздатьЭлемент();
НоваяСтатья.Наименование = Наименование;
НоваяСтатья.Родитель = ТекущаяГруппа;
НоваяСтатья.ПриходРасход = ?(ДоходРасход = "Доход", Перечисления.ВидыДвиженийПриходРасход.Приход, Перечисления.ВидыДвиженийПриходРасход.Расход);
НоваяСтатья.Записать();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
Платформа: 8.3.24.1467.