gifts2017

Просто о сложных периодических расчетах (8.Х)

Опубликовал Ромич.. О.. (Rico_1C) в раздел Программирование - Практика программирования

Основы типового подхода реализации периодических расчетов в системе 1С:Предприятие 8.Х

Для реализации начисления и расчета ЗП задача делится на два блока:

1.      Начисление т.е. подготовительные (плановые) действия – кто и сколько должен заработать за определенный промежуток времени.

2.      Непосредственный расчет – фактический заработок за этот промежуток времени.

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

В данной статье поговорим о втором блоке.

Для реализации данного блока в платформе 1С:Предприятие необходимо использовать как минимум 5 объектов платформы (упрощенный вариант):

· Справочники (Сотрудники и Подразделения) – для расчета ЗП в разрезе сотрудников и подразделений.

· Документ Расчет ЗП – для непосредственного расчета ЗП, для простоты - все плановые данные будем вносить вручную.

Для учета рабочего времени нам понадобятся два объекта:

· Регистр сведений (Графики работы) – в нем мы будем хранить данные о рабочих днях, т.е. для каждой даты будем хранить данные: 1 - рабочий день, 0 - выходной.

Регистр обязательно должен быть - Непериодическим. (Рис. 1)

Рис.  1   Регистр сведений Графики работы - непериодический

В качестве измерений нам нужны минимум два измерения (Рис. 2):

«Дата» тип Дата – для которой хранится значение (рабочий день или выходной).

«График» (справочник) – для хранения данных о рабочих днях разных графиков, т.е. для одного графика текущая дата может быть рабочим днем, а для другого выходным.

В качестве ресурса – «Значение» тип число, для хранения непосредственно значения (1 - рабочий день, 0 - выходной).

 

Рис.  2   РС Графики работы - структура данных

 

· Планы видов расчета

· Регистры расчета


 

О Планах видов расчета и Регистрах расчета нужно поговорить поподробнее – это довольно специфические объекты на которых нужно акцентировать внимание.

План видов расчета (ПВР) – это своеобразный «справочник» однотипных алгоритмов расчета ЗП, т.е. Видов расчета (начислений)  - таких как Оклад, Премия, Прогул и т.д. Которые можно рассчитывать по определенным однотипным правилам.

Для определенности рассмотрим самые распространенные Виды расчетов:

- Оклад

- Премия процентом

- Премия суммой

- Отпуск

- Больничный

- Удержание Алименты

Каждый ПВР может состоять из нескольких Видов расчета – это можно сравнить, как Справочник с элементами справочника.

Свойства ПВР распространяются на все входящие в него Виды расчета:

- Использует период действия

- Зависимость от базы

Эти свойства для большего понимания лучше рассмотреть на примерах:

Использование периода действия – это булевский признак самого ПВР.

Виды расчета входящие в ПВР с данным свойством – это те Виды расчета которые зависят от времени, такие как Оклад, Отпуск, Больничный.

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

Зависимости от базы:

- Может не быть

- По периоду действия

- По периоду регистрации

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

Примеры зависимостей от базы:

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

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

Зависимость от базы, по периоду действия – это зависимость от начислений за выбранный промежуток времени.

Зависимости может и не быть – это такие Виды расчета как Премия суммой.

Зависимость от базы, по периоду регистрации – это зависимость от начислений выполненных в Период регистрации.

Период регистрации – это период в котором начисляются Виды расчетов.

Для более простого понимания приведем пример:

Зарплата за январь может быть начислена в конце января или в начале февраля.

Если ЗП будет начислена в январе, в этом случае Период регистрации будет Январь, если в феврале – Февраль, т.е. Период регистрации это период в котором происходит начисление. Не важно за какой период – за текущий или за другой.

 В данном примере, если ЗП будет начислена в январе – база по Периоду действия и Периоду регистрации будут совпадать. Если ЗП будет начислена в феврале – в этом случае в базу по Периоду действия попадут все начисления за январь, а в базу по Периоду регистрации попадут все начисления за февраль.

Примером Базы по Периоду регистрации может быть – Удержание Алиментов процентом от всех начислений в заданном периоде.

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

Т.е. за – это по Периоду действия, в – это по Периоду регистрации.

Все Виды расчетов протяженные во времени желательно объединить в один ПВР с установленным свойством – Использует период действия.

