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

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

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

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

Анализируем проблему стандартного округления

Рассмотрим ситуацию, описанную в теме. У нас есть расчетная формула:

(РасчетнаяБаза / ОтработаноДней) * НормаДней

Проблема в том, что функция ОКР(Результат, 0) превратит 22994,21 в 22994. Чтобы получить 22995, нам нужно использовать дополнительные логические или математические механизмы. В редакторе формул 1С:ЗУП нам доступны только базовые операторы: ? (условие), ЦЕЛ (целая часть), ОКР (округление), МАКС и МИН. Рассмотрим, как с их помощью добиться нужного результата.

Способ №1: Использование логического условия

Проанализируем самый точный и прозрачный способ. Логика проста: если число уже является целым, мы оставляем его как есть. Если же у числа есть любая дробная часть (даже 0,01), мы отбрасываем эту часть и прибавляем к целому числу единицу.

Синтаксис оператора условия в формулах ЗУП выглядит так: ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь).

Для нашей задачи формула будет выглядеть следующим образом:

?(Результат = ЦЕЛ(Результат), Результат, ЦЕЛ(Результат) + 1)

Разберем по шагам, что здесь происходит:

  1. Сначала программа вычисляет Результат (вашу базу, деленную на дни и т.д.).
  2. Затем сравнивает его с его же целой частью ЦЕЛ(Результат).
  3. Если они равны (например, 22000.00 = 22000), то выводится само число.
  4. Если они НЕ равны (например, 22000.21 <> 22000), то берется ЦЕЛ(Результат) и прибавляется 1, что дает нам 22001.

Способ №2: Математическое смещение

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

Рассмотрим пример формулы:

ЦЕЛ(Результат + 0.999999)

Как это работает? Проанализируем два случая:

Важный момент: количество девяток после запятой определяет точность. Для расчетов зарплаты обычно достаточно 6 знаков. Однако этот метод менее надежен, чем первый, из-за особенностей хранения дробных чисел в памяти компьютера.

Особенности работы с "плавающей точкой"

Выясним важную причину, по которой формулы иногда могут "сбоить". В программировании результат деления (например, 100 / 3) в памяти компьютера может выглядеть не как 33.33, а как 33.330000000000001 или 32.99999999999999. Это называется ошибкой точности плавающей точки.

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


?(ОКР(ВашРасчет, 3) = ЦЕЛ(ОКР(ВашРасчет, 3)), 
  ОКР(ВашРасчет, 3), 
  ЦЕЛ(ОКР(ВашРасчет, 3)) + 1)

Здесь мы сначала приводим результат к нормальному виду с 3 знаками после запятой (ОКР(..., 3)), а потом уже применяем логику округления "вверх". Это гарантирует защиту от математических аномалий.

Пример итоговой формулы для ЗУП 3.1

Если мы объединим всё вышесказанное и применим к исходной задаче автора (с учетом РасчетнаяБаза, ОтработаноДней и НормаДней), итоговая формула в справочнике "Начисления" будет выглядеть так:


?( 
  ((РасчетнаяБаза / ОтработаноДней) * НормаДней) = ЦЕЛ((РасчетнаяБаза / ОтработаноДней) * НормаДней), 
  (РасчетнаяБаза / ОтработаноДней) * НормаДней, 
  ЦЕЛ((РасчетнаяБаза / ОтработаноДней) * НормаДней) + 1
)

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

Практические рекомендации

Проанализируем ещё несколько важных нюансов при настройке округления:

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

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

← На главную