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

Создание отчета ДиаграммаНачислений


Создадим новый объект конфигурации Отчет и назовем его "ДиаграммаНачислений". Создадим основную форму отчета и разместим на ней элемент управления диаграмма Ганта с именем "ДиаграммаГанта":

Откроем модуль формы отчета и в обработчик события "Нажатие" кнопки сформировать вставим заготовку запроса:

Процедура КнопкаСформироватьНажатие(Кнопка)[366]

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

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

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



Откроем конструктор запроса, и выберем виртуальную таблицу регистра расчета "Начисления.ФактическийПериодДействия". Из этой таблицы выберем следующие поля:

·"НачисленияФактическийПериодДействия.Сотрудник",
·"НачисленияФактическийПериодДействия.ВидРасчета",
·"НачисленияФактическийПериодДействия.ПериодДействияНачало",
·"НачисленияФактическийПериодДействия.ПериодДействияКонец",
·"НачисленияФактическийПериодДействия.Результат",
·"НачисленияФактическийПериодДействия.Регистратор",
·"НачисленияФактическийПериодДействия.Регистратор.Представление":

Все, запрос готов. Теперь нажмем "ОК" и добавим в процедуру следующий текст:

Процедура КнопкаСформироватьНажатие(Кнопка)

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

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

       "ВЫБРАТЬ

       |    НачисленияФактическийПериодДействия.Сотрудник,

       |    НачисленияФактическийПериодДействия.ВидРасчета,

       |    НачисленияФактическийПериодДействия.ПериодДействияНачало,

       |    НачисленияФактическийПериодДействия.ПериодДействияКонец,

       |    НачисленияФактическийПериодДействия.Результат,

       |    НачисленияФактическийПериодДействия.Регистратор,




       |    НачисленияФактическийПериодДействия.Регистратор.Представление [367]

       |ИЗ

       |    РегистрРасчета.Начисления.ФактическийПериодДействия КАК НачисленияФактическийПериодДействия";

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

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

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

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

   Диаграмма.Очистить();

   Диаграмма.ОтображатьЗаголовок = Ложь;

   //заполнить диаграмму

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

       //получить серию, точку н значение для них

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

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

       ТекущееЗначение = Диаграмма.ПолучитьЗначение(ТекущаяТочка,ТекущаяСерия);

       // создать нужные нам интервалы в значении

       ТекущийИнтервал = ТекущееЗначение.Добавить();

       ТекущийИнтервал.Начало = ВыборкаРезультата.ПериодДействияНачало;

       ТекущийИнтервал.Конец = ВыборкаРезультата.ПериодДействияКонец;

       ТекущийИнтервал.Текст = ВыборкаРезультата.РегистраторПредставление;

       ТекущийИнтервал.Расшифровка = ВыборкаРезультата.Регистратор;

   КонецЦикла;

   //раскрасить серии своими цветами

   Для Каждого Серия Из Диаграмма.Серии Цикл

       Если Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда

           Серия.Цвет = WEBЦвета.Желтый;



       ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда

           Серия.Цвет = WEBЦвета.Зеленый;

       ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Невыход Тогда

           Серия.Цвет = WEBЦвета.Красный;

       КонецЕсли;

   КонецЦикла;

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

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

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

Сначала в переменной "Диаграмма" мы сохраняем расположенную в форме диаграмму Ганта и запрещаем обновление диаграммы на то время, пока мы будем заполнять ее данными. Это нужно для того, чтобы в процессе заполнения не выполнялись пересчеты при каждом изменении данных диаграммы. После окончания заполнения диаграммы мы разрешим обновление, и все пересчеты будут выполнены один раз.

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

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

Затем мы добавляем в значение диаграммы новый интервал, задаем его начало и конец, задаем текст интервала, который будет показываться во всплывающей подсказке, и задаем расшифровку интервала, которая будет выполняться при двойном щелчке мышью на этом интервале.

После того, как все значения диаграммы сформированы, мы раскрашиваем серии своими цветами. Серии диаграммы представляют собой коллекцию значений, которую мы перебираем при помощи конструкции Для каждого ... Цикл.

Запустим 1С:Предприятие в режиме отладки и посмотрим на результат работы отчета:



[369]

А теперь посмотрим, как выглядит механизм вытеснения По периоду действия "в действии". Откроем документ Начисления сотрудникам №3 и вместо одного прогула с 1 по 10 число зададим Гусакову два прогула: с 3 по 7 число и с 12 по 15 число.

Проведем документ и снова нажмем "Сформировать" в отчете:



Теперь вы наглядно видите, как записи вида расчета "Невыход" вытеснили по периоду действия запись расчета "Оклад", изменив ее фактический период действия.

Следует отметить, что существует также возможность интерактивной настройки параметров диаграммы Ганта, доступная через пункт контекстного меню "Шкала времени и масштаб...".[370]


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