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

Создать документ Начисления. На вкладке Данные создать табличную часть РасшифровкаНачислений, которая включает следующие реквизиты: Сотрудник, ГрафикРаботы, ДатаНачала, ДатаОкончания, ВидРасчета (План видов расчета Основные начисления), Результат (Число).

 

Анализ алгоритма проведения расчетов

На Рис. 14Алгоритм расчета по окладу представлен алгоритм расчета составляющей по окладу. Особенностью представленных расчетов является то, что сначала документ Начисление проводится по регистру расчета (без расчета результата), а потом на основании созданных записей рассчитываются значений оклада. При этом учитывается как нормативный период, так и фактический период работы, так и вытесняющие расчеты. Результат заносится в регистр.

На Рис. 15 представлен алгоритм расчета составляющей по премии. Здесь учитываются только те сотрудники, у которых вид начисления – премия. При расчете используется база расчетов (указана для премии в плане видов расчета). Причем, не нормативная база, а с учетом фактического периода действия, то есть вытесняющих видов расчета.

 


Рис. 14Алгоритм расчета по окладу

 

 

 


Рис. 15 Фрагмент алгоритма расчета премии

 

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

 

Проведение документа Начисления по регистру расчета

В документе Начисления вызвать Конструктор движений и сформировать движения документа. Вид движения представлен на Рис. 16.

Рис. 16 Движения документа Начисления в режиме конструктора

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

 

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

Создать новый общий модуль, имя – Расчеты. В модуле сформировать следующую процедуру.

Процедура Рассчитать(ЗаписиРегистра, ВидРасчета,СписокРаботников) Экспорт Начало процедуры. В скобках – входящие параметры, которые будут формироваться в документах, использующих процедуру
Если ВидРасчета=ПланыВидовРасчета. ОсновныеНачисления.Оклад тогда Начало расчетов по ВидуРасчета Оклад
             Запрос=Новый Запрос;              Запрос.Текст= Организация нового запроса к регистру ЗП_Расчет, виртуальное представление – Данные графика

Формирование запроса в режиме конструктора. Результатом выполнения запроса является: ПоНорме (нормативный период действия – дней в месяце), ПоФакту – фактический период действия с учетом вытесняющих расчетов для строк регистра (НомерСтроки). Ограничения (условия): по заданному виду расчета (оклад), по ограниченному списку сотрудников, анализируются записи регистра, соответствующие заданному документу (регистратору).

             "ВЫБРАТЬ

             | ЗП_РасчетДанныеГрафика.ЗначениеФактическийПериодДействия КАК ПоФакту,

             | ЗП_РасчетДанныеГрафика.НомерСтроки,

             | ЗП_РасчетДанныеГрафика.ЗначениеПериодДействия КАК ПоНорме

             |ИЗ

             | РегистрРасчета.ЗП_Расчет.ДанныеГрафика КАК ЗП_РасчетДанные Графика

             |ГДЕ

             | ЗП_РасчетДанныеГрафика.Регистратор = &Регистратор

             | И ЗП_РасчетДанныеГрафика.ВидРасчета = &ВидРасчета

             | И ЗП_РасчетДанныеГрафика.Сотрудник В(&СписокСотрудников)";

Запрос.УстановитьПараметр("Регистратор", ЗаписиРегистра.Отбор.Регистратор. Значение); Установка параметра Регистратор. Будет соответствовать ссылке на регистратор для переданных Записей регистра (которые, в свою очередь будут соответствовать документу Начисления)
 Запрос.УстановитьПараметр ("ВидРасчета",ВидРасчета); Установка параметра Вид расчета (Оклад).
