ЗУП 3: Как распределить суммарный показатель по периодам внутри месяца?

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

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

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

Способ 1. Расчет через механизм «Расчетной базы»

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

  1. Создадим новое начисление (назовем его Вспомогательное время). Настроим его так, чтобы оно начислялось всем сотрудникам и результатом был 1 рубль за каждый отработанный час. Формула: ОтработаноЧасов * 1.
  2. В основном начислении (например, Сдельный заработок итого) на вкладке Расчет базы выберем наше вспомогательное начисление.
  3. В формуле основного начисления будем использовать показатель РасчетнаяБаза. Чтобы распределить фиксированную сумму (введенную как показатель ОбщаяСуммаЗаМесяц), используем конструкцию: ОбщаяСуммаЗаМесяц * (РасчетнаяБаза / СложившаясяБазаЗаВесьМесяц) Но есть хитрость: если мы укажем ОбщаяСуммаЗаМесяц как показатель, который вводится один раз на месяц, и настроим зависимость от РасчетнаяБаза, система при расчете каждой строки сама определит долю. Если же мы просто хотим «размазать» сумму, можно настроить основное начисление так, чтобы оно брало базу за текущий месяц.

Способ 2. Использование показателя «Всего часов за месяц»

Если мы не хотим создавать лишние начисления, рассмотрим вариант с вводом дополнительного показателя. Выясним, как заставить формулу «видеть» общую норму или факт месяца.

Создадим пользовательский показатель ВсегоЧасовЗаМесяц. Настроим его: «Для сотрудника», «Вводится только в месяце расчета». Теперь алгоритм действий будет следующим:

  1. Перед расчетом зарплаты необходимо заполнить этот показатель для сотрудников. Это можно сделать через документ Данные для расчета зарплаты.
  2. Для автоматизации заполнения этого показателя удобно использовать внешнюю обработку, которая соберет данные из табеля или графиков работы и запишет их в документ.
  3. Формула начисления примет вид: СуммарныйПоказатель * (ВремяВЧасах / ВсегоЧасовЗаМесяц) Здесь ВремяВЧасах — это предопределенный показатель 1С, который в каждом фрагменте периода будет принимать значение фактически отработанных часов именно в этом фрагменте. А ВсегоЧасовЗаМесяц будет оставаться неизменным (константой) для всех строк расчета внутри месяца.

Способ 3. Механизм «Сдельных работ» и бригадных нарядов

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

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

Важный нюанс: Чтобы распределение сработало корректно при кадровом переводе, даты выполнения работ в документе Сдельные работы должны перекрывать все периоды, на которые разбился месяц.

Способ 4. Программная автоматизация через расширение или подписки

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

Посмотрим на пример логики подписки на событие или использования расширения:

  1. Создается подписка на проведение документа Табель или Данные для расчета зарплаты.
  2. В момент проведения код анализирует фактическое время сотрудника за весь месяц целиком (игнорируя границы кадровых переводов).
  3. Программа программно заполняет вспомогательный документ Данные для расчета зарплаты, куда записывает долю времени для каждого периода или сразу готовые суммы к распределению.

Также в современных версиях Платформы 8.3 можно использовать расширения для добавления собственных операндов в редактор формул. Мы можем описать функцию, которая будет возвращать ИтогПоРабочемуВремениЗаМесяц(), и использовать её напрямую в формуле начисления.

Способ 5. Использование показателя «Доля времени»

Проанализируем еще один встроенный механизм. В настройках начисления, которое выполняется ежемесячно и вводится фиксированной суммой, можно активировать расчет, зависящий от времени. Если в формуле присутствует показатель ДоляВремени (или аналогичные механизмы учета неполного времени), ЗУП автоматически при создании нескольких строк (из-за перевода) распределит сумму.

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

Резюме и рекомендации

Выбор метода зависит от того, насколько часто возникают такие ситуации:

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

← На главную