Раскрасить серии своими цветами ДляКаждого Серия из Диаграмма.Серии цикл

ИЗ

ИЗ

I РегистрРасчета.Начиеления.БазаНачисления(

I &ИзмереяияОсновного,

I &ИзмеренияБазового,,

I Регистратор = &Регистратор И

I ВидРасчета = &ВидРасчета И

I Сотрудник В (&СписокСотрудников))

I КАК НачисленияБазаНачисления";

Измер = Новый Maccив(1); Измер[0] = "Сотрудник";

Запрос.УстановитьПараметр("ИзмеренияОсновного",Измер); Запрос.УстановитьПараметрС'ИзмеренияБазового", Измер); Запрос.УстановитьПараметр("Регистратор",Регистратор); Запрос.УстановитьПараметр("ВидРасчета",Тре6уемыйВидРасчета); Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);

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

КонецЕсли;

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

Здесь в параметрах виртуальной таблицы запроса мы, кроме привычных для нас регистратора, вида расчета и списка сотрудников, задаем еще измерения основного и базового регистров. В нашем случае это будет один и тот же регистр, а нужное нам измерение -«Сотрудник».

В заключение осталось добавить во второе условие Если ... обход набора записей регистра расчета и вычисление результата вторичных записей:


/Л'ассчитать вторичные записи иначеЕсли ТребуемыйВидРасчета =

ПланыВидовРасчета.ОсновныеНачисления.Премия тогда

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

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

"ВЫБРАТЬ

| НачисленияБазаНачисления.РезультатБаза КАК База,

| НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки

|ИЗ

| РегистрРасчета.Начисления.БазаНачисления(

| &ИзмеренияОсновного,

| &ИзмереиияБазового,,

| Регистратор = &Регистратор И

| ВидРасчета = &ВидРасчета И

| Сотрудник В (&СписокСотрудников))

| КАКНачисленияБазаНачисления";

Измер = Новый Массив(1); Измер[0] = "Сотрудник":

Запрос.УстановитьПараметр("ИзмеренияОсновного",Измер); Запрос.УстановитьПараметрС'ИзмеренияБазового", Измер); Запрос.УстановитьПараметр("Регистратор",Регистратор); Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета); Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);

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

Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл СтруктураНомер = Новый СтруктураС'НомерСтроки"); СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки; ВыборкаРезультата.Сбросить();

Если ВыборкаРезультата.НайтнСледующийССтруктураНомер) тогда ЗаписьРегистра.Результат = ВыборкаРезультата.База * (10/100); Сообщить("Выполнен расчет "+ЗаписьРегистра.Регистратор+" - "+

ЗаписьРегистра.ВвдРасчета+" - "+ЗаписьРегистра.Сотрудник,); КоиецБсли; КонецЦикла;

КонецЕсли; КонедПроцедуры


 


ПроцедураРасчитатьНачисления{НаборЗаписейРегистра, ТребуемыйВидРасчета,

СписокСотрудников) Экспорт

/Л>ассчитать первичные записи

Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад тогд»


Сумму начисленной премии мы рассчитываем как 10% от рассчитанной оплаты по окладу.


 


354



Использование основных объектов конфигурации


Использование регистра расчета


 


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

Отменим проведение документа Начисление сотрудникам №з и перепроведем документы Начисление сотрудникам №1 и №2. Регистр расчета Начисления должен выглядеть следующим образом:

Гусакову и Деловому начислена премия в размере 10% от суммы начисления по окладу.

Проведем документ Начисление сотрудникам №3, а затем №1 и№2. Состояние регистра изменится следующим образом:

J

В результате невыхода Гусакова на работу, сумма его оплаты по окладу будет уменьшена и соответствующим образом уменьшится начисленная ему премия.


Создание отчета НачисленияСотрудникам

Т

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

Создадим в конфигураторе новый объект конфигурации Отчет. Назовем его «НачисленияСотрудникам».



Запустим конструктор выходной формы. Выберем следующие поля таблицы регистра расчета «Начисления»:

На закладке «Объединения/Псевдонимы» определим следующие псевдонимы выбранных полей:


 