Запрос.УстановитьПараметр ("СписокСотрудников",СписокРаботников); Установка параметра СписокСотрудников, который будет передан из документа при вызове процедуры.
ВыборкаРезультата=Запрос.Выполнить().Выбрать(); Выполнение запроса, результату выполнения присвоено имя – ВыборкаРезультата
Для каждого ЗаписьРегистра из ЗаписиРегистра Цикл Начало цикла для перебора переданных записей регистра расчета
       СтруктураНомер=Новый Структура("НомерСтроки"); Создание временной структуры, состоящей из одной колонки (НомерСтроки)
       СтруктураНомер.Номер Строки= Запись Регистра НомерСтроки; Передача в структуру, созданную на предыдущем шаге номера записи регистра (Номера Строки)
       ВыборкаРезультата.Сбросить(); Позиционирование выборки на первую запись
       Если ВыборкаРезультата.Найти Следующий(СтруктураНомер) тогда Если номер записи в выборке совпадает с номером записи из переданных записей регистра, то переход к расчету по окладу
              Если ВыборкаРезультата.ПоНорме=0 тогда               Сообщить("Нет рабочих дней");               ЗаписьРегистра.Результат=0 Если отсутствует результат по норме (для сотрудника не установлен график), то формирование нулевого результата
             Иначе ЗаписьРегистра.Результат= (ЗаписьРегистра. ИсходныеДанные/ ВыборкаРезультата. ПоНорме)* ВыборкаРезультата.ПоФакту; Расчет фактического оклада
             КонецЕсли КонецЕсли КонецЦикла Завершения расчета по окладу
ИначеЕсли              ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Премия тогда Начало расчетов по ВидуРасчета Премия

Формирование запроса в режиме конструктора. Результатом является значение базы по каждой строке регистра. Ограничения аналогичны предыдущему запросу. Добавляются ограничения по измерениям основного и базового регистра. В данном примере это один регистр, требуемое измерение - Сотрудник

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

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

              "ВЫБРАТЬ

              | ЗП_РасчетБазаЗП_Расчет.НомерСтроки,

              | ЗП_РасчетБазаЗП_Расчет.РезультатБаза КАК База

              |ИЗ

              | РегистрРасчета.ЗП_Расчет.БазаЗП_Расчет(&ИзмеренияОсновной, &ИзмеренияБазовый,,) КАК ЗП_РасчетБазаЗП_Расчет

              |ГДЕ

              | ЗП_РасчетБазаЗП_Расчет.Регистратор = &Регистратор

              | И ЗП_РасчетБазаЗП_Расчет.ВидРасчета = &ВидРасчета

              | И ЗП_РасчетБазаЗП_Расчет.Сотрудник В(&СписокСотрудников)";

              Измерение=Новый Массив(1);  
              Измерение[0]="Сотрудник";  
             Запрос.УстановитьПараметр ("ИзмеренияОсновной",Измерение);

Установка параметров для запроса

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

Смотри комментарии выше для расчета оклада

Для каждого ЗаписьРегистра из ЗаписиРегистра Цикл
             СтруктураНомер=Новый Структура("НомерСтроки");
             СтруктураНомер.НомерСтроки=ЗаписьРегистра.НомерСтроки;
             ВыборкаРезультата.Сбросить();
             Если ВыборкаРезультата.Найти Следующий(СтруктураНомер) тогда
ЗаписьРегистра.Результат=ВыборкаРезультата.База*0.25;
             КонецЕсли
             КонецЦикла
КонецЕсли
КонецПроцедуры  

 

Разработка процедуры обработки проведения (расчета) в документе Начисления

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

 

 

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

Формирование запроса в режиме конструктора, который формирует список сотрудников в соответствии с текущим документом Начисления.

"ВЫБРАТЬ РАЗЛИЧНЫЕ

|   НачисленияРасшифровкаНачислений.Сотрудник

|ИЗ

|   Документ.Начисления.РасшифровкаНачислений КАК НачисленияРасшифровкаНачислений

|ГДЕ

|   НачисленияРасшифровкаНачислений.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка",Ссылка); Установка ссылки на текущий документ для передачи в запрос
ТаблЗнач=Запрос.Выполнить().Выгрузить(); Выполнение запроса и выгрузка в таблицу значений
СписокРаботников=Новый СписокЗначений; Создание нового списка значений
СписокРаботников.ЗагрузитьЗначения (ТаблЗнач.ВыгрузитьКолонку("Сотрудник")); Выгрузка в список значений списка сотрудников
Рассчитать(Движения.ЗП_Расчет, ПланыВидовРасчета.ОсновныеНачисления.Оклад, СписокРаботников);

Вызов процедуры из общего модуля, передача входных параметров

Рассчитать(Движения.ЗП_Расчет,ПланыВидов Расчета.ОсновныеНачисления.Премия, Список Работников);
 
Движения.ЗП_Расчет.Записать(Истина);    Записать результаты расчета

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

Перейти в режим приложения и проверить работу процедур расчетов.

 




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: