Как исправить формулу доплаты до оклада в командировке в 1С:ЗУП, если у сотрудника нет северной надбавки

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

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

Анализ проблемы и причин сбоя расчета

Рассмотрим исходную формулу расчета доплаты до оклада за время командировки:


Макс(
(Оклад * ДоляНеполногоРабочегоВремени / НормаДней) * ВремяВДнях + 
((СевернаяНадбавка / 100) * (Оклад * ДоляНеполногоРабочегоВремени / НормаДней) * ВремяВДнях) +
((Макс(РайонныйКоэффициент, 1) - 1) * (Оклад * ДоляНеполногоРабочегоВремени / НормаДней) * ВремяВДнях)
- РасчетнаяБаза, 0)

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

Проанализируем причину такого поведения движка 1С:ЗУП 3.1:

  1. Исключение системного показателя из запроса: Если в настройках организации не включена опция использования северной надбавки или у сотрудника нет права на ее получение, системный показатель СевернаяНадбавка не принимает значение 0, а полностью исключается платформой из выборки данных при формировании запроса расчета. В результате вычислитель формул считают показатель отсутствующим, и расчет блокируется.
  2. Ограничение условного оператора ? в формулах: Попытка обойти проблему с помощью конструкции ?(1=1, 0, СевернаяНадбавка) также не приносит результата. Встроенный вычислитель формул 1С запрашивает значения абсолютно всех показателей, указанных в формуле, еще до вычисления самого условия. Если показатель из неактивной ветки неопределен, отклоняется вся формула.

Решение 1. Доработка конфигурации (изменение процедуры расчета)

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

В общем модуле или обработке МенеджерРасчетаЗарплаты найдем процедуру ЗаполнитьЗначенияПоказателейПоВыборкеЗапроса. Чтобы показатель не удалялся из выборки при нулевых значениях или отсутствии прав у сотрудника, добавим проверку условия:


Если Выборка.Показатель = Справочники.ПоказателиРасчетаЗарплаты.СевернаяНадбавка Тогда
    // Не исключаем показатель из выборки, чтобы формула продолжала работать
    Продолжить;
КонецЕсли;

Благодаря этому условию показатель СевернаяНадбавка сохраняется в выборке и корректно передается в вычислитель формул со значением 0, что позволяет формуле успешно вычисляться для всех сотрудников компании.

Решение 2. Настройка справочников и опций (без изменения кода)

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

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