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

       

Создание отчета РейтингКлиентов


Создадим в конфигураторе новый объект конфигурации Отчет "РейтингКлиентов". Затем создадим основную форму отчета и расположим на ней поле выбора с именем "ПолеВыбора", подписью "Тип диаграммы:" и подсказкой "Выбор типа диаграммы" (Форма

Вставить элемент управления...):


[198]

Затем разместим под ним диаграмму с именем "Диаграмма". Изменим размеры областей диаграммы, и зададим текст области заголовка – "Рейтинг клиентов":

В модуле формы создадим процедуру "Сформировать" с заготовкой для текста запроса:

Процедура Сформировать()

   // Вставить содержимое обработчика.



   Запрос = Новый Запрос;

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

   ;

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

Установим курсор в предпоследней строке, перед точкой с запятой и вызовем конструктор запроса (Текст

Конструктор запроса...). Выберем виртуальную таблицу регистра накопления "Продажи.Обороты" и из нее одно поле "ПродажиОбороты.Клиент.Представление".[199]

Затем добавим новое поле (иконка "Добавить" в командной панели над списком полей) и при помощи построителя выражений определим его как разность между выручкой и стоимостью:

В результате список выбранных полей будет иметь следующий вид:

На закладке "Объединения/Псевдонимы" укажем, что поле "ПродажиОбороты.Клиент.Представление" будет иметь псевдоним "Клиент", а вычисляемое поле – псевдоним "Доход":


[200]

На закладке "Порядок" укажем, что строки результата нужно упорядочивать по убыванию значения поля "Доход". Нажмем "ОК" и посмотрим, какой текст сформировал конструктор запроса:

Процедура Сформировать()

   // Вставить содержимое обработчика.

   Запрос = Новый Запрос;

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

   "ВЫБРАТЬ

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

   |    ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот КАК Доход




   |ИЗ

   |    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

   |

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

   |    Доход УБЫВ";

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

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

...

   |    ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот КАК Доход

...

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

Добавим в процедуру следующий текст (добавленный текст выделен жирным шрифтом):

Процедура Сформировать()

   // Вставить содержимое обработчика.

   Запрос = Новый Запрос;

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

   "ВЫБРАТЬ

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

   |    ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот КАК Доход

   |ИЗ

   |    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты [201]

   |

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

   |    Доход УБЫВ";

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

   Диаграмма = ЭлементыФормы.Диаграмма;

   //запретить обновление и автотранспонирование диаграммы

   Диаграмма.Обновление = Ложь;

   Диаграмма.АвтоТранспонирование = Ложь;

   //создать единственную точку диаграммы

   ТочкаДиаграммы = Диаграмма.УстановитьТочку("Доход");

   //перебрать выборку результата запроса и создать серии

   //и значения

   Пока ВыборкаРезультатаЗапроса.Следующий() Цикл

       ТекущаяСерияДиаграммы = Диаграмма.УстановитьСерию(ВыборкаРезультатаЗапроса.Клиент);



       Диаграмма.УстановитьЗначение(ТочкаДиаграммы,ТекущаяСерияДиаграммы,ВыборкаРезультатаЗапроса.Доход);

   КонецЦикла;

   //разрешить обновление и автотранспонирование диаграммы

   Диаграмма.Обновление = Истина;

   Диаграмма.АвтоТранспонирование = Истина;

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

Сначала, с помощью метода Выполнить() мы получаем результат запроса. Затем методом Выбрать() получаем выборку записей из результата запроса в переменной "ВыборкаРезультатаЗапроса".

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

После этого добавляем в диаграмму единственную точку.

Затем мы организуем цикл по выборке из результата запроса и в цикле добавляем серии в нашу диаграмму. Каждому клиенту будет соответствовать своя серия. После этого мы устанавливаем значение точки, передавая методу УстановитьЗначение() точку, серию, для которой устанавливается значение в этой точке, и само значение.

После заполнения диаграммы данными мы включаем свойство "Обновление", чтобы новое состояние диаграммы было отображено, и [202] "АвтоТранспонирование" для того, чтобы различные типы диаграмм, которые будут выбраны в поле выбора, отображались правильно.



Узнай больше!

Следует сделать несколько замечаний no оптимизации заполнения диаграммы данными.

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

