58 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Вытеснение и расчет по базе
## Задание 1
### Описание задачи
Создать документ "Начисление по окладу", позволяющий ввести начисление по окладу по списку сотрудников с учетом графика работы и вытеснения.
### Требование к результату
Выгрузка информационной базы (.dt) с конфигурацией из предыдущего задания, содержащая документ **НачислениеПоОкладу**, позволяющий указать таблицу сотрудников.
Документ должен рассчитывать оклад, умножая реквизит **Оклад** справочника **Сотрудники** на отношение фактически отработанного времени к норме.
Норма должна рассчитываться согласно графику по периоду действия. Факт - согласно графику по фактическому периоду (т.е. с учетом вытеснения).
### Процесс выполнения
Конфигурация из предыдущего задания.
1. Добавьте непериодический регистр сведений **Календарь**.
Добавьте измерение **Дата** (Дата) и ресурс **РабочийДень** (Число). Ресурс будет содержать 1, если день рабочий, и 0 в противном случае.
Укажите его в качестве графика регистра расчета **Зарплата**.
Включите его в состав функциональной опции **ВестиРасчетЗарплаты**.
2. В плане видов расчета **НачисленияУдержания**:
Добавьте предопределенные виды расчетов **Больничный** и **Отпуск** как вытесняющие для вида расчета **ОплатаПоОкладу**.
3. Добавьте документ **НачислениеПоОкладу**.
Добавьте к нему табличную часть **Сотрудники** с реквизитом **Сотрудник**.
Сделайте его регистратором регистра расчета **Зарплата**.
Включите его в состав функциональной опции **ВестиРасчетЗарплаты**.
Выведите реквизиты на форму разумным образом.
4. В модуле документа создайте обработку проведения документа, в которой:
* Соберите запросом оклады сотрудников из документа по данным справочника **Сотрудники**.
* Очистите набор записей Движения.Зарплата.
* Для каждой строки табличной части создайте движение, заполнив в нем вид расчета (**ПланыВидовРасчета.НачисленияУдержания.ОплатаПоОкладу**), сотрудника, период регистрации и период действия. Период действия берите как начало и конец месяца даты документа. Сумму на этом этапе не заполняйте.
* Запишите набор записей Движения.Зарплата.
* Для каждой записи:
* Вызовом функции **РегистрыРасчета.Зарплата.ПолучитьДанныеГрафика** получите число рабочих дней в периоде действия (норму) и число рабочих дней в фактическом периоде (факт).
* Установите сумму как Оклад * Факт / Норма:
```bsl
Отбор = Новый Структура("Регистратор, Сотрудник", Ссылка, Движение.Сотрудник);
Норма = РегистрыРасчета.Зарплата.ПолучитьДанныеГрафика(Отбор,
ВидПериодаРегистраРасчета.ПериодДействия)[0].РабочийДень;
Факт = РегистрыРасчета.Зарплата.ПолучитьДанныеГрафика(Отбор,
ВидПериодаРегистраРасчета.ФактическийПериодДействия)[0].РабочийДень;
вижение.Сумма = ?(Норма = 0, 0, Оклад * Факт / Норма);
```
* Снова запишите набор записей Движения.Зарплата.
5. Заполните и проведите документ. Удостоверьтесь в том, что движения по регистру формируются по окладу в отсутствие вытесняющих оклад начислений (больничного, отпуска), и уменьшаются согласно дням неявки.