Отчет ВыручкаМастеров
Отчет "Выручка мастеров" будет содержать информацию о том, какая выручка была получена OOO "На все руки мастер" благодаря работе каждого из мастеров, с детализацией по всем дням в выбранном периоде и разворотом по клиентам, обслуженным в каждый из дней. На примере этого отчета мы проиллюстрируем, как строить многоуровневые группировки в запросе, как обходить все даты в выбранном периоде и как управлять состоянием группировок в табличном документе.
Создадим новый объект конфигурации Отчет "ВыручкаМастеров". Перейдем на закладку "Макет" и запустим конструктор выходной формы.
Выберем виртуальную таблицу регистра накопления "Продажи.Обороты". Зададим для нее значения параметров "НачалоПериода", "КонецПериода" и "Периодичность":
[183]
После этого выберем из таблицы следующие поля:
· | "ПродажиОбороты.Мастер", |
· | "ПродажиОбороты.Период", |
· | "ПродажиОбороты.Клиент", |
· | "ПродажиОбороты.ВыручкаОборот": |
Теперь перейдем на закладку "Объединения/Псевдонимы" и зададим псевдоним "Выручка" для поля "ПродажиОбороты.ВыручкаОборот":
На закладке "Порядок" определим, что результат запроса будет отсортирован по возрастанию значения поля "Период" и на закладке "Итоги" зададим получение общих итогов и промежуточных итогов по полям "Мастер" и "Период":
[184]
На закладке "Отчет" сбросим флаг "Использовать построитель отчета".
На закладке "Выходная форма" отметим, что тип параметров "ДатаНачала" и "ДатаОкончания" будет Дата. Нажмем "OK".
Сразу, как и в предыдущем отчете, определим состав даты для полей ввода, расположенных в форме, и затем в вызове процедуры "ВыручкаМастеров" уточним передачу последнего параметра при помощи функции КонецДня():
Процедура ДействияФормыВыручкаМастеровСформировать(Кнопка)
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(ВыручкаМастеров)
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
ВыручкаМастеров(ТабДок, ДатаНачала, КонецДня(ДатаОкончания));
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
КонецПроцедуры
"ВЫБРАТЬ
| ПродажиОбороты.Мастер КАК Мастер,
| ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Мастер),
| ПродажиОбороты.Период КАК Период,
| ПродажиОбороты.Клиент,
| ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Клиент),
| ПродажиОбороты.ВыручкаОборот КАК Выручка
|ИЗ
| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День, ) КАК ПродажиОбороты
|
|УПОРЯДОЧИТЬ ПО
| Период
|ИТОГИ
| СУММА(Выручка)
|ПО
| ОБЩИЕ,
| Мастер,
| Период"; [185]
| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День, ) КАК ПродажиОбороты
Далее в тексте запроса следует известная нам часть упорядочивания результатов, и в следующей части – описание итогов – мы видим новые для нас строки:
| СУММА(Выручка)
|ПО
| ОБЩИЕ,
| Мастер,
| Период";
Теперь, чтобы наглядно продемонстрировать смысл наших дальнейших действий, запустите 1С:Предприятие в режиме отладки и посмотрите на результат работы отчета "Выручка мастеров" за период c 01.03.2004 по 30.04.2004:
Если вы помните, в начале раздела мы говорили, что этот отчет должен показывать данные с детализацией по всем дням в выбранном периоде. У нас же отображаются только те дни, для которых существуют ненулевые записи в таблице регистра накопления. Поэтому сейчас мы займемся тем, что изменим текст программы таким образом, чтобы в отчет попадала каждая дата из указанного периода.
Вернемся к модулю отчета "ВыручкаМастеров" и в части описания итогов запроса уточним, каким образом должны рассчитываться итоги по полю "Период":
"ВЫБРАТЬ
| ПродажиОбороты.Мастер КАК Мастер,
| ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Мастер),
| ПродажиОбороты.Период КАК Период,
| ПродажиОбороты.Клиент,
| ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Клиент),
| ПродажиОбороты.ВыручкаОборот КАК Выручка [187]
|ИЗ
| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День, ) КАК ПродажиОбороты
|
|УПОРЯДОЧИТЬ ПО
| Период
|ИТОГИ
| СУММА(Выручка)
|ПО
| ОБЩИЕ,
| Мастер,
| Период ПЕРИОДАМИ(День, &ДатаНачала, &ДатаОкончания)";
И для того, чтобы все эти итоги попали в итоговый табличный документ, нам нужно будет уточнить порядок вывода итогов в выборке результата запроса:
Пока ВыборкаМастер.Следующий() Цикл
ОбластьМастер.Параметры.Заполнить(ВыборкаМастер);
ТабДок.Вывести(ОбластьМастер, ВыборкаМастер.Уровень());
ВыборкаПериод = ВыборкаМастер.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период","Все");
Пока ВыборкаПериод.Следующий() Цикл
ОбластьПериод.Параметры.Заполнить(ВыборкаПериод);
ТабДок.Вывести(ОбластьПериод, ВыборкаПериод.Уровень());
ВыборкаДетали = ВыборкаПериод.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;
КонецЦикла;
КонецЦикла; [188]
Запустим 1С:Предприятие в режиме отладки и выполним отчет "ВыручкаМастеров" за период с 20.03.2004 по 20.04.2004.
В целях экономии неинформативного пространства книги, мы не будем приводить результат работы отчета, но на словах объясним, что результат отчета будет содержать по 32 строки дат для каждого сотрудника.
Очевидно, что такой внешний вид отчета абсолютно "нечитабелен", поэтому мы снова вернемся к модулю отчета и внесем небольшие уточнения в алгоритм вывода областей табличного документа:
ОбластьМастер.Параметры.Заполнить(ВыборкаМастер);
ТабДок.Вывести(ОбластьМастер, ВыборкаМастер.Уровень());
ВыборкаПериод = ВыборкаМастер.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период","Все");
Пока ВыборкаПериод.Следующий() Цикл
ОбластьПериод.Параметры.Заполнить(ВыборкаПериод);
ТабДок.Вывести(ОбластьПериод, ВыборкаПериод.Уровень(),,Ложь);
ВыборкаДетали = ВыборкаПериод.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;
КонецЦикла;
КонецЦикла;
Запустим 1С:Предприятие в режиме отладки и снова выполним отчет "ВыручкаМастеров" за период с 20.03.2004 по 20.04.2004. [189]
На этот раз результат выглядит гораздо лучше:
Итак, на примере этого отчета мы продемонстрировали, как строить многоуровневые группировки в запросе, как обходить все даты в выбранном периоде и как управлять состоянием группировок в табличном документе. [190]