Один из основных моментов в модуле HCM - расчёт заработной платы. Все данные расчета лежат в кластерах PCL1 и PCL2, который читаю специальными ФМ-ми. За редким исключением, когда произведена декластеризация ( На практике видел такое только в одной системе, поэтому опустим этот вид доступа к данным расчета).
Расчет ЗП для человека можно посмотреть в транзакции PC_PAYRESULT. Поскольку данная заметка предназначена больше для разработчиков, чем для консультантов, подробно описывать все таблицы не буду.
Как правило, нас интересуют виды оплат(ВО) из таблицы RT, которые необходимо получить как полностью за весь период расчета, так и по каким либо сплитам. Например AB или WPBP.
Физический смысл этих сплитов показать, какие выплаты были в случае определенного Организационного присвоения (WPBP) или В привязки к каким-нибудь отсутствиям (AB).
Также нас интересуют следующие поля в расчете:
1. Индикатор актуальности - говорит о том, что мы имеем актуальный расчет или нет. Физический смысл следующий. Если вам в рассчитали зп единожды, а потом по какой либо причине пересчитали. Актуальным (А) будет только последний расчет, все прошлые расчеты данного периода станут предыдущими (P).
2. Краеугольный камень чтения результата расчёта ЗП это "Для"-период и "В"-период. В зависимости от типа по которому хотим получать данные, будут различаться инструменты и алгоритмы обработки полученных записей.
"В"-период - период в котором производился расчет.
"Для"-период - период для которого производился расчет.
Пример:
Человек отработал в январе все дни, а в последний не пришел по какой-то неясной для работодателя причине. В итоге "В"-периоде 01.2023 ему рассчитали ЗП. "Для"-периода 01.2023. После этого в феврале он принес больничный лист на этот последний день января. В феврале будет произведен перерасчет января с уточненными данными. В итоге получим новый расчёт за январь у которого "В"-период будет 02.2023 (ведь его считали уже в феврале), а вот Для-период будет все тот же 01.2023 (Т.к. этот расчет для января). При этом актуальным будет именно последний расчет, а первый получит тип Предыдущий (P).
Надеюсь, пример не запутал вас еще больше.
Для-период
Получение данных ДЛЯ-период начинается с получения данных о всех расчетах по текущему ТН. После чего выбираются только Актуальные(A) записи srtza = 'A' .
Также в примере видно, что определённые ВО собираются по сплиту AB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
* DATA ls_payroll TYPE payru_result. DATA lt_rgdir TYPE TABLE OF pc261. DATA ls_rgdir LIKE LINE OF lt_rgdir. CALL FUNCTION 'CU_READ_RGDIR' EXPORTING persnr = iv_pernr TABLES in_rg_dir = lt_rgdir EXCEPTIONS no_record_found = 1 OTHERS = 2. * Когда необходимо считать Для-период берем только srtza = 'A' LOOP AT lt_rgdir INTO ls_rgdir WHERE fpbeg GE iv_begda AND fpend LE iv_endda AND srtza = 'A'. CLEAR ls_payroll. CALL FUNCTION 'PYXX_READ_PAYROLL_RESULT' EXPORTING employeenumber = iv_pernr sequencenumber = ls_rgdir-seqnr CHANGING payroll_result = ls_payroll EXCEPTIONS OTHERS = 1. IF sy-subrc NE 0. LOOP AT ls_payroll-inter-ab INTO DATA(ls_ab). LOOP AT ls_payroll-inter-rt INTO DATA(ls_rt) WHERE abznr = ls_ab-abznr. " Куда-нибудь сохраняем данные ENDLOOP. ENDLOOP ENDIF. ENDLOOP. ENDIF. |
В-период
В случае В-периода необходимо учитывать не только Актуальные (А), но и Предыдущие расчеты (P). Суммы из актуальных расчетов используются как есть, а у прошлых знак инвертируется.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
DATA lt_payroll TYPE payru_result_tab. CALL FUNCTION 'HR_GET_PAYROLL_RESULTS' EXPORTING pernr = iv_pernr pabrj = '01' pabrp = '2023' TABLES result_tab = lt_payroll EXCEPTIONS OTHERS = 1. * evp-payty - Регулярный расчет. Может в вашем случае нужен какой-то другой LOOP AT lt_payroll INTO ls_data WHERE evp-payty IS INITIAL. LOOP AT ls_data-inter-rt INTO DATA(ls_rt). * В случае В-период, надо брать расчеты * srtza='A' с + * srtza='P' с - IF ls_data-evp-srtza = 'P'. ls_rt-anzhl = - ls_rt-anzhl. ls_rt-betrg = - ls_rt-betrg. ENDIF. " Производим манипуляции с данными ENDLOOP. ENDLOOP. |
Для В-периодов существует более простое с точки зрения разработчика решение - использование класса cl_hrpayru_pltaxrun или более нового cl_hrpayru_pltaxrun_ce. Он умеет самостоятельно собирать данные по ВО на основании настройки из транзакции HRPAYRUT7RUN.
Удобство данного метода состоит в том, что практически все суммирования ВО решаются настройкой, а вам как разработчику, остается только воспользоваться результатам. Кроме того, учитываются всевозможные доработки, которые могут производиться для определённых справок. Если есть возможность использовать cl_hrpayru_pltaxrun - используйте.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
DATA lo_tax TYPE REF TO cl_hrpayru_pltaxrun. DATA lt_exkey TYPE prupy_t_splitting_fields. DATA ls_selpot TYPE prupy_s_selpot. " mc_repid - это имя отчета из настройки транзакции CREATE OBJECT lo_tax EXPORTING begda = iv_begda endda = iv_endda repid = mc_repid selcond = ls_selpot EXCEPTIONS others = 1. *Тут задается сплит *В таблице результата будет код с ключами данного сплита * По которому можно определить как ВО собрались. lt_exkey = VALUE #( ( table = 'AB' field = 'ABZNR' ) ( table = 'AB' field = 'OBEGD' ) ). lo_tax->set_conditions( it_exkey = lt_key ). lo_tax->if_hrpayry_report_control~set_person( EXPORTING i_pernr = iv_pernr EXCEPTIONS payroll_results = 1 error_of_class = 2 no_read_authority = 3 ). " Таблица результата DATA(lt_wages) = lo_tax->at_wages. |
Разумеется, в реальных задачах могут быть потребности собирать данные несколько иначе, консультант уточнит при постановке.