В режиме "Конфигуратор"
страницаВ режиме «Конфигуратор»
Создадим новый объект конфигурации Отчет и назовем его ДиаграммаНачислений.
Для этого отчета мы не будем создавать схему компоновки данных, а создадим основную форму отчета и обеспечим формирование и настройку диаграммы Ганта с помощью кода на встроенном языке. В окне редактирования объекта конфигурации Отчет ДиаграммаНачислений перейдем на закладку Формы, нажмем кнопку открытия
и создадим основную форму отчета.
В правом верхнем окне редактора форм на закладке Реквизиты находятся реквизиты формы. Мы видим здесь основной реквизит формы Отчет, который был создан автоматически при создании формы.
Нажмем кнопку Добавить и добавим новый реквизит формы. Назовем его ДиаграммаГанта и выберем его тип ДиаграммаГанта (рис. 18.33).

Рис. 18.33. Добавление реквизита формы
Теперь перетащим новый реквизит в окно элементов формы, которое пока пусто.
Ответим утвердительно на вопрос о переносе колонок таблицы диаграммы Ганта. В результате в окне элементов формы будет создано новое поле для отображения диаграммы, раскрыв которое мы увидим ее таблицу.
Выделим эту таблицу в окне элементов формы и уберем отметку со свойства Видимость (рис. 18.34). А также выделим сам элемент формы ДиаграммаГанта и установим свойство ПоложениеЗаголовка в значение Нет (так как отображать заголовок поля диаграммы не нужно).
В результате форма отчета примет следующий вид (рис. 18.34).

Рис. 18.34. Добавление диаграммы Ганта в форму
Итак, мы скрыли отображение таблицы у диаграммы Ганта, но нам нужно установить отображение текста точек в области построения диаграммы. Для этого выделим реквизит ДиаграммаГанта в окне реквизитов формы и нажмем Открыть в строке Настройка в палитре свойств этого реквизита (рис. 18.35).

Рис. 18.35. Настройка реквизита «Диаграмма Ганта»
Затем, щелкнув мышью в области построения диаграммы, выделим эту область и установим свойство ОтображатьТекстТочек в значение Отображать (рис. 18.36).

Рис. 18.36. Свойства области построения диаграммы
Затем на закладке Команды в верхнем правом углу редактора форм создадим команду формы Сформировать (рис. 18.37).

Рис. 18.37. Добавление команды формы
Теперь нужно установить Действие для этой команды.
Для этого нажмем кнопку открытия
в строке Действие.
На запрос конфигуратора о типе обработчика команды ответим, что мы хотим создать клиентский обработчик команды формы с вызовом из него процедуры, выполняющейся на сервере без контекста формы (рис. 18.38).

Рис. 18.38. Выбор типа обработчика команды формы
В модуле формы будут созданы шаблоны двух процедур: клиентской процедуры Сформировать() и серверной внеконтекстной процедуры СформироватьНаСервере(), которая вызывается из процедуры Сформировать().
Мы не будем сейчас подробно рассматривать, что такое серверная внеконтекстная процедура. Отметим только, что внеконтекстная процедура выполняется на сервере значительно быстрее за счет того, что на сервер с клиента не передается весь контекст формы.
Однако нам нужно передать в процедуру СформироватьНаСервере() в качестве параметра ссылку на реквизит формы ДиаграммаГанта, чтобы на сервере заполнить его данными. Поэтому изменим текст модуля следующим образом (листинг 18.10).
Листинг 18.10. Текст обработчика команды «Сформировать»
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере(ДиаграммаГанта);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СформироватьНаСервере(Диаграмма)
// Вставить содержимое обработчика.
КонецПроцедуры
В процедуру СформироватьНаСервере() мы вставим заготовку запроса (листинг 18.11).
Листинг 18.11. Процедура «СформироватьНаСервере()»
&НаСервереБезКонтекста
Процедура СформироватьНаСервере(Диаграмма)
Запрос = Новый Запрос;
Запрос.Текст = ;
КонецПроцедуры
Установим курсор перед точкой с запятой, вызовем контекстное меню, откроем конструктор запроса и создадим новый запрос.
Выберем виртуальную таблицу регистра расчета Начисления.ФактическийПериодДействия.
Из этой таблицы выберем следующие поля (рис. 18.39):
Сотрудник,ВидРасчета,ПериодДействияНачало,ПериодДействияКонец,Результат,Регистратор,Регистратор.Представление.

