Создание отчета РейтингКлиентов
Создадим в конфигураторе новый объект конфигурации Отчет "РейтингКлиентов". Затем создадим основную форму отчета и расположим на ней поле выбора с именем "ПолеВыбора", подписью "Тип диаграммы:" и подсказкой "Выбор типа диаграммы" (Форма
Вставить элемент управления...):
[198]
Затем разместим под ним диаграмму с именем "Диаграмма". Изменим размеры областей диаграммы, и зададим текст области заголовка – "Рейтинг клиентов":
В модуле формы создадим процедуру "Сформировать" с заготовкой для текста запроса:
Процедура Сформировать()
// Вставить содержимое обработчика.
Запрос = Новый Запрос;
Запрос.Текст =
;
КонецПроцедуры
Установим курсор в предпоследней строке, перед точкой с запятой и вызовем конструктор запроса (Текст
Конструктор запроса...). Выберем виртуальную таблицу регистра накопления "Продажи.Обороты" и из нее одно поле "ПродажиОбороты.Клиент.Представление".[199]Затем добавим новое поле (иконка "Добавить" в командной панели над списком полей) и при помощи построителя выражений определим его как разность между выручкой и стоимостью:
В результате список выбранных полей будет иметь следующий вид:
На закладке "Объединения/Псевдонимы" укажем, что поле "ПродажиОбороты.Клиент.Представление" будет иметь псевдоним "Клиент", а вычисляемое поле – псевдоним "Доход":
[200]
На закладке "Порядок" укажем, что строки результата нужно упорядочивать по убыванию значения поля "Доход". Нажмем "ОК" и посмотрим, какой текст сформировал конструктор запроса:
Процедура Сформировать()
// Вставить содержимое обработчика.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Клиент.Представление КАК Клиент,
| ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот КАК Доход
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
|
|УПОРЯДОЧИТЬ ПО
| Доход УБЫВ";
КонецПроцедуры
| ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот КАК Доход
...
Добавим в процедуру следующий текст (добавленный текст выделен жирным шрифтом):
// Вставить содержимое обработчика.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Клиент.Представление КАК Клиент,
| ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот КАК Доход
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты [201]
|
|УПОРЯДОЧИТЬ ПО
| Доход УБЫВ";
ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();
Диаграмма = ЭлементыФормы.Диаграмма;
//запретить обновление и автотранспонирование диаграммы
Диаграмма.Обновление = Ложь;
Диаграмма.АвтоТранспонирование = Ложь;
//создать единственную точку диаграммы
ТочкаДиаграммы = Диаграмма.УстановитьТочку("Доход");
//перебрать выборку результата запроса и создать серии
//и значения
Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
ТекущаяСерияДиаграммы = Диаграмма.УстановитьСерию(ВыборкаРезультатаЗапроса.Клиент);
Диаграмма.УстановитьЗначение(ТочкаДиаграммы,ТекущаяСерияДиаграммы,ВыборкаРезультатаЗапроса.Доход);
КонецЦикла;
//разрешить обновление и автотранспонирование диаграммы
Диаграмма.Обновление = Истина;
Диаграмма.АвтоТранспонирование = Истина;
КонецПроцедуры
Перед началом заполнения мы отключаем обновление и автотранспонирование диаграммы для того, чтобы заполнение данными выполнялось быстрее.
После этого добавляем в диаграмму единственную точку.
Затем мы организуем цикл по выборке из результата запроса и в цикле добавляем серии в нашу диаграмму. Каждому клиенту будет соответствовать своя серия. После этого мы устанавливаем значение точки, передавая методу УстановитьЗначение() точку, серию, для которой устанавливается значение в этой точке, и само значение.
После заполнения диаграммы данными мы включаем свойство "Обновление", чтобы новое состояние диаграммы было отображено, и [202] "АвтоТранспонирование" для того, чтобы различные типы диаграмм, которые будут выбраны в поле выбора, отображались правильно.
Следует сделать несколько замечаний no оптимизации заполнения диаграммы данными.
Во-первых, перед началом заполнения диаграммы данными следует отключать обновление диаграммы (свойство диаграммы "Обновление"). Это значительно ускорит процесс заполнения, поскольку при включенном обновлении диаграмма будет выполнять пересчет и отрисовку автоматически. После того, как диаграмма будет заполнена данными, обновление диаграммы нужно снова включить.
Во-вторых, перед началом заполнения диаграммы данными следует также отключать автотранспонирование диаграммы (свойство диаграммы "АвтоТранспонирование"). Автотранспонирование позволяет диаграмме анализировать данные и выбирать наиболее подходящее представление в зависимости от заданного типа диаграммы. Например, круговая диаграмма отображает значения нескольких серий в одной точке, а обычный график – как раз наоборот – значения одной серии в нескольких точках. Обратите внимание, что автотранспонирование диаграммы доступно только в режиме "ручного" заполнения данными. При использовании источника данных это свойство недоступно. После того, как диаграмма будет заполнена данными, автотранспонирование диаграммы можно снова включить, если в этом есть необходимость.
//Заполним список поля выбора
ПолеВыбора = ТипДиаграммы.Гистограмма;
ЭлементыФормы.Диаграмма.ТипДиаграммы = ПолеВыбора;
Сформировать();
КонецПроцедуры [203]
СписокВыбора.Добавить(ТипДиаграммы.График, "График");
СписокВыбора.Добавить(ТипДиаграммы.Гистограмма, "Гистограмма");
СписокВыбора.Добавить(ТипДиаграммы.ГистограммаОбъемная, "Гистограмма 3D");
СписокВыбора.Добавить(ТипДиаграммы.ГистограммаГоризонтальная,"Гистограмма горизонтальная");
СписокВыбора.Добавить(ТипДиаграммы.ГистограммаГоризонтальнаяОбъемная,"Гистограмма горизонтальная 3D");
СписокВыбора.Добавить(ТипДиаграммы.Круговая, "Круговая");
СписокВыбора.Добавить(ТипДиаграммы.КруговаяОбъемная,"Круговая объемная");
СписокВыбора.Добавить(ТипДиаграммы.Изометрическая,"Изометрическая");
СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяНепрерывная,"Изометрическая непрерывная");
СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяЛента, "Изометрическая лента");
СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяПирамида, "Изометрическая пирамида");
ЭлементыФормы.Диаграмма.ТипДиаграммы = ПолеВыбора;
КонецПроцедуры [204]
Теперь изменим тип диаграммы на "Круговая объемная":
Только что мы рассмотрели с вами общий случай заполнения Диаграммы данными. Однако если исходные данные могут быть получены в виде таблицы значений или области ячеек табличного Документа, существует более простой и эффективный способ [205] заполнения диаграммы данными, используя свойство диаграммы – "ИсточникДанных".
Вернемся в модуль формы отчета "РейтингКлиентов" и все строки, которыми мы добавляли в диаграмму данные:
Диаграмма = ЭлементыФормы.Диаграмма;
//запретить обновление и автотранспонирование диаграммы
Диаграмма.Обновление = Ложь;
Диаграмма.АвтоТранспонирование = Ложь;
//создать единственную точку диаграммы
ТочкаДиаграммы = Диаграмма.УстановитьТочку("Доход");
//перебрать выборку результата запроса и создать серии и значения
Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
ТекущаяСерияДиаграммы = Диаграмма.УстановитьСерию(ВыборкаРезультатаЗапроса.Клиент);
Диаграмма.УстановитьЗначение(ТочкаДиаграммы,ТекущаяСерияДиаграммы, ВыборкаРезультатаЗапроса.Доход);
КонецЦикла;
//разрешить обновление и автотранспонирование диаграммы
Диаграмма.Обновление = Истина;
Диаграмма.АвтоТранспонирование = Истина;
Запустите 1С:Предприятие в режиме отладки и проверьте работу отчета. Обратите внимание на то, что некоторые типы диаграмм выглядят "некрасиво" (график) или не отображаются совсем (изометрическая непрерывная, изометрическая лента). Это связано с тем, что при использовании источника данных нет возможности использовать свойство диаграммы "АвтоТранспонирование" и нужно [206] обрабатывать транспонирование диаграммы "вручную" (используя свойство СерииВСтроках).
Таким образом, на примере этого отчета мы продемонстрировали как создавать запросы, используя конструктор запросов, и как использовать диаграмму для визуализации результата запроса. [207]