356



Использование основных объектов конфигурации


Использование регистра расчета


 


На закладке «Порядок» отметим автоупорядочивание. На закладке «Итоги» зададим получение общих итогов и промежуточных итогов по сотруднику:

В заключение на закладке «Отчет» сбросим флаг «Использовать построитель отчета». Нажмем «ОК» и запустим 1С:Предприятие в режиме отладки.

В результате работы отчета мы получим следующую таблицу:


Выполнение перерасчета записей регистра расчета

И

так, в нашем алгоритме работы с данными расчета осталось одно «узкое» место - контроль актуальности данных, содержащихся в регистре расчета. До сих пор мы с вами использовали служебный отчет «Перерасчет» для того, чтобы определить, являются ли данные в регистре расчета актуальными или же они требуют перерасчета.

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

Поскольку единственным способом получения итоговой информации о начислениях сотрудникам в нашей конфигурации является отчет «НачисленияСотрудникам», для вызова этой процедуры мы добавим кнопку «Перерасчитать» в командную панель «ДействияФормы»:


               
   
     
 
 
   
     
 
 
 


В обработчик события нажатия кнопки вставим текст вызова процедуры перерасчета:

ПроцедураДействияФормыПерерасчитать(Кнопка)

ПерерасчитатьНачисления(ПланыВидовРасчета.ОсновныеНачисления.Оклад);

ПерерасчитатьНачисления01лаиыВидовРасчета.ОсновныеНачисления.Премия); КонецПроцедуры

Саму процедуру перерасчета разместим в общем модуле «ПроведениеРасчетов»:

Процедура ПерерасчитатьНачисления(ТребуемыйВидРасчета) экспорт «здесь следует выбрать из набора записей перерасчета " записи в следующей последовательности:

//записи документа1 для сотрудников из списка,


358



Использование основных объектов конфигурации


Использование регистра расчета


 


//записи документа2 для сотрудников из списка,

//и т.д.

Запрос = новый Запрос(

"ВЫБРАТЬ

| НачисленияПерерасчет.ОбъектПерерасчета,

| НачисленияПерерасчет.Сотрудник

| РегистрРасчета.Начисления.Перерасчет

| КАК НачисленияПерерасчет

|

|ГДЕ

| НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета

|

|ИТОГИ ПО

I НачисленияПерерасчет.ОбъектПерерасчета");

Запрос.УстановитьПараметрСТребуемыйВидРасчета'.ТребуемыйВидРасчета);

СписокСотрудников = Новый СписокЗначений;

//перебрать группировку по регистратору ВыборкаПоРегистратору = Запрос.Выполнить()

.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПоРегистратору.Следующий() цикл Регистратор = ВыборкаПоРегистратору.ОбъектПерерасчета;

//перебрать группировку по сотрудникам

//для выбранного регистратора

//и создать список сотрудников

ВыборкаПоСотрудникам = ВыборкаПоРегистратору.Выбрать();

СписокСотрудников.Очистить();

Пока ВыборкаПоСотрудникам.Следующий() цикл

СписокСотрудников.Добавить(ВыборкаПоСотрудникам.Сотрудник); КонецЦикла;

//получить набор записей регистра расчета

//для выбранного регистратора

НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Значение = Регистратор;

НаборЗаписей.Прочитать();

РасчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников); НаборЗаписей.Записать(, Истина);

//очистить перерасчитанные записи в перерасчете НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты

.Перерасчет.СоздатьНаборЗаписей();

НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор; НаборЗаписейПерерасчета.Записать(); КонецЦикла; КонецПроцедуры.


В самом начале процедуры мы выбираем запросом данные о записях перерасчетов, содержащие переданный вид расчета и сгруппированные по объекту перерасчета. Далее, при обходе результата запроса, мы формируем для каждого объекта перерасчета список сотрудников, читаем соответствующие записи регистра расчета и вызываем процедуру «РасчитатьНачисления», которая использовалась нами при расчете записей документа «НачисленияСотрудникам». После того, как расчет записей выполнен, мы записываем набор записей без формирования записей перерасчета и очищаем записи перерасчета по тому объекту перерасчета, который только что обработали.

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

