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