При построении отчетов по начислениям и выплатам в конфигурациях 1С (в частности, в 1С:Бухгалтерии или 1С:ЗУП) разработчики часто сталкиваются с проблемой получения действующего оклада. Если сотрудник был уволен в течение выбранного месяца, стандартный срез последних на конец периода возвращает нулевой оклад, так как документ увольнения прекращает действие начисления. Если же брать срез последних на начало месяца, в выборку не попадут сотрудники, принятые на работу в середине месяца.
Рассмотрим, почему возникает эта проблема и как правильно составить запрос для корректного получения окладов по всем сотрудникам — работающим, принятым и уволенным.
Проанализируем механику работы регистра сведений плановых начислений или параметров оплаты труда:
0.Таким образом, фиксированная дата среза последних для всего отчета не подходит. Для решения этой задачи требуется выбрать период действия оклада индивидуально для каждого сотрудника.
Самый надежный и универсальный способ — отказаться от использования виртуальной таблицы СрезПоследних с зафиксированной датой и обратиться напрямую к физической таблице регистра сведений. Разберем этот подход по шагам.
Сначала сформируем временную таблицу с максимальными датами записей по каждому сотруднику, где размер оплаты больше нуля или где запись предшествует моменту увольнения:
ВЫБРАТЬ
ПараметрыОплаты.Сотрудник КАК Сотрудник,
МАКСИМУМ(ПараметрыОплаты.Период) КАК Период
ПОМЕСТИТЬ ВТ_МаксимальныеДаты
ИЗ
РегистрСведений.ПараметрыОплатыПОМО ТАКЖЕ КАК ПараметрыОплаты
ГДЕ
ПараметрыОплаты.Период <= &КонецПериода
И ПараметрыОплаты.Размер > 0
СГРУППИРОВАТЬ ПО
ПараметрыОплаты.Сотрудник
;
Затем соединим полученные максимальные даты с физической таблицей регистра, чтобы извлечь соответствующее значение оклада:
ВЫБРАТЬ
ВТ.Сотрудник КАК Сотрудник,
ПараметрыОплаты.Размер КАК Оклад
ИЗ
ВТ_МаксимальныеДаты КАК ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыОплаты КАК ПараметрыОплаты
ПО ВТ.Сотрудник = ПараметрыОплаты.Сотрудник
И ВТ.Период = ПараметрыОплаты.Период
Если отчет строится за период, в котором одновременно необходимо учесть работающих, принятых и уволенных сотрудников, можно применить следующий алгоритм:
ОБЪЕДИНИТЬ ВСЕ) всех сотрудников, принятых в течение периода.Рассмотрим структуру такого запроса:
ВЫБРАТЬ
КадровыеДанные.Сотрудник КАК Сотрудник,
КадровыеДанные.ДатаУвольнения КАК ДатаУвольнения
ПОМЕСТИТЬ ВТ_Сотрудники
ИЗ
РегистрСведений.КадроваяИсторияСотрудников КАК КадровыеДанные
ГДЕ
КадровыеДанные.Период МЕЖДУ &НачалоПериода И &КонецПериода
;
Далее для работающих сотрудников берется срез последних на конец периода, а для уволенных — на момент, когда сотрудник ещё числился в организации (на дату увольнения за минусом одной секунды или на день увольнения).
Если задача заключается в выгрузке отчета по начислениям и выплатам за прошлые месяцы (когда выплаты идут в следующем месяце за предыдущий), оптимальным решением будет получать размер оклада не из кадровой истории, а из результатов расчета заработной платы (регистров расчета или накопления начислений).
В регистрах расчета начислений сохраняется показатель тарифной ставки, действовавший в момент проведения расчета. Это исключает необходимость определять кадровые перемещения и статус увольнения на текущую дату формирования отчета.