Отменим проведение всех документов «Начисления сотрудникам» и проведем документ Начисления сотрудникам №1 и затем №2. Сформируем отчет «Начисления сотрудникам» (здесь и далее колонки отчета с 4 по 6 скрыты, в целях экономии места):

Теперь откроем документ Начисления сотрудникам №1, изменим оклад Гусакова на 10 000 и проведем документ. В отчете


 


360



Использование основных объектов конфигурации


Использование регистра расчета


 


«НачисленияСотрудникам» нажмем кнопку «Перерасчитать». Будет выполнен перерасчет начисления премии Гусакову и Деловому:


А данные отчета будут содержать актуальные значения начисления оклада и премии:


 
 


Результат работы отчета будет содержать новые значения премии Гусакова:

И, наконец, проведем документ Начисления сотрудникам №3 и нажмем «Перерасчет» в отчете «НачисленияСотрудникам». Снова будет произведен перерасчет оклада и премии Гусакова:



 


 


362



Использование основных объектов конфигурации


Использование регистра расчета


 


Графическое представление начислений

В

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

Диаграмма Ганта

Д

иаграмма Ганта представляет собой диаграмму интервалов на шкале времени и отражает использование объектами (точками) ресурсов (серий). Чтобы проще было представить себе составные части диаграммы Ганта, изучим диаграмму, которая должна получиться в результате работы создаваемого нами отчета.


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


Итак, диаграмма Ганта представляет собой совокупность точек, серий и значений для каждой пары точка-серия. В нашем случае точками диаграммы являются сотрудники, а сериями - виды расчетов. Таким образом, для каждого сотрудника существует некоторое значение диаграммы по каждой из серий, то есть по каждому из видов расчета.

Значение диаграммы Ганта представляет собой специальный объект, который формируется системой автоматически на основании того, какие точки и какие серии определены для данной диаграммы. Этот объект является совокупностью (коллекцией) интервалов, т.е. может содержать не один, а несколько интервалов, которые соответствуют паре серия-точка (создаваемый по умолчанию объект ЗначениеДиаграммыГантане содержит ни одного интервала). Разработчик может получить значение диаграммы, указав


364



Использование основных объектов конфигурации

интересующую его точку и серию, и затем добавить в коллекцию необходимое количество интервалов.

Все интервалы всех значений диаграммы располагаются с привязкой к единой оси времени, что дает возможность видеть их взаимное расположение.

Теперь объясним коротко последовательность наших дальнейших действий. В качестве исходных данных для построения такой диаграммы мы возьмем данные регистра расчета «Начисления» Каждая запись этого регистра уже содержит все необходимое для построения диаграммы: сотрудника, вид расчета, начало и конец интервала. Нам останется только средствами встроенного языка разместить все это в диаграмме. Итак, приступим.

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

С

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


Использование регистра расчета

Запрос = Новый Запрос; Запрос.Текст =

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

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

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

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

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

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

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

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

• «НачисленияФактическийПериодДействия.Регистратор.Предс
тавление»:


 


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

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


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

ПроцедураКнопкаСформироватьНажатие(Элемент) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ

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


 


366



Использование основных объектов конфигурации


Использование регистра расчета


 


|ИЗ

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

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

ВыборкаРезультата = Запрос.Выполнить().Выбрать(); Диаграмма= ЭлементыФормы.ДиаграммаГанта:

// Запретить обновление диаграммыДиаграмма.Обновление = Ложь;

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

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

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

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

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

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

ТекущаяСерия);

//создатьнужные нам интервалы в значенииТекущийИнтервал = ТекущееЗначеиие.Добавить();

ТекущийИнтервал.Начало = ВыборкаРезультата.ПериодДействияНачало;ТекущийИнтервал.Конец = ВыборкаРезультата.ПериодДействияКонец; ТекущийИнтервалЛ*екст = ВыборкаРезультата.РегистраторПредставление; ТекущийИнтервал.Расшифровка = ВыборкаРезультата.Регистратор; КонецЦикла;

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

иначеЕсли Серия.Значение =