1С-Предприятие 8.0. Практическое пособие разработчика

       

Отчет ВыручкаМастеров


Отчет "Выручка мастеров" будет содержать информацию о том, какая выручка была получена OOO "На все руки мастер" благодаря работе каждого из мастеров, с детализацией по всем дням в выбранном периоде и разворотом по клиентам, обслуженным в каждый из дней. На примере этого отчета мы проиллюстрируем, как строить многоуровневые группировки в запросе, как обходить все даты в выбранном периоде и как управлять состоянием группировок в табличном документе.

Создадим новый объект конфигурации Отчет "ВыручкаМастеров". Перейдем на закладку "Макет" и запустим конструктор выходной формы.

Выберем виртуальную таблицу регистра накопления "Продажи.Обороты". Зададим для нее значения параметров "НачалоПериода", "КонецПериода" и "Периодичность":

[183]

После этого выберем из таблицы следующие поля:

·"ПродажиОбороты.Мастер",
·"ПродажиОбороты.Период",
·"ПродажиОбороты.Клиент",
·"ПродажиОбороты.ВыручкаОборот":

Теперь перейдем на закладку "Объединения/Псевдонимы" и зададим псевдоним "Выручка" для поля "ПродажиОбороты.ВыручкаОборот":

На закладке "Порядок" определим, что результат запроса будет отсортирован по возрастанию значения поля "Период" и на закладке "Итоги" зададим получение общих итогов и промежуточных итогов по полям "Мастер" и "Период":


[184]

На закладке "Отчет" сбросим флаг "Использовать построитель отчета".



На закладке "Выходная форма" отметим, что тип параметров "ДатаНачала" и "ДатаОкончания" будет Дата. Нажмем "OK".

Сразу, как и в предыдущем отчете, определим состав даты для полей ввода, расположенных в форме, и затем в вызове процедуры "ВыручкаМастеров" уточним передачу последнего параметра при помощи функции КонецДня():

Процедура ДействияФормыВыручкаМастеровСформировать(Кнопка)

//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(ВыручкаМастеров)




   // Данный фрагмент построен конструктором.

   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;

   ВыручкаМастеров(ТабДок, ДатаНачала, КонецДня(ДатаОкончания));

   //}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА

КонецПроцедуры

Теперь обратимся к процедуре "ВыручкаМастеров" и в первую очередь рассмотрим текст запроса, сформированный конструктором:

Запрос.Текст =

   "ВЫБРАТЬ

   |    ПродажиОбороты.Мастер КАК Мастер,

   |    ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Мастер),

   |    ПродажиОбороты.Период КАК Период,

   |    ПродажиОбороты.Клиент,

   |    ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Клиент),

   |    ПродажиОбороты.ВыручкаОборот КАК Выручка

   |ИЗ

   |    РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День, ) КАК ПродажиОбороты

   |

   |УПОРЯДОЧИТЬ ПО

   |    Период

   |ИТОГИ

   |    СУММА(Выручка)

   |ПО

   |    ОБЩИЕ,

   |    Мастер,

   |    Период"; [185]

В части описания запроса обратите внимание, что у источника данных кроме задания начала и окончания периода расчета итогов задана периодичность выбираемых данных – "День":

   |ИЗ

   |    РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День, ) КАК ПродажиОбороты

Именно благодаря этому у нас появляется возможность описать среди выбранных полей поле "Период".

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



   |ИТОГИ

   |    СУММА(Выручка)

   |ПО

   |    ОБЩИЕ,

   |    Мастер,

   |    Период";

Помимо общих итогов, в нашем запросе будут рассчитаны промежуточные итоги по полям "Мастер" и "Период". [186]

Теперь, чтобы наглядно продемонстрировать смысл наших дальнейших действий, запустите 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]


Содержание раздела