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

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

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

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

--- ### Выясняем причину: почему период разбивается, но коэффициент не меняется?

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

  1. Первый период: с 1 по 12 апреля.
  2. Второй период: с 13 по 30 апреля.

Однако значение коэффициента во втором периоде не сбрасывается автоматически в «1» или «0». Это происходит из-за следующих архитектурных особенностей платформы:

1. Отсутствие значения по умолчанию для произвольных показателей. В системе 1С:ЗУП нет понятия автоматического «дефолтного» значения для добавленных пользователем показателей вне периода их действия. Если на период с 13 апреля в регистре сведений отсутствует новая запись для этого сотрудника, расчетный механизм не знает, какое значение использовать. По умолчанию система пытается применить последнее известное значение показателя (в данном случае 0.8).

2. Особенности работы интервальных регистров. В ЗУП 3.1 расчеты ведутся не напрямую по физическим регистрам сведений, а по их интервальным аналогам. Для показателей сотрудников это регистр ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный. Если данные вносятся в базу программно, «минуя» стандартные документы (например, прямой записью в набор записей основного регистра), интервальный регистр может заполниться некорректно или не обновиться вовсе. Это приводит к рассинхронизации данных.

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

--- ### Способ 1. Использование двух разных плановых начислений (Рекомендуемый)

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

Рассмотрим этот подход подробнее:

  1. Создадим начисление Оклад на испытательном сроке. В его формуле сразу укажем пониженное значение оклада или зашьем понижающий коэффициент. Назначим его сотруднику с даты приема по дату окончания испытательного срока (например, по 12.04.2020).
  2. Создадим стандартное начисление Оклад. Его мы назначим сотруднику со следующего дня после окончания испытательного срока (с 13.04.2020) как постоянное плановое начисление.

При таком подходе система автоматически и абсолютно корректно прекратит расчет одного начисления и начнет расчет другого посреди месяца. Периоды отработанного времени и суммы ФОТ разделятся автоматически без привлечения программистов и без рисков сбоя в интервальных регистрах.

--- ### Способ 2. Явный ввод изменения значения показателя документом

Если специфика вашего учета требует наличия именно одного начисления и одного сквозного показателя, то для корректного расчета с 13.04.2020 система должна получить явную инструкцию о том, что значение показателя изменилось (например, стало равным 1).

Разберем по шагам, как это реализовать:

  1. Нельзя просто ограничивать действие показателя «датой до». Вместо этого необходимо зарегистрировать изменение значения.
  2. Создайте документ Изменение плановых начислений или Изменение оплаты труда с датой изменения 13.04.2020.
  3. В табличной части документа для этого сотрудника укажите новое значение показателя КоэффициентИспытательногоСрока равным 1.00000.
  4. Проведите документ. Это действие заставит систему корректно пересчитать интервалы в регистре ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный. Теперь на первый период запишется значение 0.8, а на второй — 1.0.

--- ### Способ 3. Настройка параметров показателя в конфигураторе и пользовательском режиме

Если вам требуется, чтобы показатель после окончания определенной даты полностью обнулялся (становился равным 0), проанализируем настройки самого показателя:

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

--- ### Важное примечание для разработчиков (при программной записи данных)

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

Для корректного внесения данных программным путем используйте создание и проведение типовых документов-регистраторов. Ниже приведен пример схемы создания документа изменения показателей:


// Создание документа для регистрации изменения показателей плановых начислений
НовыйДокумент = Документы.ИзменениеОплатыТруда.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = СсылкаНаОрганизацию;
НовыйДокумент.Сотрудник = СсылкаНаСотрудника;
НовыйДокумент.ДатаИзменения = ДатаНачалаДействияНовогоКоэффициента; // Например, 13.04.2020

// Заполнение показателей
НоваяСтрока = НовыйДокумент.Показатели.Добавить();
НоваяСтрока.Показатель = СсылкаНаПоказательКоэффициент;
НоваяСтрока.Значение = 1.0; // Устанавливаем единицу после окончания испытательного срока

НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Использование транзакционного проведения документов гарантирует, что платформа 1С самостоятельно пересчитает все сопутствующие интервальные таблицы, и расчет заработной платы за месяц пройдет без ошибок.

← На главную