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