Все Виды расчетов не протяженные во времени желательно объединить в один ПВР без установленного свойства – Использует период действия.

Все Удержания – желательно объединить в отдельном ПВР.

Также следует отметить, что у каждого Вида расчета можно настроить:

- Базу, от которой зависит данный Вид расчета

- Вытесняющие Виды расчета

- Ведущие Виды расчета

Закладка «Базовые» доступна только у тех Видов расчета которые принадлежат ПВР со свойством Зависимость от базы – отличным от «Не зависит».

На данной закладке можно выбрать те Виды расчета от которых есть зависимость данного Вида расчета.

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

Закладка «Вытесняющие» доступна только у тех Видов расчета которые принадлежат ПВР со свойством – Использует период действия.

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

Например, для Вида расчета Оклад – вытесняющим Видом расчета является Больничный и Отпуск. Для Отпуска – только Больничный. Оклад не может вытеснять ни Отпуск, ни Больничный.

Закладка «Ведущие» доступна всем Видам расчета.

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

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

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

Например, для Вида расчета Оклад – ведущим Видом расчета является и Больничный и Отпуск. Для Отпуска – также является и Оклад и Больничный, поскольку при изменении оклада в базовом периоде нужно пересчитать и оклад. Больничный также зависит и от Оклада и от Отпуска.

Исходя из вышесказанного можно сделать следующий вывод.

Для реализации вышеперечисленных Видов расчета нужно выполнить следующие действия:

Вначале лучше выполнить самим, а потом сравнить с приведенным решением.

 

1.      Создать три ПВР (Рис. 3)

- Основные виды начислений

Использует период действия, Зависимость от базы: Зависит по периоду действия

 

 Рис.  3   ПВР Основные начисления

 

- Дополнительные виды начислений (Рис. 4)

Зависимость от базы: Зависит по периоду действия

 

Рис.  4   ПВР Дополнительные начисления

 

После добавления Дополнительного начисления нужно не забыть установить его в качестве базы в - Основных начислениях. (Рис. 3)

 

- Удержания (Рис. 5)

Зависимость от базы: Зависит по периоду регистрации

 

 Рис.  5   ПВР Удержания

 

2.      В Основные виды начисления добавить Виды расчета

- Оклад (Рис. 6)

Базовые – нет

Вытесняющие – Отпуск и Больничный

Ведущие – Отпуск и Больничный

Рис.  6   Вид расчета Оклд, закладки - "Вытесняющие" и "Ведущие"

 

- Отпуск (Рис. 7)

Базовые – Оклад, Больничный, Премия процентом, Премия суммой

Вытесняющие – Больничный

Ведущие – Оклад, Больничный, Премия процентом, Премия суммой

Рис.  7   Вид расчета Отпуск, закладки - "Базовые", "Вытесняющие" и "Ведущие" 

 

- Больничный (Рис. 8)

Базовые – Оклад, Отпуск, Премия процентом, Премия суммой

Вытесняющие – нет

Ведущие – Оклад, Отпуск, Премия процентом, Премия суммой

Рис.  8   Вид расчета Больничный, закладки - "Базовые" и "Ведущие" 

 

3.      В Дополнительные виды начисления добавить Виды расчета

- Премия процентом (Рис. 9)

Базовые – Оклад, Отпуск, Больничный, Премия суммой

Ведущие – Оклад, Отпуск, Больничный, Премия суммой

Рис.  9   Вид расчета Премия процентом, закладки - "Базовые" и "Ведущие" 

 

- Премия суммой

Базовые – нет

Ведущие – нет

 

4.      В Удержания добавить Вид расчета

- Алименты (Рис. 10)

Базовые – Оклад, Отпуск, Больничный, Премия процентом, Премия суммой

Ведущие – Оклад, Отпуск, Больничный, Премия процентом, Премия суммой

Рис.  10   Вид расчета Алименты, закладки - "Базовые" и "Ведущие" 

 

Регистр расчета – это своеобразная таблица (на самом деле несколько взаимосвязанных таблиц) в которой хранятся все записи движений. Т.е. в нем хранятся все данные о начисленной ЗП (фактически заработанной) и плановые данные – сколько должно было быть начислено. Регистр расчета в отличие от других регистров (накопления и бухгалтерии) не хранит итоги. Как и в других регистрах есть Измерения, Ресурсы и Реквизиты.

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

