2023-02-02 15:49:00 +02:00
# Задание к занятию «Файлы»
2020-05-31 18:38:46 +02:00
2023-02-02 15:49:00 +02:00
Результат выполнения двух задач вышлите одним файлом (.dt).
2022-02-02 23:41:17 +02:00
2023-02-02 15:49:00 +02:00
## Задача 1. Создать обработку для загрузки цен из файла
2020-06-21 19:03:26 +02:00
### Описание задачи
2020-06-22 16:54:30 +02:00
Создадим обработку для загрузки цен из файла CSV.
2020-06-21 19:03:26 +02:00
2023-02-02 15:49:00 +02:00
Обработка создаёт новый документ «Цены номенклатуры», в табличной части заполняет данные из файла.
2020-06-21 19:03:26 +02:00
2020-06-22 16:54:30 +02:00
### Требования к результату
2020-06-21 19:03:26 +02:00
2023-02-02 15:49:00 +02:00
Выгрузка информационной базы (.dt), CSV-файл, содержащий список номенклатуры с ценами.
2021-01-24 11:40:19 +02:00
2022-02-05 22:59:16 +02:00
Возможность выбора файла с фильтром *.CSV, обработка файла должна выполняться на клиенте.
2020-06-21 19:03:26 +02:00
2023-02-02 15:49:00 +02:00
В файле разделитель «;» между колонками.
2020-06-21 19:03:26 +02:00
2023-02-02 15:49:00 +02:00
Возможность загрузить и создать документ «Цены номенклатуры».
2020-06-21 19:03:26 +02:00
2023-02-02 15:49:00 +02:00
Поиск номенклатуры по наименованию.
2020-06-21 19:03:26 +02:00
2020-06-22 16:54:30 +02:00
Если не найдена, вывести сообщение вида
2023-02-02 15:49:00 +02:00
«Номенклатура: « + НаименованиеНоменклатуры + » не найдена»
2020-06-21 19:03:26 +02:00
### Процесс выполнения
2020-06-22 16:54:30 +02:00
Создать файл с расширением .CSV
формат: номенклатура;цена
пример строки файла:
Тапочки;1000
Хлеб;40
2023-02-02 15:49:00 +02:00
Создать новую обработку «Загрузка прайса из файла».
2020-06-22 16:54:30 +02:00
2023-02-02 15:49:00 +02:00
Добавим команду «Загрузить», вынесём в командную панель формы и назначим кнопкой по умолчанию.
2022-02-02 23:41:17 +02:00
Назначим обработчик команды со следующим алгоритмом:
```bsl
2021-04-11 16:47:19 +02:00
Режим = РежимДиалогаВыбораФайла.Открытие;
2022-02-02 23:41:17 +02:00
Диалог = Новый ДиалогВыбораФайла(Режим); //Создаем диалог в режиме открытия файла и заполняем свойства
Фильтр = НСтр("ru = 'Файл CSV'; en = 'File CSV'")
+ "(*.csv)|*.csv";
2021-04-11 16:47:19 +02:00
Диалог.Фильтр = Фильтр;
Диалог.Заголовок = "Выберите файл";
2022-02-02 23:41:17 +02:00
ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх(); //Открываем диалог
2021-04-11 16:47:19 +02:00
Если ВыбранныеФайлы = Неопределено Тогда //Если пользователь ничего не выбрал, ничего не делаем
Возврат;
2020-06-22 16:54:30 +02:00
КонецЕсли;
2022-02-02 23:41:17 +02:00
ДанныеФайла = Ждать ПрочитатьФайл(ВыбранныеФайлы[0]);
СоздатьДокумент(ДанныеФайла);
2020-06-22 16:56:50 +02:00
```
2023-02-02 15:51:49 +02:00
Так как в обработчике используется ключевое слово «Ждать», перед словом «Процедура» добавим **Асинх** .
2020-06-22 17:46:32 +02:00
2022-02-02 23:41:17 +02:00
Далее обработаем файл на клиенте и подготовим данные для создания документа:
2020-06-22 17:46:32 +02:00
```bsl
2022-02-02 23:41:17 +02:00
& НаКлиенте
Асинх Функция ПрочитатьФайл(ПутьКФайлу)
ТекстовыйФайлЗагрузки = Новый ТекстовыйДокумент;
Разделитель = ";";
Ждать ТекстовыйФайлЗагрузки.ПрочитатьАсинх(ПутьКФайлу, КодировкаТекста.UTF8);
Результат = Новый Массив;
//Прочитаем строки файла
Для НомерСтроки = 1 по ТекстовыйФайлЗагрузки.КоличествоСтрок() Цикл
НоваяСтрока = ТекстовыйФайлЗагрузки.ПолучитьСтроку(НомерСтроки);
// «парсим» строки по ";"
// ищем позицию символа-разделителя
Позиция = Найти(НоваяСтрока, ";");
// Получаем из строки наименование номенклатуры и цену
// Наименование перед символом-разделителем, цена - после
НаименованиеНоменклатуры = Сред(НоваяСтрока, 1, Позиция - 1);
Цена = Сред(НоваяСтрока, Позиция + 1);
// Готовим коллекцию данных для последующего заполнения документа
ДанныеСтрокиДокумента = Новый Структура;
ДанныеСтрокиДокумента.Вставить("НаименованиеНоменклатуры", НаименованиеНоменклатуры);
ДанныеСтрокиДокумента.Вставить("Цена", Цена);
Результат.Добавить(ДанныеСтрокиДокумента);
КонецЦикла;
Возврат Результат;
КонецФункции
2020-06-22 17:46:32 +02:00
```
2023-02-02 15:49:00 +02:00
Теперь загрузим данные файла в ТЧ документа «Цены номенклатуры».
2022-02-02 23:41:17 +02:00
2023-02-02 15:49:00 +02:00
Создаём процедуру ЗагрузитьЦеныНоменклатуры(). Т.к. мы передаём только данные файла, можно использовать директиву НаСервереБезКонтекста:
2020-06-22 17:46:32 +02:00
```bsl
2022-02-02 23:41:17 +02:00
& НаСервереБезКонтекста
Процедура СоздатьДокумент(ДанныеФайла)
2020-06-22 17:46:32 +02:00
2023-02-02 15:49:00 +02:00
// Создаём новый документ
2022-05-02 00:43:57 +02:00
ДокументЦены = Документы.УстановкаЦен.СоздатьДокумент();
2022-02-02 23:41:17 +02:00
ДокументЦены.Дата = ТекущаяДата();
// Обходим коллекцию с данными файла и заполняем строки табличной части
Для Каждого ДанныеСтроки Из ДанныеФайла Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ДанныеСтроки.НаименованиеНоменклатуры);
// Если номенклатура не найдена, то сообщаем об этом пользователю
Если Не ЗначениеЗаполнено(Номенклатура) Тогда
ШаблонСообщения = НСтр("ru = 'Номенклатура: %1 не найдена'");
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон(ШаблонСообщения, ДанныеСтроки.НаименованиеНоменклатуры);
Сообщение.Сообщить();
Продолжить;
КонецЕсли;
НоваяСтрокаТЧ = ДокументЦены.Товары.Добавить();
НоваяСтрокаТЧ.Номенклатура = Номенклатура;
НоваяСтрокаТЧ.Цена = ДанныеСтроки.Цена;
КонецЦикла;
ДокументЦены.Записать();
2020-06-22 17:46:32 +02:00
2022-02-02 23:41:17 +02:00
КонецПроцедуры
```
2023-02-02 15:49:00 +02:00
## Задача 2. Развитие обработки для загрузки цен из файла
2022-02-02 23:41:17 +02:00
### Описание задачи
2023-02-02 15:49:00 +02:00
Если при загрузке файла выясняется, что хотя бы одной номенклатуры нет в базе, задайте вопрос пользователю с текстом «Не все номенклатурные позиции из файла существуют в справочнике. Продолжить создание документа?» и вариантами ответа «Да» и «Нет».
2022-02-02 23:41:17 +02:00
2023-02-02 15:49:00 +02:00
При ответе «Да» — записывать документ.
2022-02-02 23:41:17 +02:00
2023-02-02 15:49:00 +02:00
При ответе «Нет» — приостанавливать работу алгоритма.
2022-02-02 23:41:17 +02:00
### Требования к результату
2023-02-02 15:49:00 +02:00
Выгрузка информационной базы (.dt) из задачи 1, в которой реализован вопрос пользователю.
2022-02-02 23:41:17 +02:00
### Процесс выполнения
2023-03-21 21:55:10 +02:00
Создайте серверную функцию без контекста ПодобратьНоменклатуру(), в которой нужно перебрать в цикле все строки массива **ДанныеФайла** и выполнить поиск номенклатуры. Функция должна возвращать данные файла, дополненные ссылкой на номенклатуру.
2022-02-02 23:41:17 +02:00
```bsl
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ДанныеСтроки.НаименованиеНоменклатуры);
ДанныеСтроки.Вставить("Номенклатура", Номенклатура);
2020-06-22 17:46:32 +02:00
```
2022-02-02 23:41:17 +02:00
2023-03-21 21:55:10 +02:00
Данную функцию следует вызвать в обработчике команды после чтения данных файла.
Далее обойдите массив и проверьте для всей ли номенклатуры подобраны ссылки, если есть номенклатура без ссылки, то нужно задать пользователю вопрос нужно ли сохранить документ с помощью функции **ВопросАсинх** . В противном случае сразу сохраните документ.
2022-02-02 23:41:17 +02:00
2023-03-21 21:55:10 +02:00
Если пользователь ответил «Да», то сохраните документ.
2022-02-02 23:41:17 +02:00
2023-03-21 21:55:10 +02:00
Для заполнения и сохранения документа используйте уже ранее полученные и сохранённые в данных файла ссылки на номенклатуру. Если номенклатура для какой-то строки не заполнена, то такая строка не должна добавляться в документ. Не должно быть строк с пустой номенклатурой.
2022-05-02 00:45:06 +02:00
2023-02-02 15:49:00 +02:00
### Подсказка: [результат выполнения домашнего задания](Examples/homework-5-7-example.md).