Опубликован: 21.09.2010 | Уровень: для всех | Доступ: платный
Лекция 8:

Отчеты

Теперь переходим к рассмотрению процедуры, ответственной за формирование этого отчета.

Процедура ОстаткиМатериалов(ТабДок, Дата, Ответственный) Экспорт
	Макет = ОтчетОбъект.ПолучитьМакет("ОстаткиМатериалов");
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ОстаткиМатериаловОстатки.ЦентрОтветственности КАК ЦентрОтветственности,
	|	ПРЕДСТАВЛЕНИЕ(ОстаткиМатериаловОстатки.ЦентрОтветственности),
	|	ОстаткиМатериаловОстатки.Номенклатура,
	|	ПРЕДСТАВЛЕНИЕ(ОстаткиМатериаловОстатки.Номенклатура),
	|	ОстаткиМатериаловОстатки.КоличествоОстаток
	|ИЗ
	|	РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, ЦентрОтветственности = &Ответственный) 
                                КАК ОстаткиМатериаловОстатки
	|ИТОГИ ПО
	|	ЦентрОтветственности";

	Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
	Запрос.УстановитьПараметр("Ответственный", Ответственный);

	Результат = Запрос.Выполнить();

	ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
	ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
	ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
	ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
	ОбластьЦентрОтветственности = Макет.ПолучитьОбласть("ЦентрОтветственности");
	ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");

	ТабДок.Очистить();
	ТабДок.Вывести(ОбластьЗаголовок);
	ТабДок.Вывести(ОбластьШапкаТаблицы);
	ТабДок.НачатьАвтогруппировкуСтрок();

	ВыборкаЦентрОтветственности = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

	Пока ВыборкаЦентрОтветственности.Следующий() Цикл
		ОбластьЦентрОтветственности.Параметры.Заполнить(ВыборкаЦентрОтветственности);
		ТабДок.Вывести(ОбластьЦентрОтветственности, ВыборкаЦентрОтветственности.Уровень());

		ВыборкаДетали = ВыборкаЦентрОтветственности.Выбрать();

		Пока ВыборкаДетали.Следующий() Цикл
			ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
			ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
		КонецЦикла;
	КонецЦикла;

	ТабДок.ЗакончитьАвтогруппировкуСтрок();
	ТабДок.Вывести(ОбластьПодвалТаблицы);
	ТабДок.Вывести(ОбластьПодвал);

КонецПроцедуры
Листинг .

Приступим к разбору тех частей этой процедуры, которые являются для вас новыми. Так, обратите внимание на то, что каждая новая строка текста запроса начинается с вертикальной черты. Если попытаться ввести текст запроса в код модуля, не разбив его таким образом - система выдаст ошибку.

Обратите внимание на блок ИЗ в теле текста запроса:

|ИЗ
|	РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, ЦентрОтветственности = &Ответственный) КАК ОстаткиМатериаловОстатки

Именно здесь задаются параметры виртуальной таблицы - Дата и Ответственный. Причем, просто задать параметры и даже передать их в процедуру, содержащую текст запроса, недостаточно для того, чтобы они были переданы в запрос. Следующими командами параметры, переданные в процедуру ОстаткиМатериалов() передаются в запрос.

Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
Запрос.УстановитьПараметр("Ответственный", Ответственный);

Обратите внимание на то, что параметры в запрос передают после того, как в свойство запроса Текст записан текст запроса, но до выполнения запроса.

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

Обратите внимание на следующие команды, одна из которых предшествует командам вывода данных в табличное поле, а другая находится после завершения вывода, но перед окончательным отображением таблицы:

ТабДок.НачатьАвтогруппировкуСтрок();
//Команды вывода данных в табличный документ
ТабДок.ЗакончитьАвтогруппировкуСтрок();

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

Уровень записи - это число, которое представляет собой уровень этой записи в иерархии и группировках.

ВыборкаЦентрОтветственности = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Эта команда получает выборку результатов запроса, обходя запрос по группировкам. В дальнейшем мы будем получать данные именно из переменной ВыборкаЦентрОтветственности.

Пока ВыборкаЦентрОтветственности.Следующий() Цикл

Эта команда открывает цикл обхода выборки. Метод Следующий() возвращает Истина, если в выборке еще есть данные, первый его вызов позиционируется на первый элемент выборки. После того, как этот метод возвратит Ложь - это будет означать, что предыдущий вызов метода отработал для последней строки выборки. Первая строка выборки (за счет использования выше команды Выбрать(ОбходРезультатЗапроса.ПоГруппировкам) ) получает первую группировку - она представляет собой данные об ответственном сотруднике, по которому будут сгруппированы строки с информацией о номенклатуре.

ОбластьЦентрОтветственности.Параметры.Заполнить(ВыборкаЦентрОтветственности);
ТабДок.Вывести(ОбластьЦентрОтветственности, ВыборкаЦентрОтветственности.Уровень());

С помощью этих команд заполняются параметры области ОбластьЦентрОтветственности, область выводится в табличный документ с использованием информации об уровне записи. В данном случае мы имеем дело с выводом группировки верхнего уровня, метод Уровень() возвращает 0.

ВыборкаДетали = ВыборкаЦентрОтветственности.Выбрать();

Этой командой мы получаем из общей выборки детальные данные о номенклатуре и будем выводить их в отчет, используя переменную ВыборкаДетали.

Пока ВыборкаДетали.Следующий() Цикл
		ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
		ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;

Этим внутренним циклом, который действует аналогично внешнему, мы заполняем те части отчета, которые имеют отношение к детальной выборке. Метод Уровень() в данном случае возвращает 1.

8.2. Выводы

В этой лекции мы познакомились с основами построения запросов. Конечно же, наш разговор о запросах не завершен. Мы продолжим его в следующих частях данного курса. А сейчас пришло время браться за выполнение практического задания. Для того, чтобы свериться, вы можете так же скачать файл выгрузки информационной базы (1Cv8.DT).

Ринат Гатауллин
Ринат Гатауллин

Здравствуйте. Интересует возможность получения диплома( https://intuit.ru/sites/default/files/diploma/examples/P/955/Nekommerch-2-1-PRF-example.jpg ). Курс пройден. Сертификат не подходит. В сертификате ошибка, указано по датам время прохождения около 14 дней, хотя написано 576 часов.

Вячеслав Кузнецов
Вячеслав Кузнецов

Здравствуйте.

Как оплатить курс?

Кирилл Трещев
Кирилл Трещев
Россия
Вячеслав Клюев
Вячеслав Клюев
Россия, Волчиха