На закладке «Основные» настраивается связь Регистра расчета с ПВР и Графиком (Рис. 11). Обычно имя Регистра расчета совпадает с именем ПВР. Свойство Период действия устанавливается, если в ПВР установлено свойство – Использует период действия. При установленном свойстве Период действия обязательно нужно установить связь с Графиком (регистром сведений).

В поле Значение графика – выбирается ресурс Графика, оно нужно для определения плановых отработанных дней при определении базы. Т.е. на сколько рабочих дней нужно разделить сумму полученную в базовом периоде, для определения среднедневной ЗП – например при расчете Отпуска.

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

В поле Периодичность – выбирается Периодичность с которой будет рассчитываться ЗП, обычно Месяц.

Рис.  11   Связи Регистра расчета Основные начисления и ПВР Основные начисления

У Регистра расчета есть обязательное свойство – ПериодРегистрации, это дата которая при записи в базу всегда приводится к началу  периода кратного периодичности. Если Периодичность месяц, тогда Период регистрации всегда будет – начало месяца.

На закладке «Данные» - задаются (Рис. 12):

· Измерения

- Сотрудник (справочник) – для хранения данных в разрезе сотрудников

- Подразделение (справочник) – для хранения данных в разрезе подразделений

 

· Ресурсы

- Результат – для хранения рассчитанной суммы

 

· Реквизиты

- Размер тип число – для хранения планового размера ЗП

- График (измерение РС) – именно здесь настраивается связь для каждой записи, в разрезе какого именно Графика хранить данные. В свойствах реквизита – обязательно нужно указать Связь с графиком. 

График можно указать и в Измерении, но если не нужно хранить данные в разрезе каждого Графика – связь лучше настроить в реквизитах.

 

Рис.  12   Регистр расчета Основные начисления - структура данных

 

Также следует отметить такую особенность Регистра расчета – как вытеснение Видов расчетов по периоду действия, т.е. один Вид расчета автоматически вытесняется другим Видом расчета – указанным на закладке «Вытесняющие» ПВР.

Например, если в текущем месяце задан Оклад с 1 по 31 и Больничный с 10 по 15 – Больничный автоматически вытеснит Оклад с 10 по 15. Оклад разобьется на две части с 1 по 9 и с 16 по 31. Все это произойдет при записи в базу – автоматически.

Таким образом все настройки устанавливаются в ПВР, а используются в Регистрах расчета.

Добавим еще два Регистра расчета, для Дополнительных начислений и Удержаний.

 

План видов расчета – Дополнительные начисления и Удержания, соответственно.

Измерения и Ресурсы аналогичны Основным начислениям, в качестве реквизита – только Размер (нет периода действия, поэтому График не нужен) (Рис. 13).

 

Рис.  13   Регистр расчета Дополнительные начисления - структура данных

Для реализации расчета ЗП нужно создать Документ – Расчет ЗП.

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

В качестве реквизита можно добавить одно значение – ПериодРегистрации типа Дата, может отличаться от даты документа (Рис. 14).

Добавим три ТЧ (Рис. 14):

· Основные начисления

- Сотрудник (справочник)

- Подразделение (справочник)

- Вид расчета (ПВР Основные начисления)

- График (справочник)

- ДатаНачала (Дата) – дата начала периода действия, т.е. с какой даты рассчитывать данные

- ДатаОкончания (Дата) – дата окончания периода действия, т.е. по какую дату рассчитывать данные

- БПНачало (Дата) – дата начала базового периода, т.е. с какой даты выбирать данные

- БПОкончание (Дата) – дата окончания базового периода, т.е. по какую дату выбирать данные

- Размер (число) – плановое значение

- Сторно (булево) – у каждой записи Регистра расчета есть признак сторно

 

· Дополнительные начисления

- Сотрудник (справочник)

- Подразделение (справочник)

- Вид расчета (ПВР Дополнительные начисления)

- БПНачало (Дата) – дата начала базового периода, т.е. с какой даты выбирать данные

- БПОкончание (Дата) – дата окончания базового периода, т.е. по какую дату выбирать данные

- Размер (число) – плановое значение

- Сторно (булево) – у каждой записи Регистра расчета есть признак сторно

 

