среда, 26 октября 2022 г.

1СЗаготовка Чтение CSV (ТонкийКлиент,ВебКлиент)

 Понадобилось использовать обработку на опубликованной базе и тут начались проблемы:

  1. Классический выбор файла здесь не работает
  2. Прочитать файл просто так не получилось
  3. Пришлось отказаться от чтения при помощи Excel (типа универсальная была)
Поэтому пришлось использовать БСП, сохранять во временный файл и читать оттуда:


&НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
    ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
    
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Фильтр = "Excel CSV (*.csv)|*.csv"; 
	ДиалогВыбораФайла.МножественныйВыбор=Ложь;
	ДиалогВыбораФайла.Заголовок = "Выберите файл";
	ДиалогВыбораФайла.ПредварительныйПросмотр = Истина;
	ДиалогВыбораФайла.ИндексФильтра = 0;
    
    ПараметрыЗагрузки.Диалог = ДиалогВыбораФайла;
    
    ОповещениеЗавершенияВыбораФайла = Новый ОписаниеОповещения("ВыборФАйлаЗавершение", ЭтотОбъект);
    
    ФайловаяСистемаКлиент.ЗагрузитьФайлы(ОповещениеЗавершенияВыбораФайла, ПараметрыЗагрузки); //БСП
КонецПроцедуры
&НаКлиенте
Процедура ВыборФАйлаЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	Если Результат<>Неопределено Тогда
		ИмяФайла=Результат[0].ПолноеИмя;
		АдресВХранилище=Результат[0].Хранение;
		ПрочитатьФайлCSV(АдресВХранилище);
		Элементы.Таблица.Обновить();
		ДоступностьКнопкиСоздания();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьФайлCSV(АдресВХранилище)
	Данные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("csv");
	Данные.Записать(ИмяПромежуточногоФайла);
	УдалитьИзВременногоХранилища(АдресВХранилище);	//очищаем временное хранилище
	
	оТаблица=Новый ТаблицаЗначений;	
	//очищаем таблицу и удаляем колонки
	Таблица.Очистить();
	оТаблица=Таблица.Выгрузить();
	
	Разделитель=";";
	ЗаголовкиИзПервойСтроки=Истина;
	
	Текст = Новый ЧтениеТекста(ИмяПромежуточногоФайла);
	
	 //создадим колонки
	ТекСтрока = Текст.ПрочитатьСтроку();
	Если ТекСтрока <> Неопределено Тогда
		МассивЗначений = СтрРазделить(ТекСтрока, Разделитель);
		ИндексКолонки = 0;
		Для Каждого ИмяКолонки Из МассивЗначений Цикл
			ИмяКолонки = ?(ЗаголовкиИзПервойСтроки, "Кол"+ИндексКолонки, ИмяКолонки);
			оТаблица.Колонки.Добавить(ИмяКолонки);
			ИндексКолонки = ИндексКолонки + 1;
		КонецЦикла;
		Если ЗаголовкиИзПервойСтроки Тогда
			ТекСтрока = Текст.ПрочитатьСтроку();
		КонецЕсли;
	КонецЕсли;

	Пока ТекСтрока <> Неопределено Цикл // строки читаются до символа перевода строки
		НоваяСтрока = оТаблица.Добавить();
		
		МассивЗначений = СтрРазделить(ТекСтрока, Разделитель);
		ИндексКолонки = 0;
		Для Каждого ТекЗначение Из МассивЗначений Цикл
			Попытка
				ЗначениеЯчейки=Дата(ТекЗначение+":00");
			Исключение
				ЗначениеЯчейки=Число(СтрЗаменить(ТекЗначение," ",""));
			КонецПопытки;
			НоваяСтрока[ИндексКолонки] = ЗначениеЯчейки;
			ИндексКолонки = ИндексКолонки + 1;
		КонецЦикла;

		ТекСтрока = Текст.ПрочитатьСтроку();
	КонецЦикла;
		
	//Возврат Результат;
	
	Таблица.Загрузить(оТаблица);
	
	//удаляем временный файл
	Попытка
		УдалитьФайлы(ИмяПромежуточногоФайла);
	Исключение
	   ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
КонецПроцедуры


Комментариев нет:

Отправить комментарий