Приступим к разбору тех частей этой процедуры, которые являются для вас новыми. Так, обратите внимание на то, что каждая новая строка текста запроса начинается с вертикальной черты. Если попытаться ввести текст запроса в код модуля, не разбив его таким образом - система выдаст ошибку.
Обратите внимание на блок ИЗ в теле текста запроса:
|ИЗ
| РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, ЦентрОтветственности = &Ответственный) КАК ОстаткиМатериаловОстатки
Именно здесь задаются параметры виртуальной таблицы - Дата и Ответственный. Причем, просто задать параметры и даже передать их в процедуру, содержащую текст запроса, недостаточно для того, чтобы они были переданы в запрос. Следующими командами параметры, переданные в процедуруОстаткиМатериалов() передаются в запрос.
Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
Запрос.УстановитьПараметр("Ответственный", Ответственный);
Обратите внимание на то, что параметры в запрос передают после того, как в свойство запроса Текст записан текст запроса, но до выполнения запроса.
|
|
Значительная часть кода процедуры отведена под нужды формирования печатной формы отчета.
Обратите внимание на следующие команды, одна из которых предшествует командам вывода данных в табличное поле, а другая находится после завершения вывода, но перед окончательным отображением таблицы:
ТабДок.НачатьАвтогруппировкуСтрок();
//Команды вывода данных в табличный документ
ТабДок.ЗакончитьАвтогруппировкуСтрок();
После первой команды вывод в поле становится возможен с использованием указания уровней в команде Вывести. Вторая команда, соответственно, заканчивает работу в таком режиме.
Уровень записи - это число, которое представляет собой уровень этой записи в иерархии и группировках.
ВыборкаЦентрОтветственности = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Эта команда получает выборку результатов запроса, обходя запрос по группировкам. В дальнейшем мы будем получать данные именно из переменнойВыборкаЦентрОтветственности.
Пока ВыборкаЦентрОтветственности.Следующий() Цикл
Эта команда открывает цикл обхода выборки. Метод Следующий() возвращает Истина, если в выборке еще есть данные, первый его вызов позиционируется на первый элемент выборки. После того, как этот метод возвратит Ложь - это будет означать, что предыдущий вызов метода отработал для последней строки выборки. Первая строка выборки (за счет использования выше командыВыбрать(ОбходРезультатЗапроса.ПоГруппировкам)) получает первую группировку - она представляет собой данные об ответственном сотруднике, по которому будут сгруппированы строки с информацией о номенклатуре.
|
|
ОбластьЦентрОтветственности.Параметры.Заполнить(ВыборкаЦентрОтветственности);
ТабДок.Вывести(ОбластьЦентрОтветственности, ВыборкаЦентрОтветственности.Уровень());
С помощью этих команд заполняются параметры области ОбластьЦентрОтветственности, область выводится в табличный документ с использованием информации об уровне записи. В данном случае мы имеем дело с выводом группировки верхнего уровня, метод Уровень() возвращает 0.
ВыборкаДетали = ВыборкаЦентрОтветственности.Выбрать();
Этой командой мы получаем из общей выборки детальные данные о номенклатуре и будем выводить их в отчет, используя переменную ВыборкаДетали.
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;
Этим внутренним циклом, который действует аналогично внешнему, мы заполняем те части отчета, которые имеют отношение к детальной выборке. Метод Уровень() в данном случае возвращает 1.