1
0
mirror of https://github.com/netology-code/1c-homeworks.git synced 2024-11-24 08:02:20 +02:00
1c-homeworks/homework-5-8.md
2023-02-15 23:32:44 +03:00

11 KiB

Задание к занятию «Табличные и текстовые документы»

Результат выполнения двух задач вышлите одним файлом (.dt).

Задача 1. Создать команду печати прайс-листа в справочнике «Номенклатура» в табличный документ.

Описание задачи

Добавить возможность формирования прайс-листа в справочнике «Номенклатура».

Требования к результату

Выгрузка информационной базы (.dt) с конфигурацией из предыдущих заданий имеет возможность формировать прайс-лист из формы списка номенклатуры.

Прайс формируется на основе выделенных строк в форме списка «Номенклатура».

Цена номенклатуры определяется на текущую дату.

Можно выделить одну или несколько строк для формирования печатной формы.

Процесс выполнения

  1. Добавим общий макет «МакетПрайсЛист» с типом Табличный документ.

    Создадим в нём области:

    • «ШапкаПрайса» с полем «Дата»;
    • «ТабличнаяЧастьЗаголовок» с именами колонок, которые будут выводится на печать;
    • «ТабличнаяЧастьСтрока» с полями «Товар» и «Цена».
  2. В форму списка номенклатуры добавим команду «Прайс-лист».

  3. Для печати добавим процедуру на клиенте:

&НаКлиенте
Процедура КомандаПрайсЛист(Команда)
	
	//выделим несколько строк
	МассивСтрок = Элементы.Список.ВыделенныеСтроки;
	//отправим выделенные строки номенклатуры на печать
	ПечатнаяФорма = ПечатнаяФормаПрайсЛист(МассивСтрок);
	ПечатнаяФорма.Показать("Прайс-лист");
	
КонецПроцедуры
  1. На сервере формируем печатную форму и возращаем на клиент для печати:
&НаСервере
Функция ПечатнаяФормаПрайсЛист(МассивСтрок)
	
	ПечатнаяФорма = Новый ТабличныйДокумент;
	ПечатнаяФорма.ОтображатьСетку = Ложь;
	ПечатнаяФорма.ОтображатьЗаголовки = Ложь;
	
	Макет = ПолучитьОбщийМакет("МакетПрайсЛист");
	
	// Получаем область шапки и макета по имени
	Шапка = Макет.ПолучитьОбласть("ШапкаПрайса");
	// Заполняем параметр Дата
	Шапка.Параметры.Дата = ТекущаяДата();
	// Выводим область в документ
	ПечатнаяФорма.Вывести(Шапка);
	
	// Получаем область заголовка
	ТабличнаяЧастьЗаголовок = Макет.ПолучитьОбласть("ТабличнаяЧастьЗаголовок");
	ПечатнаяФорма.Вывести(ТабличнаяЧастьЗаголовок);
	
	// Получаем область строк для формирования табличной части в цикле
	ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьСтрока");
	
	Для каждого СтрокаСписка из МассивСтрок Цикл
		ТабличнаяЧастьСтрока.Параметры.Номенклатура = СтрокаСписка; 
		ТабличнаяЧастьСтрока.Параметры.Цена = 100; //Здесь необходимо получить текущую цену товара и установить ее  
		ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
	КонецЦикла;
	
	// Возвращаем печатную форму обратно на клиент
	Возврат ПечатнаяФорма;
	
КонецФункции
  1. Получим срез последних по регистру сведений «Цены номенклатуры» для заполнения цены и вставим в соответствующий параметр.

Примерный внешний вид печатной формы, которая должна получиться:

Пример печатной формы

Задача 2. Создать обработку для загрузки прайса из файла Excel (*.xlsx)

Описание задачи

Создадим обработку для загрузки цен из файла xlsx.

Обработка создаёт новый документ «Цены номенклатуры» в табличной части и заполняет данные из файла.

Требования к результату

Выгрузка информационной базы (.dt).

Файл для тестирования загрузки: homework-5-8-price.

Возможность выбора файла с фильтром *.xlsx, обработка файла должна выполняться на сервере.

Возможность загрузить и создать документ «Цены номенклатуры».

Поиск номенклатуры по наименованию

Если не найдена, вывести сообщение вида «Номенклатура: « + НаименованиеНоменклатуры + » не найдена».

Процесс выполнения

Создать новую обработку «Загрузка прайса из файла xlsx».

Добавим команду «Загрузить», вынесем в командную панель формы и назначим кнопкой по умолчанию. Назначим обработчик команды со следующим алгоритмом:

	ПараметрыПомещенияФайла = Новый ПараметрыДиалогаПомещенияФайлов;  
	ПараметрыПомещенияФайла.Фильтр = НСтр("ru = 'Файл xlsx'; en = 'File xlsx'")
		+ "(*.xlsx)|*.xlsx";
	ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, ПараметрыПомещенияФайла, УникальныйИдентификатор);
	
	Если ОписаниеФайла = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ОписаниеФайла.ПомещениеФайлаОтменено Тогда
		Возврат;
	КонецЕсли;
	
	ВыполнитьЗагрузкуНаСервере(ОписаниеФайла.Адрес);

Так как в обработчике используется ключевое слово «Ждать», перед словом «Процедура» добавим Асинх.

Далее на сервере сохраним данные во временный файл, прочитаем и обработаем данные с помощью табличного документа:

&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(Адрес)
	
	Данные = ПолучитьИзВременногоХранилища(Адрес);
	ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	Данные.Записать(ИмяПромежуточногоФайла);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.Прочитать(ИмяПромежуточногоФайла);
	
	// Создадим новый документ - реализуйте здесь соответствующий алгоритм   
	
	// Начинаем со 2 строки т.к. в 1-й заголовки колонок
	Для Сч = 2 По ТабличныйДокумент.ВысотаТаблицы Цикл 
		ИмяНоменклатуры = ТабличныйДокумент.Область(Сч, 1).Текст;
		Цена = ТабличныйДокумент.Область(Сч, 2).Текст;		
		
		Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ИмяНоменклатуры);
		
		Если Не ЗначениеЗаполнено(Номенклатура) Тогда
			
			ШаблонСообщения = НСтр("ru = 'Номенклатура: %1 не найдена'");
			
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = СтрШаблон(ШаблонСообщения, ИмяНоменклатуры);
			Сообщение.Сообщить();
			
			Продолжить;
			
		КонецЕсли;
		
		// Добавим в документ новую строку табличной части - реализуйте здесь соответствующий алгоритм     
		
	КонецЦикла;
	
	// Запишем документ - реализуйте здесь соответствующий алгоритм
	
	УдалитьФайлы(ИмяПромежуточногоФайла);
	
КонецПроцедуры

Реализуем в процедуре ВыполнитьЗагрузкуНаСервере алгоритм по созданию, заполнению и записи документа на основании данных табличного документа.

Перед записью документа проверим заполнение документа. Если не заполнены обязательные реквизиты или нет ни одной строки в табличной части выведем ошибку и не будем записывать документ.

Подсказка: результат выполнения домашнего задания.