Как получить оклад уволенного или принятого сотрудника в запросах 1С

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При построении отчетов по начислениям и выплатам в конфигурациях 1С (в частности, в 1С:Бухгалтерии или 1С:ЗУП) разработчики часто сталкиваются с проблемой получения действующего оклада. Если сотрудник был уволен в течение выбранного месяца, стандартный срез последних на конец периода возвращает нулевой оклад, так как документ увольнения прекращает действие начисления. Если же брать срез последних на начало месяца, в выборку не попадут сотрудники, принятые на работу в середине месяца.

Рассмотрим, почему возникает эта проблема и как правильно составить запрос для корректного получения окладов по всем сотрудникам — работающим, принятым и уволенным.

Выясним причину некорректного поведения СрезПоследних

Проанализируем механику работы регистра сведений плановых начислений или параметров оплаты труда:

  1. При приеме на работу создается запись с размером оклада на дату приема. Срез последних на дату до приема не видит эту запись.
  2. При увольнении в регистр записывается событие прекращения начисления (или запись с нулевой ставкой). Срез последних на дату после увольнения возвращает значение 0.

Таким образом, фиксированная дата среза последних для всего отчета не подходит. Для решения этой задачи требуется выбрать период действия оклада индивидуально для каждого сотрудника.

Способ 1. Запрос к физической таблице регистра с поиском последней активной даты

Самый надежный и универсальный способ — отказаться от использования виртуальной таблицы СрезПоследних с зафиксированной датой и обратиться напрямую к физической таблице регистра сведений. Разберем этот подход по шагам.

Сначала сформируем временную таблицу с максимальными датами записей по каждому сотруднику, где размер оплаты больше нуля или где запись предшествует моменту увольнения:


ВЫБРАТЬ
	ПараметрыОплаты.Сотрудник КАК Сотрудник,
	МАКСИМУМ(ПараметрыОплаты.Период) КАК Период
ПОМЕСТИТЬ ВТ_МаксимальныеДаты
ИЗ
	РегистрСведений.ПараметрыОплатыПОМО ТАКЖЕ КАК ПараметрыОплаты
ГДЕ
	ПараметрыОплаты.Период <= &КонецПериода
	И ПараметрыОплаты.Размер > 0
СГРУППИРОВАТЬ ПО
	ПараметрыОплаты.Сотрудник
;

Затем соединим полученные максимальные даты с физической таблицей регистра, чтобы извлечь соответствующее значение оклада:


ВЫБРАТЬ
	ВТ.Сотрудник КАК Сотрудник,
	ПараметрыОплаты.Размер КАК Оклад
ИЗ
	ВТ_МаксимальныеДаты КАК ВТ
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыОплаты КАК ПараметрыОплаты
		ПО ВТ.Сотрудник = ПараметрыОплаты.Сотрудник
		И ВТ.Период = ПараметрыОплаты.Период

Способ 2. Формирование таблицы сотрудников и срез на дату увольнения

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

  1. Выбрать всех сотрудников, числившихся на начало периода.
  2. Добавить с помощью объединения (ОБЪЕДИНИТЬ ВСЕ) всех сотрудников, принятых в течение периода.
  3. Поместить список во временную таблицу.
  4. Для каждого уволенного сотрудника взять дату увольнения и получить срез последних на день, предшествующий увольнению.

Рассмотрим структуру такого запроса:


ВЫБРАТЬ
	КадровыеДанные.Сотрудник КАК Сотрудник,
	КадровыеДанные.ДатаУвольнения КАК ДатаУвольнения
ПОМЕСТИТЬ ВТ_Сотрудники
ИЗ
	РегистрСведений.КадроваяИсторияСотрудников КАК КадровыеДанные
ГДЕ
	КадровыеДанные.Период МЕЖДУ &НачалоПериода И &КонецПериода
;

Далее для работающих сотрудников берется срез последних на конец периода, а для уволенных — на момент, когда сотрудник ещё числился в организации (на дату увольнения за минусом одной секунды или на день увольнения).

Способ 3. Выборка оклада из первичных данных начислений

Если задача заключается в выгрузке отчета по начислениям и выплатам за прошлые месяцы (когда выплаты идут в следующем месяце за предыдущий), оптимальным решением будет получать размер оклада не из кадровой истории, а из результатов расчета заработной платы (регистров расчета или накопления начислений).

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

← На главную