В 1C:EDT
страницаВ 1C:EDT
Добавьте объект конфигурации – отчет с именем ДиаграммаНачислений.
Для этого отчета не нужно создавать схему компоновки данных. Вместо этого вам нужно создать основную форму отчета и обеспечить формирование и настройку диаграммы Ганта с помощью кода на встроенном языке.
Создайте основную форму для отчета ДиаграммаНачислений.
В правом верхнем окне редактора формы на закладке Реквизиты находятся реквизиты формы. Вы видите здесь основной реквизит формы Отчет, который был создан автоматически при создании формы.
Нажмите Добавить реквизит и добавьте новый реквизит формы. Назовите его ДиаграммаГанта и выберите его тип – ДиаграммаГанта (рис. 19.30).

Рис. 19.30. Добавление реквизита формы
Теперь перетащите новый реквизит в окно элементов формы, которое пока пусто.
Ответьте утвердительно на вопрос о добавлении колонок таблицы диаграммы Ганта. В результате в окне элементов формы будет создано новое поле для отображения диаграммы, раскрыв которое, вы увидите ее таблицу.
Выделите эту таблицу в окне элементов формы и уберите отметку со свойства Видимость (рис. 19.31).

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

Рис. 19.3****2. Открыть настройки диаграммы Ганта
Затем, щелкнув мышью в области построения диаграммы, выделите эту область, в панели Свойства выберите Область построения диаграммы и установите свойство ОтображатьТекстТочек в значение Отображать (рис. 19.33).

Рис. 19.3****3. Отображать текст точек
Затем на закладке Команды в верхнем правом углу редактора форм создайте команду формы Сформировать (рис. 19.34).

Рис. 19.3****4. Команда «Сформировать»
Установите действие этой команды.
На запрос 1C:EDT о типе обработчика команды ответьте, что вы хотите создать клиентский обработчик команды формы с вызовом из него процедуры, выполняющейся на сервере без контекста формы (рис. 19.35).

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

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