1
0
mirror of https://github.com/netology-code/1c-homeworks.git synced 2025-02-10 18:10:35 +02:00

Переработка домашних задачий по работе с файлами в 5 модуле

This commit is contained in:
Matvey Seregin 2022-02-05 23:59:16 +03:00
parent 05e053ee9f
commit 81010ff6b1
6 changed files with 193 additions and 63 deletions

View File

@ -49,7 +49,7 @@
5.5 [Виртуальные таблицы регистров](homework-5-5.md) 5.5 [Виртуальные таблицы регистров](homework-5-5.md)
5.6 [Последовательность и журналы](homework-5-6.md) 5.6 [Последовательность и журналы](homework-5-6.md)
5.7 [Файлы](homework-5-7.md) 5.7 [Файлы](homework-5-7.md)
5.8 [Текстовые документы](homework-5-8.md) 5.8 [Табличные и текстовые документы](homework-5-8.md)
5.9 [Двоичные данные](homework-5-9.md) 5.9 [Двоичные данные](homework-5-9.md)
## Запросы и отчеты ## Запросы и отчеты

View File

@ -8,14 +8,13 @@
Создадим обработку для загрузки цен из файла CSV. Создадим обработку для загрузки цен из файла CSV.
Обработка создает новый документ Цены номенклатуры, Обработка создает новый документ Цены номенклатуры, в табличной части заполняет данные из файла.
в ТЧ заполняет данные из файла.
### Требования к результату ### Требования к результату
Выгрузка информационной базы (.dt), csv-файл содержащий список номенклатуры с ценами. Выгрузка информационной базы (.dt), csv-файл содержащий список номенклатуры с ценами.
Возможность выбора файла с фильтром *.CSV Возможность выбора файла с фильтром *.CSV, обработка файла должна выполняться на клиенте.
В файле разделитель ";" между колонками В файле разделитель ";" между колонками

View File