· Удержания.

- Сотрудник (справочник)

- Подразделение (справочник)

- Вид расчета (ПВР Удержания)

- БПНачало (Дата) – дата начала базового периода, т.е. с какой даты выбирать данные

- БПОкончание (Дата) – дата окончания базового периода, т.е. по какую дату выбирать данные

- Размер (число) – плановое значение

- Сторно (булево) – у каждой записи Регистра расчета есть признак сторно

 

Рис.  14   Документ Расчет ЗП - структура данных

На закладке «Движения» выберем регистры – Основные начисления, Дополнительные начисления и Удержания (Рис 15).

 

Рис.  15   Документ Расчет ЗП - установка запрета опертивного проведния и выбор подчиненных Регистров расчета


Процедура ОбработкаПроведения(Отказ, Режим)

    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

    // Данный фрагмент построен конструктором.

    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    // регистр ОсновныеНачисления

   
Движения.ОсновныеНачисления.Записывать = Истина;

    Для Каждого
ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл

       
Движение = Движения.ОсновныеНачисления.Добавить();

       
Движение.Сторно = Ложь;

       
Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета;

       
Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала;

       
Движение.ПериодДействияКонец = ТекСтрокаОсновныеНачисления.ДатаОкончания;

       
Движение.ПериодРегистрации = ПериодРегистрации;

       
Движение.БазовыйПериодНачало = ТекСтрокаОсновныеНачисления.БПНачало;

       
Движение.БазовыйПериодКонец = ТекСтрокаОсновныеНачисления.ДатаОкончания;

       
Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник;

       
Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение;

       
Движение.Размер = ТекСтрокаОсновныеНачисления.Размер;

       
Движение.График = ТекСтрокаОсновныеНачисления.График;

    КонецЦикла;



   
// регистр ДополнительныеНачисления

   
Движения.ДополнительныеНачисления.Записывать = Истина;

    Для Каждого
ТекСтрокаДополнительныеНачисления Из ДополнительныеНачисления Цикл

       
Движение = Движения.ДополнительныеНачисления.Добавить();

       
Движение.Сторно = Ложь;

       
Движение.ВидРасчета = ТекСтрокаДополнительныеНачисления.ВидРасчета;

       
Движение.ПериодРегистрации = ПериодРегистрации;

       
Движение.БазовыйПериодНачало = ТекСтрокаДополнительныеНачисления.БПНачало;

       
Движение.БазовыйПериодКонец = ТекСтрокаДополнительныеНачисления.БПОкончание;

       
Движение.Сотрудник = ТекСтрокаДополнительныеНачисления.Сотрудник;

       
Движение.Подразделение = ТекСтрокаДополнительныеНачисления.Подразделение;

       
Движение.Размер = ТекСтрокаДополнительныеНачисления.Размер;

    КонецЦикла;



   
// регистр Удержания

   
Движения.Удержания.Записывать = Истина;

    Для Каждого
ТекСтрокаУдержания Из Удержания Цикл

       
Движение = Движения.Удержания.Добавить();

       
Движение.Сторно = Ложь;

       
Движение.ВидРасчета = ТекСтрокаУдержания.ВидРасчета;

       
Движение.ПериодРегистрации = ПериодРегистрации;

       
Движение.БазовыйПериодНачало = ТекСтрокаУдержания.БПНачало;

       
Движение.БазовыйПериодКонец = ТекСтрокаУдержания.БПОкончание;

       
Движение.Сотрудник = ТекСтрокаУдержания.Сотрудник;

       
Движение.Подразделение = ТекСтрокаУдержания.Подразделение;

       
Движение.Размер = ТекСтрокаУдержания.Размер;

    КонецЦикла;



   
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ



   
Движения.Записать();

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

В конце процедуры явно запишем все движения – это нужно для определения плановых значений и фактического периода действия. Именно при записи происходит вытеснение одних Видов расчета другими. Также при записи движений в регистр записываются плановые значения – Размер.

При первой записи движений – формируются рабочие записи в Регистре движений в которых и хранятся плановые значения и Фактический период действия. 

Дальше происходит обращение к рабочим записям регистра и рассчитывается непосредственно – результат ЗП.

Данная статья была написана после прохождения базового курса «Профессиональное программирование в 1С: Предприятие 8.2».

