При формировании справки для пособия по безработице в программе "1С:Зарплата и Управление Персоналом 3.1" у пользователей и бухгалтеров часто возникают два основных вопроса: почему не учитывается индексация заработка (как это делается для отпускных) и почему программа выбирает "не те" месяцы для расчетного периода. Рассмотрим детально законодательную базу и программные алгоритмы решения этой задачи.
Часто бухгалтеры требуют, чтобы в справке для службы занятости (ЦЗН) учитывался коэффициент индексации, ссылаясь на аналогию с расчетом среднего заработка для отпускных или выходных пособий. Разберем, почему это требование ошибочно.
Расчет среднего заработка регулируется разными нормативными актами:
В текущем Приказе № 57н отсутствуют требования об учете коэффициентов индексации при повышении окладов в организации. Пособие по безработице выплачивается из бюджета, и государство не берет на себя обязательства увеличивать выплаты на основании внутренней индексации конкретного работодателя. Поэтому типовое поведение 1С:ЗУП, игнорирующее индексацию в данной справке, является корректным с точки зрения законодательства.
Более сложная проблема связана с алгоритмом выбора трех месяцев для расчета. Согласно п. 1 и п. 2 Приказа № 57н, средний заработок исчисляется за три календарных месяца, предшествующих календарному месяцу перед месяцем увольнения.
Пример: Сотрудник увольняется в июне.
Месяц увольнения — Июнь.
Месяц перед месяцем увольнения — Май.
Расчетный период — Февраль, Март, Апрель.
Однако пользователи замечают, что ЗУП иногда берет другие периоды, выбирая месяцы с максимальным доходом, что вызывает вопросы у проверяющих.
Проанализируем программный код. Расчет выполняется в общем модуле КадровыйУчетРасширенный. В типовом механизме реализована логика перебора трехмесячных интервалов внутри 12 месяцев. Программа пытается найти такой трехмесячный отрезок, где сумма заработка будет максимальной.
В функции СреднийЗаработокСотрудников происходит цикл:
// Упрощенная схема типового алгоритма
Для Каждого Отрезок В Интервал12Месяцев Цикл
Если СуммаЗаработкаОтрезка >= ТекущийМаксимум Тогда
ТекущийМаксимум = СуммаЗаработкаОтрезка;
ЗафиксироватьПериод();
КонецЕсли;
КонецЦикла;
Такой подход (поиск максимума) не всегда соответствует буквальному прочтению Приказа 57н, который предписывает брать конкретные месяцы, если они не являются "пустыми" (состоящими из исключаемых периодов). Если у вас возникла необходимость строго зафиксировать алгоритм выбора периода (сначала строго 3 месяца по приказу, если пусто — сдвиг назад), нам потребуется доработка через расширение.
Для реализации строгого алгоритма нам необходимо переопределить логику функции СреднийЗаработокСотрудников в общем модуле КадровыйУчетРасширенный. Рассмотрим вариант кода, который реализует последовательную проверку периодов без поиска максимума.
Логика следующая:
Пример реализации функции для расширения:
&Вместо("СреднийЗаработокСотрудников")
Функция Расш_СреднийЗаработокСотрудников(ДанныеОЗаработкеСотрудников)
ДанныеСреднегоЗаработка = Новый Соответствие;
Для Каждого ДанныеСотрудника Из ДанныеОЗаработкеСотрудников Цикл
ДанныеПериодаСотрудника = Новый Структура("Сумма,Время,НачалоПериода,ОкончаниеПериода",
0, 0, '00010101', '00010101');
КоличествоМесяцев = ДанныеСотрудника.Значение.Количество();
// Индексы для основного периода (Февраль-Апрель при увольнении в Июне)
// Массив данных обычно содержит 12 месяцев, последний - это месяц перед увольнением
Инд9 = КоличествоМесяцев - 4;
Инд10 = КоличествоМесяцев - 3;
Инд11 = КоличествоМесяцев - 2;
// Попытка 1: Основной период
Если Инд9 >= 0 Тогда
СуммаПериода = ДанныеСотрудника.Значение[Инд9].Сумма +
ДанныеСотрудника.Значение[Инд10].Сумма +
ДанныеСотрудника.Значение[Инд11].Сумма;
ВремяПериода = ДанныеСотрудника.Значение[Инд9].Время +
ДанныеСотрудника.Значение[Инд10].Время +
ДанныеСотрудника.Значение[Инд11].Время;
Если СуммаПериода > 0 Или ВремяПериода > 0 Тогда
ДанныеПериодаСотрудника.Сумма = СуммаПериода;
ДанныеПериодаСотрудника.Время = ВремяПериода;
ДанныеПериодаСотрудника.НачалоПериода = ДанныеСотрудника.Значение[Инд9].НачалоПериода;
ДанныеПериодаСотрудника.ОкончаниеПериода = ДанныеСотрудника.Значение[Инд11].ОкончаниеПериода;
КонецЕсли;
КонецЕсли;
// Попытка 2: Сдвиг назад на 3 месяца (если в первом периоде нули)
Если (ДанныеПериодаСотрудника.Сумма = 0) И (ДанныеПериодаСотрудника.Время = 0) Тогда
Инд6 = КоличествоМесяцев - 7;
Инд7 = КоличествоМесяцев - 6;
Инд8 = КоличествоМесяцев - 5;
Если Инд6 >= 0 Тогда
СуммаПериода = ДанныеСотрудника.Значение[Инд6].Сумма +
ДанныеСотрудника.Значение[Инд7].Сумма +
ДанныеСотрудника.Значение[Инд8].Сумма;
ВремяПериода = ДанныеСотрудника.Значение[Инд6].Время +
ДанныеСотрудника.Значение[Инд7].Время +
ДанныеСотрудника.Значение[Инд8].Время;
Если СуммаПериода > 0 Или ВремяПериода > 0 Тогда
ДанныеПериодаСотрудника.Сумма = СуммаПериода;
ДанныеПериодаСотрудника.Время = ВремяПериода;
ДанныеПериодаСотрудника.НачалоПериода = ДанныеСотрудника.Значение[Инд6].НачалоПериода;
ДанныеПериодаСотрудника.ОкончаниеПериода = ДанныеСотрудника.Значение[Инд8].ОкончаниеПериода;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Сохраняем результат
ДанныеСреднегоЗаработка.Вставить(ДанныеСотрудника.Ключ, ДанныеПериодаСотрудника);
КонецЦикла;
Возврат ДанныеСреднегоЗаработка;
КонецФункции
Для корректной работы вышеуказанного алгоритма важно, чтобы входной массив данных ДанныеОЗаработкеСотрудников содержал полный набор месяцев, даже если сотрудник был принят на работу недавно. В типовом коде может происходить обрезка периода по дате приема.
Рекомендуется обратить внимание на функцию подготовки данных СведенияОСреднемЗаработкеДляСправкиПоБезработицеС2023. В ней есть определение даты начала периода:
// Типовой код может выглядеть так:
ДатаНачалаПериода = Макс(ДанныеСотрудника.ДатаПриема, ДобавитьМесяц(ДатаОкончанияПериода, - 12));
Если сотрудник работает меньше года, массив будет короче 12 элементов, и индексы в нашем новом алгоритме могут "поплыть". Чтобы этого избежать, изменим определение начала периода, чтобы всегда захватывать год для анализа (даже если там будут нули до приема):
// Изменение в функции СведенияОСреднемЗаработкеДляСправкиПоБезработицеС2023
ДатаНачалаПериода = ДобавитьМесяц(ДатаОкончанияПериода, - 12);
Это обеспечит фиксированную длину массива данных, что упростит работу алгоритма по выбору конкретных месяцев по их индексам.
Стоит также учитывать, что с переходом на цифровое взаимодействие, Центры занятости получают данные о доходах граждан напрямую из ФНС (на основании отчета "Персонифицированные сведения о физлицах") и СФР. В большинстве случаев справка от работодателя требуется только в исключительных ситуациях (например, длительный отпуск без сохранения зарплаты, декрет).
Алгоритм расчета ЦЗН может отличаться от алгоритма ЗУП тем, что ЦЗН оперирует суммами выплат за календарные месяцы и делит их на количество месяцев, не имея точных данных об отработанных днях внутри месяца (кроме периодов болезни). Если вам часто приходится сталкиваться с расхождениями, имеет смысл создать внешний отчет-калькулятор, который будет моделировать расчет ЦЗН:
Такой подход позволит заранее спрогнозировать сумму пособия, которую рассчитает государство, и объяснить сотруднику, почему справка может быть не нужна.