В конфигурации «Зарплата и управление персоналом» (редакция 2.5) расчет надбавки за выслугу лет является одной из наиболее частых задач. Программное получение процента, который зависит от накопленного стажа сотрудника, требует понимания того, как хранятся данные о стаже и как устроены шкалы начислений. В этой статье мы подробно разберем, как извлечь эти данные с помощью встроенного языка 1С, рассмотрим структуру метаданных и изучим готовые примеры кода.
Прежде чем приступать к написанию кода, проанализируем, где именно в системе хранятся необходимые нам сведения. Для корректного расчета нам понадобятся три составляющие:
СтажиФизическихЛиц. Здесь для каждого сотрудника фиксируется вид стажа (например, «Стаж на надбавку за выслугу лет»), дата отсчета и количество уже имеющихся лет/месяцев стажа на эту дату.ОсновныеНачисленияОрганизаций хранится описание самой надбавки. У вида расчета есть реквизит, указывающий на используемую шкалу (часто это ШкалаСтажа или КоэффициентСтажа).РазмерыНачисленийВЗависимостиОтСтажа.Рассмотрим подробнее механизм работы со шкалой. Если нам нужны просто проценты из настроек, мы должны выполнить запрос к справочнику РазмерыНачисленийВЗависимостиОтСтажа, отфильтровав записи по владельцу (конкретной шкале). Если же наша цель — получить процент для конкретного сотрудника на определенную дату, нам придется пройти весь путь от физического лица до итогового числового значения.
Наиболее эффективный и надежный способ — использование встроенных функций общих модулей. Разберем пример кода, который позволяет получить процент по стажу, используя стандартную библиотеку функций ЗУП 2.5. Этот подход минимизирует количество ошибок при расчете разности дат и высоко оценен сообществом программистов.
// Предположим, у нас есть объект ВидРасчета и Сотрудник
Если ЗначениеЗаполнено(ВидРасчета.КоэффициентСтажа) Тогда
// Ищем строку стажа конкретного сотрудника по нужному виду стажа
СтрокаСтажа = Сотрудник.Физлицо.Стажи.Найти(ВидРасчета.ВидСтажа, "ВидСтажа");
Лет = 0; Месяцев = 0; Дней = 0;
Если СтрокаСтажа <> Неопределено Тогда
// Вычисляем реальную дату, от которой идет отсчет стажа,
// учитывая введенные вручную месяцы при приеме на работу
ДатаОтсчета = ДобавитьМесяц(СтрокаСтажа.ДатаОтсчета, -СтрокаСтажа.РазмерМесяцев);
Если ЗначениеЗаполнено(ДатаОтсчета) Тогда
// Используем типовую функцию для разбора разности между текущей датой и датой отсчета
// Параметр Строка.ДатаПриема — это дата, на которую мы хотим получить стаж
ОбщегоНазначенияЗК.РазобратьРазностьДат(НачалоДня(ТекущаяДата()), НачалоДня(ДатаОтсчета), Лет, Месяцев, Дней);
// Получаем процент, передав общее количество месяцев и ссылку на шкалу
Процент = ДенежноеДовольствие.ПолучитьПроцентПоСтажу(Лет * 12 + Месяцев, ВидРасчета.КоэффициентСтажа);
Сообщить("Текущий процент надбавки: " + Процент);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Проанализируем ситуацию: в данном фрагменте ключевым моментом является использование функции ДенежноеДовольствие.ПолучитьПроцентПоСтажу. Она автоматически обходит все уровни шкалы и возвращает значение, соответствующее переданному количеству месяцев.
Если по каким-то причинам вы не можете использовать типовые функции или работаете в сильно измененной конфигурации, рассмотрим логику прямого запроса к шкале. Для этого нам нужно вычислить стаж в месяцах и найти запись в справочнике РазмерыНачисленийВЗависимостиОтСтажа, где наше значение попадает в интервал С и По.
Выясним причину, почему важно учитывать границы. В 1С шкалы часто хранятся так, что верхняя граница может быть не заполнена (что означает «бесконечность» или «свыше указанного количества лет»). Проанализируем пример запроса:
ВЫБРАТЬ
Шкала.Значение КАК Процент
ИЗ
Справочник.РазмерыНачисленийВЗависимостиОтСтажа КАК Шкала
ГДЕ
Шкала.Владелец = &ШкалаСтажа
И Шкала.ПределМинимум <= &СтажВМесяцах
И (Шкала.ПределМаксимум > &СтажВМесяцах ИЛИ Шкала.ПределМаксимум = 0)
В этом запросе &ШкалаСтажа — это ссылка на элемент, указанный в виде расчета, а &СтажВМесяцах — результат вашего предварительного расчета (Лет * 12 + Месяцев).
Важно помнить, что стаж сотрудника — величина динамическая. При получении процента всегда нужно четко определять дату, на которую этот процент актуален. В кадровом учете 1С предусмотрен регистр СтажиФизическихЛиц, записи в котором могут содержать:
ВидыСтажа.Для правильного расчета мы должны «отмотать» время назад от ДатыОтсчета на количество РазмерМесяцев, чтобы получить виртуальную «точку старта» (нулевой стаж). И уже от этой точки вычислять разницу с текущим днем. В типовых решениях для этого часто используется метод ПроцедурыУправленияПерсоналом.РассчитатьСтаж.
Если вы столкнулись с тем, что код выдает неверный результат или вы не можете найти нужную шкалу, воспользуйтесь следующими рекомендациями:
"ОтСтажаПроцентом" или "ПолучитьПоказательПоСтажу". Это позволит найти места в модулях документов «Начисление зарплаты», где система сама обращается к этим данным.Рассматривая задачу комплексно, мы видим, что основная сложность заключается не в получении самого числа, а в правильном сопоставлении дат и интервалов. Использование типовых процедур вроде ОбщегоНазначенияЗК.РазобратьРазностьДат позволяет избежать ошибок, связанных с разным количеством дней в месяцах и високосными годами, что критически важно для корректного начисления заработной платы.
Разберем еще один нюанс: прерывистый стаж. В обычных версиях ЗУП 2.5 стаж считается непрерывным от даты отсчета. Если в вашей организации принята логика прерывистого стажа (например, только периоды работы в определенных ведомствах), вам придется реализовывать более сложный запрос к регистру СостояниеРаботниковОрганизаций или использовать специализированные документы для корректировки стажа.
Таким образом, мы изучили основные подходы к программному получению процента надбавки за выслугу лет. Выбор конкретного метода — через типовые функции или прямой запрос — зависит от ваших задач и степени кастомизации базы данных.