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