@ -1,6 +1,8 @@
# Задание к занятию "Текстовые и табличные документы" # Задание к занятию "Табличные и текстовые документы"
## Задача 1 Создать команду печати прайс-листа в справочнике Номенклатура в текстовый документ. Результат выполнения двух задач вышлите одним файлом (.dt)
## Задача 1 Создать команду печати прайс-листа в справочнике Номенклатура в табличный документ.
### Описание задачи ### Описание задачи
@ -18,30 +20,14 @@
### Процесс выполнения ### Процесс выполнения
1. Добавим общий макет "МакетПрайсЛист" с типом Текстовый документ. 1. Добавим общий макет "МакетПрайсЛист" с типом Табличный документ.
Пример текста. Создадим в нем области:
``` - "ШапкаПрайса" с полем Дата;
#Область ШапкаПрайса - "ТабличнаяЧастьЗаголовок" с именами колонок, которые будут выводится на печать;
#Поле ТекущаяДата - "ТабличнаяЧастьСтрока" и полями Дата и Цена.
[ Дата]
#КонецОбласти
#Область ТабличнаяЧастьЗаголовок 2. В форму списка номенклатуры добавим команду "Прайс лист".
---------------------------------
Товар | Цена, рублей
#КонецОбласти
#Область ТабличнаяЧастьСтрока
#Поле Номенклатура
#Формат "ЧЦ=12; ЧДЦ=2;ЧРД=."
#Забивать Истина
#Поле Цена
#Выравнивание Центр
---------------------------------
[Номенклатура ]|[Цена ]
```
2. В форму списка номенклатуры добавим команду "Прайс лист (в текстовый документ)".
3. Для печати добавим на клиенте процедуру на клиенте. 3. Для печати добавим на клиенте процедуру на клиенте.
```bsl ```bsl
@ -51,7 +37,7 @@
//выделим несколько строк //выделим несколько строк
МассивСтрок = Элементы.Список.ВыделенныеСтроки; МассивСтрок = Элементы.Список.ВыделенныеСтроки;
//отправим выделенные строки номенклатуры на печать //отправим выделенные строки номенклатуры на печать
ПечатнаяФорма = ПечатнаяФормаПрайсЛистТекстовыйДокумент(МассивСтрок); ПечатнаяФорма = ПечатнаяФормаПрайсЛист(МассивСтрок);
ПечатнаяФорма.Показать("Прайс-лист"); ПечатнаяФорма.Показать("Прайс-лист");
КонецПроцедуры КонецПроцедуры
@ -60,9 +46,11 @@
```bsl ```bsl
&НаСервере &НаСервере
Функция ПечатнаяФормаПрайсЛистТекстовыйДокумент(МассивСтрок) Функция ПечатнаяФормаПрайсЛист(МассивСтрок)
ПечатнаяФорма = Новый ТекстовыйДокумент; ПечатнаяФорма = Новый ТабличныйДокумент;
ПечатнаяФорма.ОтображатьСетку = Ложь;
ПечатнаяФорма.ОтображатьЗаголовки = Ложь;
Макет = ПолучитьОбщийМакет("МакетПрайсЛист"); Макет = ПолучитьОбщийМакет("МакетПрайсЛист");
@ -74,11 +62,11 @@
ПечатнаяФорма.Вывести(Шапка); ПечатнаяФорма.Вывести(Шапка);
// Получаем область заголовка // Получаем область заголовка
ТабличнаяЧастьЗаголовок = Макет.ПолучитьОбласть("ТабличнаяЧастьПрайсаЗаголовок"); ТабличнаяЧастьЗаголовок = Макет.ПолучитьОбласть("ТабличнаяЧастьЗаголовок");
ПечатнаяФорма.Вывести(ТабличнаяЧастьЗаголовок); ПечатнаяФорма.Вывести(ТабличнаяЧастьЗаголовок);
// Получаем область строк для формирования табличной части в цикле // Получаем область строк для формирования табличной части в цикле
ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьПрайсаСтрока"); ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьСтрока");
Для каждого СтрокаСписка из МассивСтрок Цикл Для каждого СтрокаСписка из МассивСтрок Цикл
ТабличнаяЧастьСтрока.Параметры.Номенклатура = СтрокаСписка; ТабличнаяЧастьСтрока.Параметры.Номенклатура = СтрокаСписка;
@ -94,22 +82,99 @@
5. Получим срез последних по регистру сведений Цены номенклатуры для заполнения цены и вставим в соответствующий параметр. 5. Получим срез последних по регистру сведений Цены номенклатуры для заполнения цены и вставим в соответствующий параметр.
## Задача 2 Создать команду печати прайс-листа в справочнике Номенклатура в табличный документ. Примерный внешний вид печатной формы, которая должна получится:
![Пример печатной формы](img/homework-5-8-1.png)
## Задача 2 Создать обработку для загрузки прайса из файла Excel (*.xlsx)
### Описание задачи ### Описание задачи
Добавить возможность формирования прайс-листа в справочнике Номенклатура в табличный документ. Создадим обработку для загрузки цен из файла xlsx.
Обработка создает новый документ Цены номенклатуры, в табличной части заполняет данные из файла.
### Требования к результату ### Требования к результату
Выгрузка информационной базы (.dt) с конфигурацией из предыдущих заданий, имеет возможность формировать прайс листа из формы списка номенклатуры в табличный документ. Выгрузка информационной базы (.dt)
Прайс формируется на основе выделенных строк в форме списка Номенклатура. Файл для тестирования загрузки: [homework-5-8-price](reference-data/homework-5-8-price.xlsx)
Цена номенклатуры определяется на текущую дату. Возможность выбора файла с фильтром *.xlsx, обработка файла должна выполняться на сервере.
Можно выделить одну или несколько строк для формирования печатной формы. Возможность загрузить и создать документ Цены номенклатуры.
Поиск номенклатуры по наименованию
Если не найдена, вывести сообщение вида
"Номенклатура: " + НаименованиеНоменклатуры + " не найдена"
### Процесс выполнения ### Процесс выполнения
Процесс выполнения аналогичен первой задаче, но вместо текстового макета необходимо создать макет табличного документа и вывести информацию в него. Создать новую обработку "Загрузка прайса из файла xlsx"
Добавим команду Загрузить, вынесем в командную панель формы и назначим кнопкой по умолчанию
Назначим обработчик команды со следующим алгоритмом:
```bsl
ПараметрыПомещенияФайла = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыПомещенияФайла.Фильтр = НСтр("ru = 'Файл xlsx'; en = 'File xlsx'")
+ "(*.xlsx)|*.xlsx";
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, ПараметрыПомещенияФайла, УникальныйИдентификатор);
Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;
Если ОписаниеФайла.ПомещениеФайлаОтменено Тогда
Возврат;
КонецЕсли;
ВыполнитьЗагрузкуНаСервере(ОписаниеФайла.Адрес);
```
Так как в обработчике используется ключевое слово Ждать перед словом Процедура добавим **Асинх**
Далее на сервере сохраним данные во временный файл, прочитаем и обработаем данные с помощью табличного документа
```bsl
&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(Адрес)
Данные = ПолучитьИзВременногоХранилища(Адрес);
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xlsx");
Данные.Записать(ИмяПромежуточногоФайла);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяПромежуточногоФайла);
// Создадим новый документ - реализуйте здесь соответствующий алгоритм
// Начинаем со 2 строки т.к. в 1-й заголовки колонок
Для Сч = 2 По ТабличныйДокумент.ВысотаТаблицы Цикл
ИмяНоменклатуры = ТабличныйДокумент.Область(Сч, 1).Текст;
Цена = ТабличныйДокумент.Область(Сч, 2).Текст;
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ИмяНоменклатуры);
Если Не ЗначениеЗаполнено(Номенклатура) Тогда
ШаблонСообщения = НСтр("ru = 'Номенклатура: %1 не найдена'");
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон(ШаблонСообщения, ИмяНоменклатуры);
Сообщение.Сообщить();
Продолжить;
КонецЕсли;
// Добавим в документ новую строку табличной части - реализуйте здесь соответствующий алгоритм
КонецЦикла;
// Запишем документ - реализуйте здесь соответствующий алгоритм
УдалитьФайлы(ИмяПромежуточногоФайла);
КонецПроцедуры
```
Реализуем в процедуре ВыполнитьЗагрузкуНаСервере алгоритм по созданию, заполнению и записи документа на основании данных табличного документа.