Во-вторых, перед началом заполнения диаграммы данными следует также отключать автотранспонирование диаграммы (свойство диаграммы "АвтоТранспонирование"). Автотранспонирование позволяет диаграмме анализировать данные и выбирать наиболее подходящее представление в зависимости от заданного типа диаграммы. Например, круговая диаграмма отображает значения нескольких серий в одной точке, а обычный график – как раз наоборот – значения одной серии в нескольких точках. Обратите внимание, что автотранспонирование диаграммы доступно только в режиме "ручного" заполнения данными. При использовании источника данных это свойство недоступно. После того, как диаграмма будет заполнена данными, автотранспонирование диаграммы можно снова включить, если в этом есть необходимость.



Теперь создадим обработчик события формы "ПриОткрытии", и добавим в него установку значения поля выбора и типа диаграммы, и вызов нашей процедуры "Сформировать":

Процедура ПриОткрытии()

   //Заполним список поля выбора

   ПолеВыбора = ТипДиаграммы.Гистограмма;

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

   Сформировать();

КонецПроцедуры [203]

В теле модуля формы опишем заполнение списка выбора для поля выбора:

СписокВыбора = ЭлементыФормы.ПолеВыбора.СписокВыбора;

СписокВыбора.Добавить(ТипДиаграммы.График, "График");

СписокВыбора.Добавить(ТипДиаграммы.Гистограмма, "Гистограмма");

СписокВыбора.Добавить(ТипДиаграммы.ГистограммаОбъемная, "Гистограмма 3D");

СписокВыбора.Добавить(ТипДиаграммы.ГистограммаГоризонтальная,"Гистограмма горизонтальная");

СписокВыбора.Добавить(ТипДиаграммы.ГистограммаГоризонтальнаяОбъемная,"Гистограмма горизонтальная 3D");

СписокВыбора.Добавить(ТипДиаграммы.Круговая, "Круговая");

СписокВыбора.Добавить(ТипДиаграммы.КруговаяОбъемная,"Круговая объемная");

СписокВыбора.Добавить(ТипДиаграммы.Изометрическая,"Изометрическая");

СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяНепрерывная,"Изометрическая непрерывная");

СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяЛента, "Изометрическая лента");

СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяПирамида, "Изометрическая пирамида");

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

Процедура ПолеВыбораПриИзменении(Элемент)

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

КонецПроцедуры [204]

Запустим 1С:Предприятие в режиме отладки и откроем отчет "РейтингКлиентов". Обратите внимание, что при наведении курсора на столбец гистограммы появляется подсказка:





Теперь изменим тип диаграммы на "Круговая объемная":



Только что мы рассмотрели с вами общий случай заполнения Диаграммы данными. Однако если исходные данные могут быть получены в виде таблицы значений или области ячеек табличного Документа, существует более простой и эффективный способ [205] заполнения диаграммы данными, используя свойство диаграммы – "ИсточникДанных".

Вернемся в модуль формы отчета "РейтингКлиентов" и все строки, которыми мы добавляли в диаграмму данные:

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

   Диаграмма = ЭлементыФормы.Диаграмма;

   //запретить обновление и автотранспонирование диаграммы

   Диаграмма.Обновление = Ложь;

   Диаграмма.АвтоТранспонирование = Ложь;

   //создать единственную точку диаграммы

   ТочкаДиаграммы = Диаграмма.УстановитьТочку("Доход");

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

   Пока ВыборкаРезультатаЗапроса.Следующий() Цикл

       ТекущаяСерияДиаграммы = Диаграмма.УстановитьСерию(ВыборкаРезультатаЗапроса.Клиент);

       Диаграмма.УстановитьЗначение(ТочкаДиаграммы,ТекущаяСерияДиаграммы, ВыборкаРезультатаЗапроса.Доход);

   КонецЦикла;

   //разрешить обновление и автотранспонирование диаграммы

   Диаграмма.Обновление = Истина;

   Диаграмма.АвтоТранспонирование = Истина;

заменим одной строкой:

   ЭлементыФормы.Диаграмма.ИсточникДанных = Запрос.Выполнить().Выгрузить();

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

Запустите 1С:Предприятие в режиме отладки и проверьте работу отчета. Обратите внимание на то, что некоторые типы диаграмм выглядят "некрасиво" (график) или не отображаются совсем (изометрическая непрерывная, изометрическая лента). Это связано с тем, что при использовании источника данных нет возможности использовать свойство диаграммы "АвтоТранспонирование" и нужно [206] обрабатывать транспонирование диаграммы "вручную" (используя свойство СерииВСтроках).

Таким образом, на примере этого отчета мы продемонстрировали как создавать запросы, используя конструктор запросов, и как использовать диаграмму для визуализации результата запроса. [207]


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