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