Рефакторинг загрузки из списка файлов

Клиент захотел, чтобы обработка загрузки перемещений загружала сразу из нескольких файлов 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 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *