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:
parent
05e053ee9f
commit
81010ff6b1
@ -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)
|
||||||
|
|
||||||
## Запросы и отчеты
|
## Запросы и отчеты
|
||||||
|
@ -8,14 +8,13 @@
|
|||||||
|
|
||||||
Создадим обработку для загрузки цен из файла CSV.
|
Создадим обработку для загрузки цен из файла CSV.
|
||||||
|
|
||||||
Обработка создает новый документ Цены номенклатуры,
|
Обработка создает новый документ Цены номенклатуры, в табличной части заполняет данные из файла.
|
||||||
в ТЧ заполняет данные из файла.
|
|
||||||
|
|
||||||
### Требования к результату
|
### Требования к результату
|
||||||
|
|
||||||
Выгрузка информационной базы (.dt), csv-файл содержащий список номенклатуры с ценами.
|
Выгрузка информационной базы (.dt), csv-файл содержащий список номенклатуры с ценами.
|
||||||
|
|
||||||
Возможность выбора файла с фильтром *.CSV
|
Возможность выбора файла с фильтром *.CSV, обработка файла должна выполняться на клиенте.
|
||||||
|
|
||||||
В файле разделитель ";" между колонками
|
В файле разделитель ";" между колонками
|
||||||
|
|
||||||
|
137
homework-5-8.md
137
homework-5-8.md
@ -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 не найдена'");
|
||||||
|
|
||||||
|
Сообщение = Новый СообщениеПользователю;
|
||||||
|
Сообщение.Текст = СтрШаблон(ШаблонСообщения, ИмяНоменклатуры);
|
||||||
|
Сообщение.Сообщить();
|
||||||
|
|
||||||
|
Продолжить;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
// Добавим в документ новую строку табличной части - реализуйте здесь соответствующий алгоритм
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
// Запишем документ - реализуйте здесь соответствующий алгоритм
|
||||||
|
|
||||||
|
УдалитьФайлы(ИмяПромежуточногоФайла);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
```
|
||||||
|
|
||||||
|
Реализуем в процедуре ВыполнитьЗагрузкуНаСервере алгоритм по созданию, заполнению и записи документа на основании данных табличного документа.
|
112
homework-5-9.md
112
homework-5-9.md
@ -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
BIN
img/homework-5-8-1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
BIN
reference-data/homework-5-8-price.xlsx
Normal file
BIN
reference-data/homework-5-8-price.xlsx
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user