Почему ФактическийПериодДействия не видит больничный задним числом и как это исправить?

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

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

Причина проблемы и особенности работы виртуальной таблицы

Проанализируем ситуацию: сотрудник болел в апреле, но предоставил больничный лист только в мае. Документ «Больничный лист» проводится в мае (период регистрации — май), но его период действия относится к апрелю. При расчете среднего заработка, например, в августе, система обращается к виртуальной таблице ФактическийПериодДействия за апрель. Выясним, почему вытеснение не отрабатывает автоматически:

  1. Зависимость от периода регистрации: По умолчанию виртуальная таблица рассчитывает пересечения записей внутри одного и того же или указанного периода регистрации. Если запись больничного зарегистрирована в мае, а мы запрашиваем данные за апрель, платформа может не «увидеть» связь между ними без специальных условий в запросе.
  2. Механизм сторнирования: Когда больничный вводится за уже «закрытый» период, он не просто вытесняет оклад, а создает сторно-записи. Эти записи физически относятся к маю, хотя их период действия — апрель.
  3. Настройки вытеснения: Если в виде расчета (например, «Оклад по дням») на вкладке «Прочее» не указан «Болезнь» как вытесняющий вид расчета, то ФактическийПериодДействия всегда будет равен полному периоду действия, независимо от наличия других документов.

Способ 1: Использование физической таблицы вместо виртуальной

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

Вместо обращения к ФактическийПериодДействия, мы можем составить запрос к основной таблице регистра. В условии запроса необходимо указать фильтр по сотруднику и интересующему нас ПериодДействия (апрель), полностью игнорируя ПериодРегистрации. Таким образом, мы увидим все записи, которые «претендуют» на время в апреле: и основной оклад, и больничный, зарегистрированный в мае.

Способ 2: Анализ сторно-записей

Если нам необходимо получить корректные данные через стандартные механизмы, проанализируем наличие сторно-записей. Для этого следует обращать внимание на записи с отрицательным результатом. В ЗУП 2.5 корректный расчет календарных дней часто опирается на то, что записи сторно уменьшают время, отработанное в прошлом периоде.

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

Способ 3: Обращение к регистру «Состояние работников»

Для целей расчета среднего заработка в ЗУП 2.5 часто эффективнее использовать не регистры расчета, а регистр сведений СостояниеРаботниковОрганизаций. Проанализируем, почему это удобно:

Способ 4: Корректировка параметров запроса к виртуальной таблице

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

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

Рекомендации по коду

При написании запроса для получения данных о фактически отработанных днях, рекомендуем использовать конструкцию, объединяющую данные из начислений и данные о сторнировании. Это гарантирует, что «майский» больничный уменьшит «апрельские» дни. Используйте ВЫБРАТЬ РАЗРЕШЕННЫЕ и всегда проверяйте настройки приоритетов видов расчета в плане видов расчета ОсновныеНачисления, так как одинаковый приоритет блокирует вытеснение.

← На главную