View File

@ -1,5 +1,7 @@
# Задание к занятию "Двоичные данные" # Задание к занятию "Двоичные данные"
Результат выполнения первых двух задач вышлите одним файлом (.dt)
## Задача 1 Создать в справочнике Номенклатура возможность загрузки и хранения картинки. ## Задача 1 Создать в справочнике Номенклатура возможность загрузки и хранения картинки.
### Описание задачи ### Описание задачи
@ -20,39 +22,40 @@
3. Добавим на событие Нажатие процедуру "ПутьКартинкиНажатие". 3. Добавим на событие Нажатие процедуру "ПутьКартинкиНажатие".
4. Внутри процедуры добавим выбор файла с логичными для этого фильтрами отбора формата файла. 4. Внутри процедуры вызовем асинхронную процедуру для выбора файла с картинкой. Дополнительная процедура нужна т.к. обработчик элемента формы не может быть асинхронной процедурой.
```bsl ```bsl
&НаКлиенте &НаКлиенте
Процедура ПутьКартинкиНажатие(Элемент, СтандартнаяОбработка) Процедура ПутьКартинкиНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); СтандартнаяОбработка = Ложь;
ДиалогВыбораФайла.Фильтр = "Картинка (*.jpg)|*.jpg";
ОписаниеОповещения = Новый ОписаниеОповещения("ПутьКартинкиНажатиеПослеДиалога", ПрочитатьКартинкуНоменклатуры();
ЭтотОбъект);
ДиалогВыбораФайла.Показать(ОписаниеОповещения);
КонецПроцедуры КонецПроцедуры
``` ```
Используем асинхронный способ. Добавим выбор файла с логичными для этого фильтрами отбора формата файла, проверим, что пользователь выбрал файл и сохраним адрес временного хранилища.
```bsl ```bsl
&НаКлиенте &НаКлиенте
Процедура ПутьКартинкиНажатиеПослеДиалога(ВыбранныеФайлы, ДопПараметры) Экспорт Асинх Процедура ПрочитатьКартинкуНоменклатуры()
ОписаниеОповещения = Новый ОписаниеОповещения("ПутьКартинкиНажатиеПослеПомещения",
ЭтотОбъект); ПараметрыПомещенияФайла = Новый ПараметрыДиалогаПомещенияФайлов;
НачатьПомещениеФайлаНаСервер(ОписаниеОповещения,,,, ПараметрыПомещенияФайла.Фильтр = "Картинка (*.jpg)|*.jpg";
ВыбранныеФайлы[0],
УникальныйИдентификатор) ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, ПараметрыПомещенияФайла, УникальныйИдентификатор);
КонецПроцедуры
``` Если ОписаниеФайла = Неопределено Тогда
Возврат;
Сохраним картинку во временное хранилище. КонецЕсли;
```bsl Если ОписаниеФайла.ПомещениеФайлаОтменено Тогда
&НаКлиенте Возврат;
Процедура ПутьКартинкиНажатиеПослеПомещения(ОписаниеФайла, ДопПараметры) Экспорт КонецЕсли;
ПутьКартинки = ОписаниеФайла.Адрес; ПутьКартинки = ОписаниеФайла.Адрес;
КонецПроцедуры КонецПроцедуры
``` ```
@ -77,8 +80,71 @@
ПутьКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); ПутьКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецПроцедуры КонецПроцедуры
``` ```
## Задача 2 Сохранение картинки номенклатуры с установленной шириной
## Задача 2 (со звездочкой) Разбить файл на части и склеить после этого. ### Описание задачи
Добавить возможность сохранения в файл картинки номенклатуры с шириной 100 писелей
### Требования к результату
Выгрузка информационной базы (.dt) с конфигурацией из предыдущих заданий, в которой реализована возможность загружать и просматривать из формы элемента номенклатуры.
Ранее выбранную картинку номенклатуры можно сохранить в файл, при этом ширина сохраненной картинки будет 100 пикселей.
### Процесс выполнения
1. Добавим на форму элемента справочника Номенклатура команду СохранитьКартинку, создадим связанную с командой кнопку на коммандной панели формы.
2. Реализуем обработчик команды, в котором вызовем серверный метод для подготовки картинки и предложим пользователю сохранить картинку.
```bsl
&НаКлиенте
Асинх Процедура СохранитьКартинку(Команда)
АдресРезультата = ПодготовитьКартинку();
// Если для номенклатуры не загружена каритка, то не будем открывать окно сохранения файла
Если Не ЗначениеЗаполнено(АдресРезультата) Тогда
Возврат;
КонецЕсли;
ПараметрыПолученияФайла = Новый ПараметрыДиалогаПолученияФайлов;
ПолучитьФайлССервераАсинх(АдресРезультата, Объект.Наименование + ".jpg", ПараметрыПолученияФайла);
КонецПроцедуры
```
3. Реализуем на сервере функцию для подготовки картинки.
```bsl
&НаСервере
Функция ПодготовитьКартинку()
ДвоичныеДанныеИзображения = ПолучитьИзВременногоХранилища(ПутьКартинки);
Если ДвоичныеДанныеИзображения = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Картинка номенклатуры не загружена";
Сообщение.Сообщить();
Возврат Неопределено;
КонецЕсли;
Картинка = Новый Картинка(ДвоичныеДанныеИзображения);
ОбрабатываемаяКартинка = Новый ОбрабатываемаяКартинка(Картинка);
ОбрабатываемаяКартинка.УстановитьРазмер(100, Неопределено);
Картинка = ОбрабатываемаяКартинка.ПолучитьКартинку();
ДвоичныеДанныеИзображения = Картинка.ПолучитьДвоичныеДанные();
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанныеИзображения, УникальныйИдентификатор);
КонецФункции
```
## Задача 3 (со звездочкой) Разбить файл на части и склеить после этого.
### Описание задачи ### Описание задачи

BIN
img/homework-5-8-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.