Как программно получить процент от стажа для надбавки за выслугу лет в 1С:ЗУП 8.2

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом
← На главную

В конфигурации «Зарплата и управление персоналом» (редакция 2.5) расчет надбавки за выслугу лет является одной из наиболее частых задач. Программное получение процента, который зависит от накопленного стажа сотрудника, требует понимания того, как хранятся данные о стаже и как устроены шкалы начислений. В этой статье мы подробно разберем, как извлечь эти данные с помощью встроенного языка 1С, рассмотрим структуру метаданных и изучим готовые примеры кода.

Архитектура хранения данных о стаже и шкалах

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

  1. Сведения о стаже физического лица: Эти данные хранятся в регистре сведений СтажиФизическихЛиц. Здесь для каждого сотрудника фиксируется вид стажа (например, «Стаж на надбавку за выслугу лет»), дата отсчета и количество уже имеющихся лет/месяцев стажа на эту дату.
  2. Вид расчета: В справочнике ОсновныеНачисленияОрганизаций хранится описание самой надбавки. У вида расчета есть реквизит, указывающий на используемую шкалу (часто это ШкалаСтажа или КоэффициентСтажа).
  3. Шкала процентов: Сами интервалы (например, от 1 до 3 лет — 10%, от 3 до 5 лет — 15%) находятся в подчиненном справочнике или регистре. Чаще всего это справочник РазмерыНачисленийВЗависимостиОтСтажа.

Рассмотрим подробнее механизм работы со шкалой. Если нам нужны просто проценты из настроек, мы должны выполнить запрос к справочнику РазмерыНачисленийВЗависимостиОтСтажа, отфильтровав записи по владельцу (конкретной шкале). Если же наша цель — получить процент для конкретного сотрудника на определенную дату, нам придется пройти весь путь от физического лица до итогового числового значения.

Реализация через типовые функции ЗУП

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


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

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

Алгоритм самостоятельного поиска в шкале (без типовых функций)

Если по каким-то причинам вы не можете использовать типовые функции или работаете в сильно измененной конфигурации, рассмотрим логику прямого запроса к шкале. Для этого нам нужно вычислить стаж в месяцах и найти запись в справочнике РазмерыНачисленийВЗависимостиОтСтажа, где наше значение попадает в интервал С и По.

Выясним причину, почему важно учитывать границы. В 1С шкалы часто хранятся так, что верхняя граница может быть не заполнена (что означает «бесконечность» или «свыше указанного количества лет»). Проанализируем пример запроса:


ВЫБРАТЬ
    Шкала.Значение КАК Процент
ИЗ
    Справочник.РазмерыНачисленийВЗависимостиОтСтажа КАК Шкала
ГДЕ
    Шкала.Владелец = &ШкалаСтажа
    И Шкала.ПределМинимум <= &СтажВМесяцах
    И (Шкала.ПределМаксимум > &СтажВМесяцах ИЛИ Шкала.ПределМаксимум = 0)

В этом запросе &ШкалаСтажа — это ссылка на элемент, указанный в виде расчета, а &СтажВМесяцах — результат вашего предварительного расчета (Лет * 12 + Месяцев).

Особенности расчета стажа физического лица

Важно помнить, что стаж сотрудника — величина динамическая. При получении процента всегда нужно четко определять дату, на которую этот процент актуален. В кадровом учете 1С предусмотрен регистр СтажиФизическихЛиц, записи в котором могут содержать:

Для правильного расчета мы должны «отмотать» время назад от ДатыОтсчета на количество РазмерМесяцев, чтобы получить виртуальную «точку старта» (нулевой стаж). И уже от этой точки вычислять разницу с текущим днем. В типовых решениях для этого часто используется метод ПроцедурыУправленияПерсоналом.РассчитатьСтаж.

Практические советы по отладке

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

  1. Глобальный поиск: Используйте поиск по конфигурации (Ctrl+Shift+F) по строке "ОтСтажаПроцентом" или "ПолучитьПоказательПоСтажу". Это позволит найти места в модулях документов «Начисление зарплаты», где система сама обращается к этим данным.
  2. Проверка вида расчета: Убедитесь, что у вашего вида расчета в поле «Способ расчета» указано, что он зависит от стажа. Если это не так, поле со шкалой может быть просто не заполнено в базе.
  3. ИТС: Проверьте методические статьи на ресурсе ИТС. Там часто приводятся примеры использования программного интерфейса (API) для кадровых и расчетных задач.

Рассматривая задачу комплексно, мы видим, что основная сложность заключается не в получении самого числа, а в правильном сопоставлении дат и интервалов. Использование типовых процедур вроде ОбщегоНазначенияЗК.РазобратьРазностьДат позволяет избежать ошибок, связанных с разным количеством дней в месяцах и високосными годами, что критически важно для корректного начисления заработной платы.

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

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

← На главную