# Задание к занятию "Файлы"

## Задача 1 Создать обработку для загрузки цен из файла

### Описание задачи

Создадим обработку для загрузки цен из файла CSV.

Обработка создает новый документ Цены номенклатуры, 
в ТЧ заполняет данные из файла.

### Требования к результату

Выгрузка информационной базы (.dt), csv-файл содержащий список номенклатуры с ценами.

Возможность выбора файла с фильтром *.CSV

В файле разделитель ";" между колонками

Возможность загрузить и создать документ Цены номенклатуры.

Поиск номенклатуры по наименованию

Если не найдена, вывести сообщение вида
"Номенклатура: " + НаименованиеНоменклатуры + " не найдена"

### Процесс выполнения

Создать файл с расширением .CSV
формат: номенклатура;цена

пример строки файла:
Тапочки;1000
Хлеб;40

Создать новую обработку "Загрузка прайса из файла"

Добавим поле "ПутьКФайлу" с диалогом выбора
На событие "Начало выбора" добавим обработчик
```bsl
	Режим = РежимДиалогаВыбораФайла.Открытие;
	Диалог = Новый ДиалогВыбораФайла(Режим); //Создаем диалог в режиме открвтия файла и заплняем свойства
	Фильтр = НСтр("ru = 'Текст'; en = 'Text'")
		+ "(*.txt)|*.txt";
	Диалог.Фильтр = Фильтр;
	Диалог.МножественныйВыбор = Ложь;
	Диалог.Заголовок = "Выберите файл";
	Оповещение = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект); //Процедура, которая запустится после закрытия диалога
	Диалог.Показать(Оповещение); //Открываем диалог
```
В этом же модуле нужно объявить процедуру-обработчик закрытия диалога:
```bsl
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если ВыбранныеФайлы = Неопределено Тогда //Если пользователь ничего не выбрал, ничего не делаем
		Возврат;
	КонецЕсли;
	ПутьКФайлу = ВыбранныеФайлы[0];
КонецПроцедуры
```
Добавим реквизит формы
АдресВХранилище (Строка)
На форму его отображать не нужно

В реквизит поместим путь к файлу
```bsl
АдресВХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКФайлу));
```
Далее загрузим данные файла в ТЧ документ Цены номенклатуры

Создам процедуру на сервере ЗагрузитьЦеныНоменклатуры()
```bsl
&НаСервере
Процедура ЗагрузитьЦеныНоменклатуры()
	Файл = ПолучитьИмяВременногоФайла("csv");
	ФайлХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);
	ФайлХранилища.Записать(Файл);
	
	ТекстовыйФайлЗагрузки = Новый ТекстовыйДокумент;
	Разделитель = ";";
	
	Попытка	
		ТекстовыйФайлЗагрузки.Прочитать(Файл);
		
		ДокументЦены = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
		//Прочитаем строки файла
		Для НомерСтроки=1 по ТекстовыйФайлЗагрузки.КоличествоСтрок() Цикл
			НоваяСтрока = ТекстовыйФайлЗагрузки.ПолучитьСтроку(НомерСтроки);
			// «парсим» строки по ";"
			// ищем позицию символа-разделителя
			Позиция = Найти(НоваяСтрока, ";");
			НаименованиеНоменклатуры = Сред(НоваяСтрока,1,Позиция-1);
			Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(НаименованиеНоменклатуры);
			Если Не ЗначениеЗаполнено(Номенклатура) Тогда
				Сообщение = Новый СообщениеПользователю;
				Сообщение.Текст = "Номенклатура: " + НаименованиеНоменклатуры + " не найдена";
				Сообщение.Сообщить();
				Продолжить;
			КонецЕсли;
			// за символом-резделителем – цена
			Цена = Сред (НоваяСтрока, Позиция+1);
			НоваяСтрокаТЧ = ДокументЦены.Товары.Добавить();
			НоваяСтрокаТЧ.Номенклатура = Номенклатура;
			НоваяСтрокаТЧ.Цена = Цена;
		КонецЦикла;	
		ДокументЦены.Записать();
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();
	КонецПопытки;
КонецПроцедуры
```