При настройке сложных видов расчета в программе 1С:Зарплата и Управление Персоналом (редакция 3.1) специалисты часто сталкиваются с ситуацией, когда формула корректно рассчитывается для одной группы сотрудников, но полностью игнорируется системой для другой. Разберем распространенную проблему на примере начисления Доплата в командировке до оклада.
Рассмотрим исходную формулу расчета доплаты до оклада за время командировки:
Макс(
(Оклад * ДоляНеполногоРабочегоВремени / НормаДней) * ВремяВДнях +
((СевернаяНадбавка / 100) * (Оклад * ДоляНеполногоРабочегоВремени / НормаДней) * ВремяВДнях) +
((Макс(РайонныйКоэффициент, 1) - 1) * (Оклад * ДоляНеполногоРабочегоВремени / НормаДней) * ВремяВДнях)
- РасчетнаяБаза, 0)
На первом этапе эта формула отлично показывает себя для работников, у которых применяется северная надбавка. Однако если начисление рассчитывается для сотрудника без северной надбавки (или в организации, где она не выплачивается), система перестает рассчитывать данное начисление — оно даже не попадает в результат расчета зарплаты.
Проанализируем причину такого поведения движка 1С:ЗУП 3.1:
СевернаяНадбавка не принимает значение 0, а полностью исключается платформой из выборки данных при формировании запроса расчета. В результате вычислитель формул считают показатель отсутствующим, и расчет блокируется.? в формулах: Попытка обойти проблему с помощью конструкции ?(1=1, 0, СевернаяНадбавка) также не приносит результата. Встроенный вычислитель формул 1С запрашивает значения абсолютно всех показателей, указанных в формуле, еще до вычисления самого условия. Если показатель из неактивной ветки неопределен, отклоняется вся формула.Выяснив причину блокировки показателя, рассмотрим доработку программы на уровне кода. Для этого необходимо внести изменения в процедуру заполнения показателей расчета зарплаты.
В общем модуле или обработке МенеджерРасчетаЗарплаты найдем процедуру ЗаполнитьЗначенияПоказателейПоВыборкеЗапроса. Чтобы показатель не удалялся из выборки при нулевых значениях или отсутствии прав у сотрудника, добавим проверку условия:
Если Выборка.Показатель = Справочники.ПоказателиРасчетаЗарплаты.СевернаяНадбавка Тогда
// Не исключаем показатель из выборки, чтобы формула продолжала работать
Продолжить;
КонецЕсли;
Благодаря этому условию показатель СевернаяНадбавка сохраняется в выборке и корректно передается в вычислитель формул со значением 0, что позволяет формуле успешно вычисляться для всех сотрудников компании.
Если конфигурацию нельзя менять и требуется сохранить типовое решение на поддержке, разберем альтернативные способы настройки:
0. При этом показатель СевернаяНадбавка начинает считываться платформой как число 0, и формула отрабатывает без ошибок.СевернаяНадбавка создается пользовательский показатель (числовой, заводимый для сотрудника или организации). Пользовательские показатели не исключаются из запроса платформой и при отсутствии введенных данных автоматически принимают значение 0.СевернаяНадбавка для «северных» сотрудников, и второе без него для всех остальных работников.