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

185 lines
11 KiB
Markdown
Raw Normal View History

2023-02-02 16:59:01 +03:00
# Задание к занятию «Табличные и текстовые документы»
2020-06-01 00:38:56 +08:00
2023-02-02 16:59:01 +03:00
Результат выполнения двух задач вышлите одним файлом (.dt).
2023-02-02 16:59:01 +03:00
## Задача 1. Создать команду печати прайс-листа в справочнике «Номенклатура» в табличный документ.
2020-06-24 00:09:00 +08:00
### Описание задачи
2023-02-02 16:59:01 +03:00
Добавить возможность формирования прайс-листа в справочнике «Номенклатура».
2020-06-24 00:09:00 +08:00
### Требования к результату
2023-02-02 16:59:01 +03:00
Выгрузка информационной базы (.dt) с конфигурацией из предыдущих заданий имеет возможность формировать прайс-лист из формы списка номенклатуры.
2020-06-24 15:24:25 +08:00
2023-02-02 16:59:01 +03:00
Прайс формируется на основе выделенных строк в форме списка «Номенклатура».
2020-06-24 15:24:25 +08:00
Цена номенклатуры определяется на текущую дату.
2020-06-24 00:09:00 +08:00
2020-06-24 15:24:25 +08:00
Можно выделить одну или несколько строк для формирования печатной формы.
2020-06-24 01:40:49 +08:00
2020-06-24 00:09:00 +08:00
### Процесс выполнения
2023-02-02 16:59:01 +03:00
1. Добавим общий макет «МакетПрайсЛист» с типом Табличный документ.
2020-06-24 00:09:00 +08:00
2023-02-02 16:59:01 +03:00
Создадим в нём области:
- «ШапкаПрайса» с полем «Дата»;
- «ТабличнаяЧастьЗаголовок» с именами колонок, которые будут выводится на печать;
- «ТабличнаяЧастьСтрока» с полями «Товар» и «Цена».
2023-02-02 16:59:01 +03:00
2. В форму списка номенклатуры добавим команду «Прайс-лист».
2020-06-24 01:37:07 +08:00
2023-02-02 16:59:01 +03:00
3. Для печати добавим процедуру на клиенте:
2020-06-24 01:37:07 +08:00
```bsl
&НаКлиенте
Процедура КомандаПрайсЛист(Команда)
//выделим несколько строк
МассивСтрок = Элементы.Список.ВыделенныеСтроки;
2020-06-24 01:37:07 +08:00
//отправим выделенные строки номенклатуры на печать
ПечатнаяФорма = ПечатнаяФормаПрайсЛист(МассивСтрок);
2020-06-24 01:37:07 +08:00
ПечатнаяФорма.Показать("Прайс-лист");
КонецПроцедуры
```
2023-02-02 17:02:54 +03:00
4. На сервере формируем печатную форму и возращаем на клиент для печати:
2020-06-24 01:37:07 +08:00
```bsl
&НаСервере
Функция ПечатнаяФормаПрайсЛист(МассивСтрок)
2020-06-24 01:37:07 +08:00
ПечатнаяФорма = Новый ТабличныйДокумент;
ПечатнаяФорма.ОтображатьСетку = Ложь;
ПечатнаяФорма.ОтображатьЗаголовки = Ложь;
2020-06-24 01:37:07 +08:00
Макет = ПолучитьОбщийМакет("МакетПрайсЛист");
// Получаем область шапки и макета по имени
Шапка = Макет.ПолучитьОбласть("ШапкаПрайса");
// Заполняем параметр Дата
Шапка.Параметры.Дата = ТекущаяДата();
// Выводим область в документ
ПечатнаяФорма.Вывести(Шапка);
// Получаем область заголовка
ТабличнаяЧастьЗаголовок = Макет.ПолучитьОбласть("ТабличнаяЧастьЗаголовок");
2020-06-24 01:37:07 +08:00
ПечатнаяФорма.Вывести(ТабличнаяЧастьЗаголовок);
// Получаем область строк для формирования табличной части в цикле
ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьСтрока");
2020-06-24 01:37:07 +08:00
Для каждого СтрокаСписка из МассивСтрок Цикл
ТабличнаяЧастьСтрока.Параметры.Номенклатура = СтрокаСписка;
ТабличнаяЧастьСтрока.Параметры.Цена = 100; //Здесь необходимо получить текущую цену товара и установить ее
2020-06-24 01:37:07 +08:00
ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
КонецЦикла;
// Возвращаем печатную форму обратно на клиент
Возврат ПечатнаяФорма;
КонецФункции
```
2020-06-24 00:09:00 +08:00
2023-02-02 16:59:01 +03:00
5. Получим срез последних по регистру сведений «Цены номенклатуры» для заполнения цены и вставим в соответствующий параметр.
2023-02-02 16:59:01 +03:00
Примерный внешний вид печатной формы, которая должна получиться:
![Пример печатной формы](img/homework-5-8-1.png)
2023-02-02 16:59:01 +03:00
## Задача 2. Создать обработку для загрузки прайса из файла Excel (*.xlsx)
### Описание задачи
Создадим обработку для загрузки цен из файла xlsx.
2023-02-02 17:02:54 +03:00
Обработка создаёт новый документ «Цены номенклатуры» в табличной части и заполняет данные из файла.
### Требования к результату
2023-02-02 16:59:01 +03:00
Выгрузка информационной базы (.dt).
2023-02-02 16:59:01 +03:00
Файл для тестирования загрузки: [homework-5-8-price](reference-data/homework-5-8-price.xlsx).
Возможность выбора файла с фильтром *.xlsx, обработка файла должна выполняться на сервере.
2023-02-02 16:59:01 +03:00
Возможность загрузить и создать документ «Цены номенклатуры».
Поиск номенклатуры по наименованию
Если не найдена, вывести сообщение вида
2023-02-02 16:59:01 +03:00
«Номенклатура: « + НаименованиеНоменклатуры + » не найдена».
### Процесс выполнения
2023-02-02 16:59:01 +03:00
Создать новую обработку «Загрузка прайса из файла xlsx».
2023-02-02 16:59:01 +03:00
Добавим команду «Загрузить», вынесем в командную панель формы и назначим кнопкой по умолчанию.
Назначим обработчик команды со следующим алгоритмом:
```bsl
ПараметрыПомещенияФайла = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыПомещенияФайла.Фильтр = НСтр("ru = 'Файл xlsx'; en = 'File xlsx'")
+ "(*.xlsx)|*.xlsx";
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, ПараметрыПомещенияФайла, УникальныйИдентификатор);
Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;
Если ОписаниеФайла.ПомещениеФайлаОтменено Тогда
Возврат;
КонецЕсли;
ВыполнитьЗагрузкуНаСервере(ОписаниеФайла.Адрес);
```
2023-02-02 16:59:01 +03:00
Так как в обработчике используется ключевое слово «Ждать», перед словом «Процедура» добавим **Асинх**.
2023-02-02 16:59:01 +03:00
Далее на сервере сохраним данные во временный файл, прочитаем и обработаем данные с помощью табличного документа:
```bsl
&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(Адрес)
Данные = ПолучитьИзВременногоХранилища(Адрес);
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xlsx");
Данные.Записать(ИмяПромежуточногоФайла);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяПромежуточногоФайла);
// Создадим новый документ - реализуйте здесь соответствующий алгоритм
// Начинаем со 2 строки т.к. в 1-й заголовки колонок
Для Сч = 2 По ТабличныйДокумент.ВысотаТаблицы Цикл
ИмяНоменклатуры = ТабличныйДокумент.Область(Сч, 1).Текст;
Цена = ТабличныйДокумент.Область(Сч, 2).Текст;
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ИмяНоменклатуры);
Если Не ЗначениеЗаполнено(Номенклатура) Тогда
ШаблонСообщения = НСтр("ru = 'Номенклатура: %1 не найдена'");
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон(ШаблонСообщения, ИмяНоменклатуры);
Сообщение.Сообщить();
Продолжить;
КонецЕсли;
// Добавим в документ новую строку табличной части - реализуйте здесь соответствующий алгоритм
КонецЦикла;
// Запишем документ - реализуйте здесь соответствующий алгоритм
УдалитьФайлы(ИмяПромежуточногоФайла);
КонецПроцедуры
```
Реализуем в процедуре ВыполнитьЗагрузкуНаСервере алгоритм по созданию, заполнению и записи документа на основании данных табличного документа.
Перед записью документа проверим заполнение документа. Если не заполнены обязательные реквизиты или нет ни одной строки в табличной части выведем ошибку и не будем записывать документ.
2023-02-02 16:59:01 +03:00
### Подсказка: [результат выполнения домашнего задания](Examples/homework-5-8-example.md).