Рефакторинг загрузки из списка файлов
Клиент захотел, чтобы обработка загрузки перемещений загружала сразу из нескольких файлов Excel.
Обработка сначала загружала данные в таблицу формы, а затем уже переносила в выбранный документ.
Во-первых я сделал галочку «Добавлять в таблицу», если она стоит, то данные из текущего файла добавляются в таблицу, т.е. таблица предварительно не очищается. Это позволяет загружать файлы по очереди, добавляя их в таблицу и затем перенося в перемещение.
В коде это выглядит просто:
//Осипов 2022-10-05 Если НЕ ДобавлятьВТаблицу Тогда ТаблицаДанных.Очистить(); КонецЕсли;
Во-вторых я сделал многострочное поле «Список файлов» с педалькой выбора файлов и кнопкой очистки. Выбор файлов осуществляется так:
&НаКлиенте Процедура СписокФайловНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) РежимДиалога = РежимДиалогаВыбораФайла.Открытие; Диалог = Новый ДиалогВыбораФайла(РежимДиалога); Диалог.МножественныйВыбор = истина; //Диалог.ПолноеИмяФайла = ВыбИмяФайла; Диалог.Фильтр = "Файлы Excel (*.xls, *.xlsx)|*.xls;*.xlsx"; Диалог.Показать(Новый ОписаниеОповещения("ВыбИмяФайлаОкончаниеВыбора", ЭтаФорма)); КонецПроцедуры
Для добавленных полей я добавил кнопки-подсказки для удобства пользователей (с синеньким вопросом, они видны на скриншоте).
Кстати, обработка не моя, в ней еще два варианта чтения файла Excel используется — через ADO или COM, хотя сейчас нужно читать именно платформой 1С.
Далее я добавил реквизит формы ТекИмяФайла — это имя файла для обработки. Если оно не заполнено, то будет запрашиваться у пользователя, если заполнено, то будет загружаться из него. И дальше перешел к заполнению таблицы в цикле.
МассивФайлов = Новый Массив(); Для Инд = 1 По СтрЧислоСтрок(СписокФайлов) Цикл ТекИмяФайла = СокрЛП(СтрПолучитьСтроку(СписокФайлов, 1)); Если ТекИмяФайла = "" Тогда Продолжить; КонецЕсли; МассивФайлов.Добавить(ТекИмяФайла); КонецЦикла; Если МассивФайлов.Количество() = 0 Тогда МассивФайлов.Добавить(""); КонецЕсли; Для Каждого ТекИмяФайла ИЗ МассивФайлов Цикл если ЗагрузкаЧерезCOM тогда ПрочитатьФайлВТаблицуЧерезCOM(Ошибка); иначе ПрочитатьФайлВТаблицуБыстро(Ошибка); конецЕсли; КонецЦикла;
В самой загрузке проверка необходимости запроса имени файла выглядит так:
процедура ПрочитатьФайлВТаблицуЧерезCOM(Ошибка) Если ТекИмяФайла = "" Тогда ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбораФайла.Заголовок = "Выберите файл"; //ДиалогВыбораФайла.Фильтр = "Файл Excel (*.xls)|*.xls|Файл Excel (*.xlsx)|*.xlsx|"; //"Лист Excel (*.DB)|*.DB" ДиалогВыбораФайла.Фильтр = "Файл Excel (*.xls,*.xlsx)|*.xls*"; //"Лист Excel (*.DB)|*.DB" Если ДиалогВыбораФайла.Выбрать() Тогда ИмяФайлаЗагрузки = ДиалогВыбораФайла.ПолноеИмяФайла; Иначе Возврат; КонецЕсли; Иначе ИмяФайлаЗагрузки = ТекИмяФайла; КонецЕсли; Попытка Данные = ПолучитьЛист(ИмяФайлаЗагрузки); ПеренестиДанныеВТаблицу(Данные); исключение Ошибка = ОписаниеОшибки(); //Осипов 2021-05-20 Сообщить("Ошибка при чтении таблицы: " + Ошибка); конецПопытки; конецПроцедуры
Среда: УТ 11.5.7.402. Объем: 1 час.
Свежие комментарии