Вытеснение по периоду действия



Посмотрите, как работает механизм вытеснения по периоду действия.

6. Для этого понадобится создать документ Начисления сотрудникам № 3. Этим документом зафиксируем тот факт, что один мастер не выходил на работу с 1 по 10 число. Очевидно, что в этом случае потребуется пересчитать его оплату по окладу и как следствие начисленную премию. Нажмите Провести и закрыть и затем сформируйте отчет Перерасчет

В перерасчет попала запись о начислении оклада мастеру. Это явилось результатом работы механизма вытеснения по периоду действия, т.к. вид расчета Невыход вытесняет вид расчета Оклад. Обратите внимание, что в перерасчет попала и запись о начислении премии мастеру. При создании предопределенных видов расчета указано, что результат вида расчета Премия будет зависеть от изменения результата вида расчета Невыход. Эта зависимость косвенная, но поскольку явно указана такая зависимость, платформа ее отследила.

Перепроведите документы Начисления сотрудникам № 1 и № 2 и убедитесь, что таблица перерасчета очистилась.

Процедура расчета записей регистра расчета

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

Поскольку эти алгоритмы нужно будет использовать не только в документе Начисление сотрудникам, удобнее всего будет разместить их в отдельном общем модуле.

7. Откройте в конфигураторе текст обработчика проведения документа НачисленияСотрудникам и добавьте в него после завершения создания движений в регистре Начисления вызов процедуры РассчитатьНачисления() из общего модуля ПроведениеРасчетов.

Рис. 19.2 Листинг обработчика проведения документа НачисленияСотрудникам

Эту процедуру вызовите сначала для расчета первичных записей (Оклад), а затем для расчета вторичных (Премия).

Далее создайте в ветке Общие новый общий модуль ПроведениеРасчетов. Установите флажок Вызов сервера для видимости его экспортных процедур и функций. Добавьте в него процедуру РассчитатьНачисления.

Процедура РассчитатьНачисления ( НаборЗаписейРегистра , ТребуемыйВидРасчета , СписокСотрудников ) Экспорт     Регистратор = НаборЗаписейРегистра . Отбор . Регистратор . Значение ;     // Рассчитать первичные записи     Если ТребуемыйВидРасчета = ПланыВидовРасчета . ОсновныеНачисления . Оклад Тогда     Запрос = Новый Запрос ;            Запрос . Текст =                           "ВЫБРАТЬ                           | НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,                           | НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,                           | НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки                           |ИЗ                           | РегистрРасчета.Начисления.ДанныеГрафика(Регистратор = &Регистратор И                           | ВидРасчета = &ВидРасчета И Сотрудник В (&СписокСотрудников))                           | КАК НачисленияДанныеГрафика";            Запрос.УстановитьПараметр ("Регистратор", Регистратор );            Запрос.УстановитьПараметр ("ВидРасчета", ТребуемыйВидРасчета );            Запрос.УстановитьПараметр ("СписокСотрудников", СписокСотрудников );            ВыборкаРезультата = Запрос.Выполнить().Выбрать();            Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл                           СтруктураНомер = Новый Структура ("НомерСтроки");                           СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;                           ВыборкаРезультата.Сбросить();                           Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда                                           Если ВыборкаРезультата.Норма = 0 Тогда                                                           Сообщение = Новый СообщениеПользователю ;                                                           Сообщение.Текст = "Вид расчета: Оклад – Нет рабочих дней в заданном периоде";                                                           Сообщение.Сообщить();                                                           ЗаписьРегистра.Результат = 0;                                           Иначе                                                      // Рассчитать оклад по фактическому периоду и исходным данным                                                           ЗаписьРегистра.Результат = (ЗаписьРегистра.ИсходныеДанные/ВыборкаРезультата.Норма) *                                                                          ВыборкаРезультата.Факт;                                                           Сообщение = Новый СообщениеПользователю;                                                           Сообщение.Текст = "Выполнен расчет " + ЗаписьРегистра.Регистратор + " – " +                                                                          ЗаписьРегистра.ВидРасчета + " – " + ЗаписьРегистра.Сотрудник;                                                           Сообщение.Сообщить();                                           КонецЕсли ;                           КонецЕсли ;            КонецЦикла ;            // Рассчитать вторичные записи            ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия            Тогда                           Запрос = Новый Запрос;                           Запрос.Текст =                                           "ВЫБРАТЬ                                           | НачисленияБазаНачисления.РезультатБаза КАК База,                                           | НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки                                           |ИЗ                                           | РегистрРасчета.Начисления.БазаНачисления(&ИзмеренияОсновного,                                           | &ИзмеренияБазового, , Регистратор =                                           | &Регистратор И ВидРасчета = &ВидРасчета И                                           | Сотрудник В (&СписокСотрудников))                                           | КАК НачисленияБазаНачисления";                           Измер = Новый Массив(1);                           Измер[0] = "Сотрудник";                           Запрос.УстановитьПараметр(" ИзмеренияОсновного", Измер);                           Запрос.УстановитьПараметр(" ИзмеренияБазового", Измер);                           Запрос.УстановитьПараметр(" Регистратор", Регистратор);                           Запрос.УстановитьПараметр(" ВидРасчета", ТребуемыйВидРасчета);                           Запрос.УстановитьПараметр(" СписокСотрудников", СписокСотрудников);                           ВыборкаРезультата = Запрос.Выполнить().Выбрать();                           Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл                                           СтруктураНомер = Новый Структура ("НомерСтроки");                                           СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;                                           ВыборкаРезультата.Сбросить();                                           Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда                                                           ЗаписьРегистра.Результат = ВыборкаРезультата.База * ( 10 / 100);                                                           Сообщение = Новый СообщениеПользователю;                                                      Сообщение.Текст = "Выполнен расчет " + ЗаписьРегистра.Регистратор + " – " +                                                                                          ЗаписьРегистра.ВидРасчета + " – " + ЗаписьРегистра.Сотрудник;                                                           Сообщение.Сообщить();                                           КонецЕсли;                           КонецЦикла;     КонецЕсли; КонецПроцедуры

Рис. 19.3 Листинг процедуры РассчитатьНачисления

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

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

Отмените проведение документа Начисления сотрудникам № 3 (Еще -> Отмена проведения) и перепроведите документы Начисления сотрудникам № 1 и № 2. В Регистре начислений видно, что всем сотрудникам произведены начисления по окладу (поле Результат) за полный месяц в соответствии с исходными данными (поле Исходные данные). Сотрудникам начислена премия в размере 10 % от суммы начисления по окладу.

Проведите документ Начисление сотрудникам № 3, а затем № 1 и № 2. При этом отчет Перерасчет должен быть пуст.

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


Дата добавления: 2019-07-15; просмотров: 289; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!