Как правильно настроить сложную формулу расчета с условием в 1С:ЗУП 3.1?

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

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

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

Исходная задача и проблемная формула

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

Пользователь попытался настроить расчет единой формулой, используя встроенную функцию условия ?():


? (Выручка план * ВремяВЧасах/НормаЧасов-Выручка факт>=0, (Оклад* ВремяВЧасах/НормаЧасов*40/60)+((Выручка план * ВремяВЧасах/НормаЧасов-Выручка факт)*0,15), (Оклад* ВремяВЧасах/НормаЧасов*40/60)-((Выручка план * ВремяВЧасах/НормаЧасов-Выручка факт)*0,4))

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

Шаг 1. Исправление синтаксиса: разделители в дробных числах

Выясним причину первой и самой очевидной ошибки, из-за которой программа наотрез отказывалась принимать формулу. Обратим внимание на запись числовых коэффициентов: 0,15 и 0,4.

В редакторе формул 1С:ЗУП 3.1 действуют строгие правила синтаксиса:

  1. Точка как разделитель дроби: Для разделения целой и дробной части в числах всегда должна использоваться исключительно точка. Правильно писать: 0.15 и 0.4.
  2. Запятая как разделитель аргументов: Запятая в формулах 1С служит системным разделителем параметров функций (например, в условиях или математических функциях). Когда программа встречает запись вида ((Выражение)*0,15), она интерпретирует запятую как начало нового аргумента, что полностью ломает структуру математического выражения и приводит к синтаксической ошибке.

Шаг 2. Анализ и исправление логических ошибок в расчете

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

Условие в формуле записано так: Выручка план * ВремяВЧасах/НормаЧасов - Выручка факт >= 0 (для краткости обозначим скорректированный план как План, а факт как Факт).

То есть условие проверяет: План - Факт >= 0 (План больше или равен Факту — план НЕ выполнен).

Если условие выполняется (ИСТИНА, то есть план не выполнен), программа рассчитывает первую ветку условия:

(Оклад за время * 40/60) + ((План - Факт) * 0.15)

В чем ошибка? Сотрудник не выполнил план, но программа прибавляет к его надбавке 15% от недополученной выручки. Это абсурд — сотрудник получает премию за ухудшение показателей!

Если условие не выполняется (ЛОЖЬ, то есть факт больше плана — план выполнен и перевыполнен), программа рассчитывает вторую ветку условия:

(Оклад за время * 40/60) - ((План - Факт) * 0.4)

В чем ошибка? Поскольку факт больше плана, разность План - Fact будет отрицательной. При вычитании отрицательного числа по законам математики минус на минус даст плюс: - (-Разница * 0.4) = + (Разница * 0.4). Сотруднику начислится 40% премии вместо положенных 15%.

Чтобы избежать этой путаницы, мы перепишем условие более простым и понятным языком. За базовое условие мы примем успешное событие: превышение фактических показателей над плановыми (ВыручкаФакт > ВыручкаПлан с учетом отработанного времени).

Тогда логическая структура будет выглядеть следующим образом:

Шаг 3. Избавляемся от ручного пересчета оклада и переходим на «Расчетную базу»

В формуле автора оклад за отработанное время рассчитывается вручную через громоздкую конструкцию: Оклад * ВремяВЧасах / НормаЧасов. Использование таких конструкций в сложных формулах крайне не рекомендуется по нескольким причинам.

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

Для автоматизации этой задачи в 1С:ЗУП 3.1 предназначен предопределенный показатель РасчетнаяБаза. Давайте разберем подробнее, как перевести расчет на этот механизм:

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

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

Шаг 4. Устраняем опасность ошибки «Деление на ноль»

Использование показателя НормаЧасов в знаменателе математических формул несет скрытую угрозу стабильности системы.

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

При попытке рассчитать заработную плату за этот месяц программа столкнется с делением на ноль в формуле начисления. Это приведет к аварийной остановке расчета, выдаче критической ошибки и невозможности провести документ «Начисление зарплаты и взносов» по всей организации. Использование показателя РасчетнаяБаза полностью снимает эту проблему, так как база рассчитывается на основании уже проведенных и рассчитанных документов начислений.

Шаг 5. Настройка произвольных показателей «Выручка план» и «Выручка факт»

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

Шаг 5.1. Создание показателей
Перейдем в раздел Настройка — Показатели расчета зарплаты и создадим два показателя со следующими настройками:

Шаг 5.2. Создание шаблона ввода данных
Чтобы расчетчики могли быстро вводить эти показатели каждый месяц, перейдем в меню Настройка — Шаблоны ввода исходных данных и создадим новый шаблон:

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

Шаг 6. Итоговый вариант оптимизированной формулы

Объединим все наши исправления воедино. Мы заменили ручной расчет времени на надежный показатель РасчетнаяБаза, исправили синтаксические запятые на точки в коэффициентах 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 рублей.
Сотрудник получил штраф из надбавки за недовыполнение показателей, расчет корректен.

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

← На главную