Почему в 1С:ЗУП 2.5 не учитываются изменения условий исполнительного листа при расчете зарплаты?

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

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

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

Выясним причину: почему ломается расчет удержаний?

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

  1. Плановые удержания — этот регистр отвечает за сам факт действия удержания в определенном периоде времени.
  2. Условия удержания по исполнительному документу — именно здесь хранятся конкретные параметры удержания (процент, фиксированная сумма, наличие предела удержаний и т.д.).

Когда мы проводим документ Изменение условий исполнительного листа, система делает новые записи в оба этих регистра, устанавливая период действия новых условий (например, с 01.10.2018). На уровне записей регистров всё выглядит абсолютно корректно. Однако сбой происходит на этапе сбора данных для расчета в общем модуле ПроведениеРасчетов.

Внутри алгоритма расчета удержаний разработчиками собран сложный многоэтапный запрос с использованием объекта МенеджерВременныхТаблиц. Из-за архитектурной неточности в коде этого запроса соединение таблиц плановых удержаний и их условий происходит не по дате актуальности (срез последних), а жестко привязывается к дате первоначального документа-основания — самого первого документа Исполнительный лист. В результате расчетный механизм игнорирует более свежие записи в регистре условий и продолжает рассчитывать удержание по историческим данным.

Также важно помнить, что редакция 2.5 крайне чувствительна к датам:

Перейдем к практическим методам решения этой проблемы.

Вариант 1. Обновление конфигурации (Рекомендуемый способ)

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

Для устранения проблемы без вмешательства в код программы необходимо обновить базу до финальных релизов ветки 2.5:

После обновления алгоритмы расчета удержаний начнут корректно обрабатывать историю изменений параметров из регистра Условия удержания по исполнительному документу.

Вариант 2. Классический обходной путь через закрытие и открытие листов

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

Рассмотрим пошагово, как правильно это сделать:

  1. Откройте исходный документ Исполнительный лист, по которому необходимо изменить условия.
  2. В поле «Прекратить удержание с» установите дату окончания действия старых условий. Наш новый процент должен действовать с 01.10.2018, следовательно, старые условия должны прекратить свое действие 30.09.2018. Запишите и проведите документ.
  3. Создайте новый документ Исполнительный лист на этого же сотрудника.
  4. В новом документе укажите дату начала действия — 01.10.2018.
  5. Внесите новые измененные параметры удержания (в нашем примере — 15% вместо 30%). Получателя и прочие реквизиты заполните аналогично первому листу.
  6. Проведите новый документ.

Этот способ гарантирует стопроцентный результат при расчете, так как программа будет видеть два последовательных, не пересекающихся во времени удержания, и запросу не придется обращаться к истории изменений внутри одного документа-основания.

Вариант 3. Последовательное перепроведение и очистка табличных частей

Иногда новые условия не применяются банально из-за того, что расчет заработной платы за октябрь уже был частично произведен или сохранен в памяти программы. Для исключения влияния кэша выполните следующие действия:

  1. Полностью распроведите документ Начисление зарплаты за расчетный месяц.
  2. Убедитесь, что дата документа Изменение условий исполнительного листа установлена корректно (желательно началом дня изменения, например, 01.10.2018 00:00:00). Перепроведите его.
  3. Откройте документ Начисление зарплаты, перейдите на вкладку «Прочие удержания».
  4. Не используйте простую кнопку «Пересчитать». Вместо этого полностью удалите строки по проблемному сотруднику из табличной части удержаний.
  5. Запишите документ, после чего нажмите кнопку «Заполнить» -> «По работнику» (или рассчитайте документ целиком). Программа заново обратится к актуальным регистрам сведений и подтянет новые 15%.

Вариант 4. Корректировка движений регистров вручную

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

  1. Создайте документ Корректировка записей регистров.
  2. Перейдите в настройку состава регистров и добавьте регистры сведений Плановые удержания и Условия удержания по исполнительному документу.
  3. Внесите записи, которые «затрут» старое значение в 30% на дату начала действия новых условий (с 01.10.2018).

Важно: Этот метод требует повышенного внимания, так как ручные корректировки могут усложнить последующую отчетность или аудит базы данных.

Вариант 5. Для программистов: исправление запроса в коде модуля

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

Проанализируем проблемный участок связи временных таблиц. В типовом ошибочном коде связь выглядит примерно так:


// Ошибочный вариант связи таблиц в запросе ЗУП 2.5
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УсловияУдержанияПоИсполнительномуДокументу КАК УсловияУдержания
    ПО ВтПлановыеУдержания.ДокументОснование = УсловияУдержания.ИсполнительныйДокумент

В данном случае связь идет без учета временного среза. Чтобы запрос выбирал актуальные условия на дату расчета, необходимо скорректировать связь, добавив условие по периоду действия записи:


// Корректный вариант связи с учетом актуальности периода действия условий
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УсловияУдержанияПоИсполнительномуДокументу КАК УсловияУдержания
    ПО ВтПлановыеУдержания.ДокументОснование = УсловияУдержания.ИсполнительныйДокумент
    И УсловияУдержания.Период В
        (ВЫБРАТЬ
            МАКСИМУМ(УсловияМакс.Период)
         ИЗ
            РегистрСведений.УсловияУдержанияПоИсполнительномуДокументу КАК УсловияМакс
         ГДЕ
            УсловияМакс.ИсполнительныйДокумент = ВтПлановыеУдержания.ДокументОснование
            И УсловияМакс.Период <= &КонецПериодаРасчета)

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

Надеемся, эти подробные инструкции помогут вам успешно справиться с капризами расчета исполнительных листов в ЗУП 2.5!

← На главную