При работе в программе «1С:Зарплата и управление персоналом» (редакция 3.1) кадровые специалисты часто сталкиваются с ситуацией, когда при изменении количества дней дополнительного отпуска сотрудника в середине рабочего месяца программа рассчитывает остатки не так, как ожидается на бумаге. Например, при изменении нормы отпуска с 8 до 24 дней в середине рабочего года сотрудник может мгновенно «получить» лишние дни отпуска в ближайшем отчете по остаткам.
В этой статье мы подробно разберем, по какому алгоритму программа рассчитывает права на отпуск «под капотом», почему возникает такая разница и как правильно отразить подобные изменения в программе без ущерба для учета.
Давайте проанализируем математику расчета на конкретном примере. Сотрудник принят на работу 23 октября 2019 года. Ему положено 28 дней основного отпуска и 8 дней дополнительного. С 3 марта 2020 года количество дней дополнительного отпуска увеличивают до 24 дней. Формируя отчет по остаткам на 6 марта 2020 года, пользователь видит, что программа уже начислила сотруднику новые дни в полном объеме за текущий месяц.
Выясним причину такого поведения системы. В 1С:ЗУП 3.1 начисление прав на отпуск привязано к индивидуальному рабочему году сотрудника, который делится на рабочие месяцы. Для нашего сотрудника рабочий месяц длится с 23-го числа текущего месяца по 22-е число следующего месяца.
Программа производит начисление очередного месячного «кусочка» отпуска не ежедневно, а при прохождении определенной контрольной точки. Эта контрольная точка наступает, когда сотрудник отрабатывает более половины рабочего месяца (то есть проходит порог в 15 календарных дней от начала рабочего месяца):
В результате на 6 марта остаток составляет: $2,67 \text{ (накоплено ранее)} + 2 \text{ (за текущий месяц)} = 4,67$ дня. Сотрудник получает выгоду, так как за период с 23 февраля по 2 марта ему начислили отпуск исходя из новой, более высокой нормы.
---
Если специфика вашего учета требует точного расчета и исключает любые «подарки» сотрудникам в виде авансового начисления дней, рассмотрим три практических способа решения этой задачи.
Самый простой способ избежать переплат без ручных расчетов — регистрировать кадровое изменение (документом Кадровый перевод или изменением прав на отпуск) строго на следующий день после прохождения контрольной точки текущего рабочего месяца.
В нашем примере контрольная точка за рабочий месяц с 23 февраля по 22 марта приходится на 6 марта. Поступим следующим образом:
При таком подходе сотрудник не теряет заработанные дни и не получает лишнего.
Если изменить дату кадрового события невозможно, мы можем зафиксировать остатки вручную на дату изменения прав. Документ Ввод остатков отпусков позволяет принудительно «перекрыть» автоматические алгоритмы программы.
Разберем этот вариант по шагам:
Ввод остатков отпусков с датой 3 марта 2020 года.В результате программа начнет отсчет по новому отпуску строго с 3 марта, а накопленный ранее баланс будет заморожен и сохранен.
Для крупных компаний (например, судоходных или промышленных предприятий со штатом более 500 человек), где сотрудники постоянно меняют районы работы, судна и условия вредности, ручной ввод документов по каждому изменению невозможен. В этом случае типовой механизм ЗУП 3.1 требует доработки.
Для автоматизации этого процесса разработчики используют написание внешних обработок или расширений. Обработка анализирует фактические перемещения сотрудников по табелям учета рабочего времени или специальным регистрам, математически рассчитывает точные доли заработанных дней за каждый день нахождения в конкретных условиях и программно формирует документы корректировки остатков.
Ниже приведен пример концептуального кода на языке 1С для автоматического создания и заполнения документа ввода остатков отпусков:
// Создание документа ввода остатков программным путем
НовыйДокумент = Документы.ВводОстатковОтпусков.СоздатьДокумент();
НовыйДокумент.Дата = РабочаяДата;
НовыйДокумент.Организация = ВыбраннаяОрганизация;
НовыйДокумент.Сотрудник = ТекущийСотрудник;
НовыйДокумент.ДатаОстатков = ДатаИзмененияПрав;
// Заполнение табличной части остатков отпусков
НоваяСтрока = НовыйДокумент.ЕжегодныеОтпуска.Добавить();
НоваяСтрока.ВидОтпуска = Справочники.ВидыОтпусков.НайтиПоНаименованию("Дополнительный отпуск");
НоваяСтрока.КоличествоДней = РассчитанныйВручнуюОстаток;
НоваяСтрока.РабочийГодНачало = ДатаНачалаРабочегоГода;
НоваяСтрока.РабочийГодОкончание = ДатаОкончанияРабочегоГода;
// Запись и проведение документа
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Ошибка проведения документа по сотруднику " + ТекущийСотрудник);
КонецПопытки;
Использование программного формирования документов позволяет оперативно актуализировать данные по сотням сотрудников без риска допустить механическую ошибку при ручном расчете.