Почему в 1С:ЗУП 3.1 перестала рассчитываться база начислений и как восстановить очередность расчета

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

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

В данной статье мы разберем причины возникновения этой ошибки, выясним, как системный реквизит Очередность расчета влияет на результат, и научимся восстанавливать корректную работу программы.

Суть проблемы и механизм «Очередности расчета»

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

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

Проблема заключается в том, что если у Оклада и Надбавки очередность совпадает (например, у обоих установлена «1»), то в момент формирования строки с надбавкой система еще «не знает» результата оклада, так как они рассчитываются параллельно или в произвольном порядке. В итоге РасчетнаяБаза для надбавки оказывается равной нулю.

Как проверить текущую очередность расчета в базе

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

  1. Перейдем в раздел Настройка — Начисления.
  2. В верхней части окна нажмем кнопку Еще и выберем пункт Изменить форму.
  3. В открывшемся дереве элементов найдем папку Список.
  4. Выделим элемент Ссылка и нажмем кнопку Добавить поля.
  5. В появившемся списке найдем и отметим галочкой поле Очередность расчета.
  6. Нажмем ОК и Применить.

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

Почему происходит сбой очередности

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

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

Способ 1: Ручное восстановление очередности

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

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

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

Способ 2: Программное восстановление (для разработчиков)

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


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

После выполнения этого метода система проанализирует все формулы и вкладки «Расчет базы», после чего расставит корректные значения (1, 2, 3...) в реквизиты Очередность расчета. После этого расчет в документах Начисление зарплаты и взносов должен восстановиться автоматически (потребуется нажать кнопку Пересчитать сотрудника).

Особенности расчета Районного коэффициента (РК)

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

Для исправления РК и Северной надбавки необходимо убедиться, что их «вес» является максимальным среди всех используемых видов расчета. Обычно это значение 4 или выше.

Профилактика и рекомендации

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

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

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

← На главную