Pavel Marychev 53345e5d63 Добавил решения заданий 5-7 и 5-8
Файлы, Текстовые и табличные документы
2022-01-15 16:09:10 +04:00

113 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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