Более полную и подробную информацию можно узнать на сайте http://mg.spec8.ru/

В свойствах этих регистров установим Базовый период и Периодичность – месяц.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Николай Больсунов (boln) 19.09.10 21:10
>>Дальше происходит обращение к рабочим записям регистра и рассчитывается непосредственно – результат ЗП.
*** THE END ***
:D :D :D
А ведь это и есть самое содержательное (и самое сложное) при реализации расчетных алгоритмов. Создание исходных наборов записей конструктором движений и первоклассник напишет.
Поэтому никакого содержания в статье-то по факту и нет.

Автору - сюда:
http://www.1c-uc3.ru/conf_rasch-sod82.html
1С-Учебный Центр №3; +1 Ответить 2
2. mirco brons (mirco) 19.09.10 23:44
Все объяснения по смысловым абзацам сопроводите схемой происходящих начислений.
Текс подправте под созданные схемы: "на схеме 1 видно - оклад премия зависит от ...."
За труд однозначно +, мне кажется ИС нуждается в наполнении теорией, а не только практикой.
3. mirco brons (mirco) 19.09.10 23:50
(1) эмм..., у меня есть не изученные моменты в расчетных алгоритмах, реализуемых в 1с - может Вы своей развернутой и понятной статьей с примерами сможете мне объяснить суть реализации сабжа?
4. Ромич.. О.. (Rico_1C) 20.09.10 00:12
(1) Дело в том, что в данной статье описываются базовые азы - без которых вообще невозможно понять принцыпы работы Расчета. Естественно самое сложное впереди -
самое содержательное (и самое сложное) при реализации расчетных алгоритмов
. Но это ведь не опишешь в статье словами - здесь нужно детельно показывать и рассказывать. Обо всем об этом - есть материал в приведенной ссылке, в видео формате.
5. Ромич.. О.. (Rico_1C) 20.09.10 01:06
(2) Спасибо за - конструктив ! :)

P.S.: Моя первая статья, будем - совершенствоваться.
6. Николай Больсунов (boln) 20.09.10 14:00
(4) Надо понимать, продолжение будет? Если нет, то это не статья, а тизер.
7. Николай Больсунов (boln) 20.09.10 14:01
(3) Я занимаюсь этим профессионально в УЦ-3.
8. Ромич.. О.. (Rico_1C) 20.09.10 15:06
(6) Продолжение, на сайте - уазанном в конце статьи.

В статье продолжение не опишешь - даже азы пришлось расписывать на 10 стр., для продолжения - нужно писать книгу.

P.S.: Суть статьи - дать базис, без которого - невозможно идти дельше.
9. Николай Ожерельев (nozherelyev) 06.10.10 12:15
Коллеги! а кто-нибудь занимался настройкой управленческой зарплаты?
10. Vit Ast (astvit15) 19.09.11 14:02
Очень полезная статья!Большое спасибо!
11. Брест Беларусь (zhleonid8) 29.09.11 13:32
статья + но вот не мешало бы организовать работу со штатным расписанием!
12. Осипов Сергей (fixin) 27.09.12 13:14
для совсем чайников рекомендую свою статью: http://infostart.ru/public/116215/
13. Осипов Сергей (fixin) 27.09.12 13:15
(9) я занимался сложным расчетом бонусов, но не использовал эти поделки (регистры расчетов) от 1с.
14. mikaizh (mikaizh) 01.10.12 00:15
(9) на сайте http://videozup.ru/ кое-что есть про управленческую зарплату
15. Viktor Kupko (zipik) 11.10.12 13:12
16. Dmitriy (daho) 03.11.12 16:52
(12) fixin, Ну как всегда!!!! :) На ссылки других авторов принципиально не отправим.. :) а вообще спасибо и автору и фиксину..
хорошее подспорье для обучения новичков..
17. Анатолий (hame1e00n) 02.08.13 00:58
Автору огромное спасибо!!! Искал как раз такую статью, где расписана именно настройка ПВР и регистров расчета! Спасибо!!!!
18. юрий гулидов (gull22) 01.07.14 08:47
19. Владимир Дульнев (SiliconValet) 23.04.16 00:02
Спасибо за статью!

У Радченко по созданию пвр и регистрам расчета 20 страниц, детально разобраться в которых было почти невозможно без Ваших пояснений!