Как создать свой показатель начисления с произвольным алгоритмом в 1С:ЗУП 3.1?

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

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

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

Способ 1. Использование стандартного конструктора формул

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

  1. Перейдем в раздел Настройка — Показатели расчета зарплаты и создадим новый показатель.
  2. Укажем его назначение (например, «Для сотрудника») и тип (числовой).
  3. В поле Использование показателя выберем вариант «Во всех месяцах после ввода значения» (если мы планируем рассчитать средний доход один раз и использовать его весь год) или «Только в месяце, в котором вводится значение».
  4. Затем создадим новое начисление в разделе Настройка — Начисления, где в формуле укажем: ВашПоказательСреднегоДохода * ЗаданныйКоэффициент.

Важное ограничение: Стандартный конструктор не умеет самостоятельно «заглядывать» в регистры накопления за прошлый год. Если данные для вашего показателя уже посчитаны и их нужно просто ввести, этот метод идеален. Но если нужен автоматический расчет «на лету», переходим к следующему варианту.

Способ 2. Автоматизация через «Данные для расчета зарплаты»

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

Шаг 1. Настройка шаблона. Мы создаем Шаблон ввода исходных данных (раздел Настройка), в который включаем наш пользовательский показатель. Это позволит программе создать специальный документ, через который значения будут попадать в расчетный листок.

Шаг 2. Создание обработки заполнения. Чтобы не вводить средний доход за прошлый год вручную для каждого сотрудника, мы можем написать внешнюю обработку. Эта обработка будет:

Рассмотрим пример логики запроса для такой обработки:


ВЫБРАТЬ
    СУММА(Начисления.Сумма) / 12 КАК СреднийДоход,
    Начисления.Сотрудник КАК Сотрудник
ИЗ
    РегистрНакопления.НачисленияУдержанияПоСотрудникам КАК Начисления
ГДЕ
    Начисления.Период МЕЖДУ &НачалоПрошлогоГода И &КонецПрошлогоГода
    И Начисления.Сотрудник = &Сотрудник
ГРУППИРОВАТЬ ПО
    Начисления.Сотрудник

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

Способ 3. Программная доработка через расширение конфигурации

Если требуется, чтобы расчет происходил полностью автоматически в момент нажатия кнопки «Заполнить» в документе Начисление зарплаты и взносов, необходимо использовать расширение. Проанализируем, где именно в коде происходит магия расчета показателей.

Основная логика сосредоточена в общем модуле РасчетЗарплатыРасширенныйПереопределяемый или в обработке МенеджерРасчетаЗарплаты. Рассмотрим алгоритм реализации через расширение:

  1. Создаем показатель в интерфейсе, как описано в первом способе, но помечаем его как «заполняемый программно».
  2. В расширении перехватываем процедуру, отвечающую за сбор значений показателей. В современных версиях ЗУП 3.1 рекомендуется смотреть в сторону программного интерфейса для добавления собственных алгоритмов расчета.
  3. Реализуем расчет. Проанализируем структуру кода, которую необходимо добавить в расширение модуля:

&После("ПередРасчетомПоказателей")
Процедура Расш_ПередРасчетомПоказателей(МенеджерРасчета, СписокПоказателей)
    // Здесь мы определяем, присутствует ли наш специфический показатель в расчете
    Если СписокПоказателей.Найти("ВашПоказательСреднегоДохода") <> Неопределено Тогда
        // Вызываем функцию, которая соберет данные из регистров за прошлый год
        ДанныеПрошлогоГода = ПолучитьСреднийДоходЗаПрошлыйГод(МенеджерРасчета.ОбъектРасчета);
        // Записываем результат в структуру данных менеджера расчета
        МенеджерРасчета.ЗначенияПоказателей.Вставить("ВашПоказательСреднегоДохода", ДанныеПрошлогоГода);
    КонецЕсли;
КонецПроцедуры

При использовании этого метода важно учитывать производительность. Если у вас тысячи сотрудников, запрос к базе данных за целый год внутри цикла расчета может существенно замедлить работу документа. В таких случаях данные лучше кэшировать или собирать одним запросом для всего списка сотрудников документа.

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

Выясним причину, почему выбор регистра критичен для точности алгоритма. В зависимости от методологии учета в вашей компании, «доход» может трактоваться по-разному:

Подведем итог: Создать свой показатель и назначить ему произвольный алгоритм в ЗУП 3.1 вполне реально. Для простых случаев используйте стандартные формулы. Для автоматизации сложных расчетов за прошлые периоды без изменения конфигурации выбирайте «Данные для расчета зарплаты». А для полной автоматизации процесса — используйте расширения конфигурации и программный интерфейс МенеджерРасчетаЗарплаты.

← На главную