Рис. 18.39. Выбранные поля
Все, запрос готов.
Теперь нажмем OK и после текста запроса добавим в процедуру следующий текст (листинг 18.12).
Листинг 18.12. Процедура «СформироватьНаСервере()»
&НаСервереБезКонтекста
Процедура СформироватьНаСервере(Диаграмма)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
| НачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
| НачисленияФактическийПериодДействия.ПериодДействияНачало КАК ПериоДействияНачало,
| НачисленияФактическийПериодДействия.ПериодДействияКонец КАК ПериоДействияКонец,
| НачисленияФактическийПериодДействия.Результат КАК Результат,
| НачисленияФактическийПериодДействия.Регистратор КАК Регистратор,
| НачисленияФактическийПериодДействия.Регистратор.Представление КАК РегистраторПредставление
|ИЗ
| РегистрРасчета.Начисления.ФактическийПериодДействия КАК НачисленияФактическийПериодДействия";
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
// Запретить обновление диаграммы.
Диаграмма.Обновление = Ложь;
Диаграмма.Очистить();
Диаграмма.ОтображатьЗаголовок = Ложь;
// Заполнить диаграмму.
Пока ВыборкаРезультата.Следующий() Цикл
// Получить серию, точку и значение для них.
ТекущаяСерия = Диаграмма.УстановитьСерию(ВыборкаРезультата.ВидРасчета);
ТекущаяТочка = Диаграмма.УстановитьТочку(ВыборкаРезультата.Сотрудник);
ТекущееЗначение = Диаграмма.ПолучитьЗначение(ТекущаяТочка, ТекущаяСерия);
// Создать нужные нам интервалы в значении.
ТекущийИнтервал = ТекущееЗначение.Добавить();
ТекущийИнтервал.Начало = ВыборкаРезультата.ПериодДействияНачало;
ТекущийИнтервал.Конец = ВыборкаРезультата.ПериодДействияКонец;
ТекущийИнтервал.Текст = ВыборкаРезультата.РегистраторПредставление;
ТекущийИнтервал.Расшифровка = ВыборкаРезультата.Регистратор;
КонецЦикла;
// Раскрасить серии своими цветами.
Для Каждого Серия из Диаграмма.Серии Цикл
Если Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
Серия.Цвет = WEBЦвета.Желтый;
ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
Серия.Цвет = WEBЦвета.Зеленый;
ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Невыход Тогда
Серия.Цвет = WEBЦвета.Красный;
КонецЕсли;
КонецЦикла;
// Разрешить обновление диаграммы.
Диаграмма.Обновление = Истина;
КонецПроцедуры
Сначала мы запрещаем обновление диаграммы на то время, пока мы будем заполнять ее данными. Это нужно для того, чтобы в процессе заполнения не выполнялись пересчеты при каждом изменении данных диаграммы. После окончания заполнения диаграммы мы разрешим обновление, и все пересчеты будут выполнены один раз.
Затем в цикле по выборке запроса мы заполняем диаграмму.
Сначала, используя методы УстановитьСерию() и Установить Точку(), мы получаем либо существующие, либо новые точку и серию. Точки и серии однозначно идентифицируются своими значениями, в качестве которых мы используем сотрудника и вид расчета из результата запроса.
После того как точка и серия получены, с помощью метода ПолучитьЗначение() мы получаем соответствующее им значение диаграммы.
Затем мы добавляем в значение диаграммы новый интервал, задаем его начало и конец, задаем текст интервала, который будет показываться во всплывающей подсказке, и задаем расшифровку интервала, которая будет выполняться при двойном щелчке мышью на этом интервале.
После того как все значения диаграммы сформированы, мы раскрашиваем серии своими цветами. Серии диаграммы представляют собой коллекцию значений, которую мы перебираем при помощи конструкции Для Каждого … Цикл.
Теперь вернемся в форму и добавим в нее кнопку для выполнения команды Сформировать.
Для этого перетащим мышью команду Сформировать из окна Команды формы в окно элементов формы (рис. 18.40).

Рис. 18.40. Добавление кнопки в форму
В заключение в окне редактирования объекта конфигурации Отчет ДиаграммаНачислений на закладке подсистемы укажем, что отчет будет вызываться из подсистемы РасчетЗарплаты.