Настройка произвольных формул расчета в программе «1С:Зарплата и управление персоналом 3.1» (1С:ЗУП 3.1) — это мощный инструмент, который позволяет автоматизировать практически любую систему мотивации сотрудников. Однако при создании сложных многострочных конструкций с условиями легко допустить синтаксические и логические ошибки. Программа в таких случаях выдает неинформативное сообщение об ошибке в формуле, оставляя пользователя наедине с проблемой.
В этой статье мы подробно разберем реальный практический кейс настройки формулы расчета, проанализируем типичные ошибки, которые совершают даже опытные расчетчики, и покажем, как оптимизировать расчеты с использованием методологически верных механизмов платформы 1С.
Рассмотрим систему оплаты труда, при которой сотрудникам начисляется надбавка по результатам выполнения индивидуального плана за месяц. Условия начисления выглядят следующим образом:
Оклад за отработанное время * 40 / 60 плюс дополнительно 15% от суммы превышения (разницы между фактом и планом).Оклад за отработанное время * 40 / 60, но из нее вычитается штраф в размере 40% от суммы недовыполнения (разницы между планом и фактом).Пользователь попытался настроить расчет единой формулой, используя встроенную функцию условия ?():
? (Выручка план * ВремяВЧасах/НормаЧасов-Выручка факт>=0, (Оклад* ВремяВЧасах/НормаЧасов*40/60)+((Выручка план * ВремяВЧасах/НормаЧасов-Выручка факт)*0,15), (Оклад* ВремяВЧасах/НормаЧасов*40/60)-((Выручка план * ВремяВЧасах/НормаЧасов-Выручка факт)*0,4))
При попытке сохранить такое начисление программа выдает синтаксическую ошибку. Давайте разберем по шагам, почему это происходит и как сделать формулу не только рабочей, но и надежной.
Выясним причину первой и самой очевидной ошибки, из-за которой программа наотрез отказывалась принимать формулу. Обратим внимание на запись числовых коэффициентов: 0,15 и 0,4.
В редакторе формул 1С:ЗУП 3.1 действуют строгие правила синтаксиса:
0.15 и 0.4.((Выражение)*0,15), она интерпретирует запятую как начало нового аргумента, что полностью ломает структуру математического выражения и приводит к синтаксической ошибке.Даже если мы заменим все запятые на точки, оригинальная формула будет считать зарплату некорректно из-за серьезной логической ошибки в знаках и условиях. Проанализируем математику исходного условия.
Условие в формуле записано так: Выручка план * ВремяВЧасах/НормаЧасов - Выручка факт >= 0 (для краткости обозначим скорректированный план как План, а факт как Факт).
То есть условие проверяет: План - Факт >= 0 (План больше или равен Факту — план НЕ выполнен).
Если условие выполняется (ИСТИНА, то есть план не выполнен), программа рассчитывает первую ветку условия:
(Оклад за время * 40/60) + ((План - Факт) * 0.15)
В чем ошибка? Сотрудник не выполнил план, но программа прибавляет к его надбавке 15% от недополученной выручки. Это абсурд — сотрудник получает премию за ухудшение показателей!
Если условие не выполняется (ЛОЖЬ, то есть факт больше плана — план выполнен и перевыполнен), программа рассчитывает вторую ветку условия:
(Оклад за время * 40/60) - ((План - Факт) * 0.4)
В чем ошибка? Поскольку факт больше плана, разность План - Fact будет отрицательной. При вычитании отрицательного числа по законам математики минус на минус даст плюс: - (-Разница * 0.4) = + (Разница * 0.4). Сотруднику начислится 40% премии вместо положенных 15%.
Чтобы избежать этой путаницы, мы перепишем условие более простым и понятным языком. За базовое условие мы примем успешное событие: превышение фактических показателей над плановыми (ВыручкаФакт > ВыручкаПлан с учетом отработанного времени).
Тогда логическая структура будет выглядеть следующим образом:
В формуле автора оклад за отработанное время рассчитывается вручную через громоздкую конструкцию: Оклад * ВремяВЧасах / НормаЧасов. Использование таких конструкций в сложных формулах крайне не рекомендуется по нескольким причинам.
Во-первых, это перегружает формулу и делает ее практически нечитаемой. Во-вторых, ручной расчет времени не учитывает множество кадровых нюансов и отклонений (например, работу в праздничные дни, командировки или периоды отсутствия, если они настроены нестандартно).
Для автоматизации этой задачи в 1С:ЗУП 3.1 предназначен предопределенный показатель РасчетнаяБаза. Давайте разберем подробнее, как перевести расчет на этот механизм:
РасчетнаяБаза.Программа сама на уровне платформы определит сумму оклада, которая уже начислена сотруднику за фактически отработанное время в текущем месяце. Это гарантирует 100% точность и исключает любые расхождения с основным табелем.
Использование показателя НормаЧасов в знаменателе математических формул несет скрытую угрозу стабильности системы.
Рассмотрим ситуацию: в программе по какому-то сотруднику не заполнили график работы на новый год, изменили настройки рабочего времени или сотрудник уходит в отпуск на весь месяц, из-за чего норма рабочих часов в данном периоде по его графику становится равной 0.
При попытке рассчитать заработную плату за этот месяц программа столкнется с делением на ноль в формуле начисления. Это приведет к аварийной остановке расчета, выдаче критической ошибки и невозможности провести документ «Начисление зарплаты и взносов» по всей организации. Использование показателя РасчетнаяБаза полностью снимает эту проблему, так как база рассчитывается на основании уже проведенных и рассчитанных документов начислений.
Для корректной работы формулы нам необходимо зарегистрировать в системе два новых показателя: плановую и фактическую выручку. Рассмотрим этот процесс по шагам.
Шаг 5.1. Создание показателей
Перейдем в раздел Настройка — Показатели расчета зарплаты и создадим два показателя со следующими настройками:
ВыручкаПлан (и ВыручкаФакт).Шаг 5.2. Создание шаблона ввода данных
Чтобы расчетчики могли быстро вводить эти показатели каждый месяц, перейдем в меню Настройка — Шаблоны ввода исходных данных и создадим новый шаблон:
ВыручкаПлан и ВыручкаФакт.Теперь ежемесячно перед расчетом зарплаты ответственный пользователь будет создавать документ «Данные для расчета зарплаты» (в разделе Зарплата), выбирать созданный шаблон и заполнять таблицу со списком сотрудников, их планами и фактами.
Объединим все наши исправления воедино. Мы заменили ручной расчет времени на надежный показатель РасчетнаяБаза, исправили синтаксические запятые на точки в коэффициентах 0.15 и 0.4, исправили логические знаки условий и привели формулу к максимально лаконичному и прозрачному виду.
Вот как выглядит итоговая корректная формула для ЗУП 3.1:
?(ВыручкаФакт > (ВыручкаПлан * ВремяВЧасах / НормаЧасов), (РасчетнаяБаза * 40 / 60) + ((ВыручкаФакт - (ВыручкаПлан * ВремяВЧасах / НормаЧасов)) * 0.15), (РасчетнаяБаза * 40 / 60) - (((ВыручкаПлан * ВремяВЧасах / НормаЧасов) - ВыручкаFact) * 0.4))
Примечание: Если индивидуальный план сотрудника устанавливается сразу жестко на месяц и его величина не должна уменьшаться пропорционально недоработанным часам (например, если сотрудник болел), то формулу можно упростить еще сильнее, убрав коэффициент времени из сравнения плановой выручки:
?(ВыручкаFact > ВыручкаПлан, (РасчетнаяБаза * 40 / 60) + ((ВыручкаФакт - ВыручкаПлан) * 0.15), (РасчетнаяБаза * 40 / 60) - ((ВыручкаПлан - ВыручкаФакт) * 0.4))
Давайте проверим работоспособность и логику нашей оптимизированной формулы на конкретном примере.
Допустим, у сотрудника оклад составляет 60 000 рублей. В текущем месяце он отработал норму времени полностью. Соответственно, его показатель РасчетнаяБаза (куда входит оплата по окладу) равен 60 000 рублей. Базовая часть надбавки составляет: 60 000 * 40 / 60 = 40 000 рублей.
Сценарий №1. Превышение плана
Плановая выручка составляла 500 000 рублей. Фактическая выручка сотрудника составила 600 000 рублей (план перевыполнен).
Программа проверяет условие: 600 000 > 500 000. Условие истинно. Выполняется первая ветвь расчета:
40 000 + (600 000 - 500 000) * 0.15 = 40 000 + 100 000 * 0.15 = 40 000 + 15 000 = 55 000 рублей.
Расчет выполнен абсолютно верно.
Сценарий №2. Недовыполнение плана
Плановая выручка составляла 500 000 рублей. Фактическая выручка сотрудника составила 450 000 рублей (план недовыполнен на 50 000 рублей).
Программа проверяет условие: 450 000 > 500 000. Условие ложно. Выполняется вторая ветвь расчета:
40 000 - (500 000 - 450 000) * 0.4 = 40 000 - 50 000 * 0.4 = 40 000 - 20 000 = 20 000 рублей.
Сотрудник получил штраф из надбавки за недовыполнение показателей, расчет корректен.
Использование предложенного подхода гарантирует стабильность расчета заработной платы, страхует систему от деления на ноль при незаполненных графиках и существенно упрощает чтение и поддержку формулы другими специалистами.