В типовой конфигурации «1С:Зарплата и управление персоналом» (ЗУП 8) документ Начисление зарплаты и взносов выполняет автоматический расчет отработанного времени и сумм начислений на основе введенных графиков, табелей и кадровых данных. Однако в процессе автоматизации специфических задач разработчики часто сталкиваются с необходимость программно скорректировать отработанные часы или заставить систему пересчитать результат расчета по измененным данным.
При прямой модификации значений отработанных часов в табличной части документа любое интерактивное действие пользователя (нажатие кнопок «Заполнить», «Пересчитать», смена подразделения или реквизитов) приводит к сбросу введенных вручную данных. Рассмотрим подробно архитектуру этого механизма и разберем несколько проверенных способов решения задачи.
При вычислении результатов начислений 1С:ЗУП опирается не только на визуальные колонки формы, но и на служебную структуру данных. В обработках МенеджерРасчетаЗарплаты и МенеджерРасчетаОтработанногоВремени формируются временные коллекции, где хранятся показатели, параметры отработанного времени и норма часов.
Если изменить отработанные часы непосредственно в табличной части начислений без синхронизации с первичными регистрами учета времени или коллекцией показателей, возникнут следующие проблемы:
Наиболее правильный и безопасный с точки зрения архитектуры подход — изменить формулу начисления, вынеся отработанное время или корректирующий коэффициент в отдельный показатель расчета зарплаты.
Для реализации этого варианта выполним следующие шаги:
КорректировкаЧасов) со способом ввода «Вводится непосредственно в документе начисления» или «Вводится документом Ввод показателей расчета зарплаты».Ввод показателей расчета зарплаты, либо табличную часть Показатели в документе Начисление зарплаты и взносов.После изменения значений показателей запускаем перерасчет документа. Система корректно обработает новые данные без риска их утраты при повторных открытиях или пересчетах.
Если задача заключается именно в изменении отработанного времени сотрудника, рекомендуется не вмешиваться в алгоритмы расчетного менеджера, а сформировать программно первичные учетные документы:
Индивидуальный график или Табель учета рабочего времени на нужный период.Начисление зарплаты и взносов программа автоматически считает данные из регистра Данные об отработанном времени и рассчитает правильный результат без дополнительных доработок кода документа.Если требуется полностью программно заполнить документ начисления с последующим вычислением сумм из кода обработки или внешнего модуля, проанализируем последовательность вызова служебных процедур формы и модуля документа.
Разберем примерный алгоритм взаимодействия со служебными механизмами:
Показатели нужными значениями для каждого сотрудника и вида расчета.Рассмотрим пример кода, демонстрирующий логику программного вызова процедура заполнения и расчета:
// Пример заполнения показателей и вызова пересчета в контексте формы документа
&НаКлиенте
Процедура ЗаполнитьИРассчитатьДокумент()
// 1. Программно заполняем показатели в табличной части "Показатели"
Для Каждого СтрПоказатель Из Объект.Показатели Цикл
Если СтрПоказатель.ИмяПоказателя = "ОтработаноЧасов" Тогда
СтрПоказатель.Значение = ПолучитьСкорректированныеЧасы(СтрПоказатель.Сотрудник);
КонецЕсли;
КонецЦикла;
// 2. Вызываем служебный пересчет документа или конкретных сотрудников
// В зависимости от версии конфигурации вызываются методы формы или модулей
РассчитатьДокументНаСервере();
КонецПроцедуры
На стороне сервера для выполнения полного расчета используется обработка МенеджерРасчетаЗарплаты. Проанализируем ее работу: она принимает объект документа или структуру параметров, рассчитывает математику формул с учетом времени и заполняет закладки Начисления, НДФЛ, Взносы и Удержания.
Для сохранения конфигурации на типовой поддержке логику подмены отработанных часов можно вынести в расширение. В общем модуле РасчетЗарплатыРасширенный (или специализированных модулях расчета времени) перехватываются процедуры формирования данных для расчета.
Проанализируем порядок действий при таком подходе:
&Вместо или &После к процедуре сбора таблиц показателей и времени для расчетного менеджера.В результате процедура расчета отработает штатно, сформирует верные суммы начислений, НДФЛ и взносов, а исходный код конфигурации останется без изменений.