При настройке произвольных формул в программе 1С:Зарплата и управление персоналом 3.1 пользователи часто сталкиваются с необходимостью округлить результат расчета не по математическим правилам, а строго в большую сторону (так называемая функция Ceil в языках программирования). Например, если результат составляет 22994,21, бухгалтер хочет видеть 22995. Стандартная функция ОКР в ЗУП по умолчанию округляет к ближайшему целому, что не всегда подходит для специфических разовых начислений.
В этой статье мы подробно разберем, как обойти ограничения стандартного редактора формул и заставить программу всегда округлять результат "вверх".
Рассмотрим ситуацию, описанную в теме. У нас есть расчетная формула:
(РасчетнаяБаза / ОтработаноДней) * НормаДней
Проблема в том, что функция ОКР(Результат, 0) превратит 22994,21 в 22994. Чтобы получить 22995, нам нужно использовать дополнительные логические или математические механизмы. В редакторе формул 1С:ЗУП нам доступны только базовые операторы: ? (условие), ЦЕЛ (целая часть), ОКР (округление), МАКС и МИН. Рассмотрим, как с их помощью добиться нужного результата.
Проанализируем самый точный и прозрачный способ. Логика проста: если число уже является целым, мы оставляем его как есть. Если же у числа есть любая дробная часть (даже 0,01), мы отбрасываем эту часть и прибавляем к целому числу единицу.
Синтаксис оператора условия в формулах ЗУП выглядит так: ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь).
Для нашей задачи формула будет выглядеть следующим образом:
?(Результат = ЦЕЛ(Результат), Результат, ЦЕЛ(Результат) + 1)
Разберем по шагам, что здесь происходит:
Результат (вашу базу, деленную на дни и т.д.).ЦЕЛ(Результат).ЦЕЛ(Результат) и прибавляется 1, что дает нам 22001.Существует более короткий, "хакерский" метод округления вверх без использования условий. Он основан на прибавлении к числу значения, максимально близкого к единице, но не равного ей, с последующим отсечением дробной части.
Рассмотрим пример формулы:
ЦЕЛ(Результат + 0.999999)
Как это работает? Проанализируем два случая:
Результат равен 22994.01, то 22994.01 + 0.999999 = 23004.009999. Функция ЦЕЛ оставит 23005.Результат ровно 22994.00, то 22994.00 + 0.999999 = 22994.999999. Функция ЦЕЛ оставит 22994.Важный момент: количество девяток после запятой определяет точность. Для расчетов зарплаты обычно достаточно 6 знаков. Однако этот метод менее надежен, чем первый, из-за особенностей хранения дробных чисел в памяти компьютера.
Выясним важную причину, по которой формулы иногда могут "сбоить". В программировании результат деления (например, 100 / 3) в памяти компьютера может выглядеть не как 33.33, а как 33.330000000000001 или 32.99999999999999. Это называется ошибкой точности плавающей точки.
Чтобы избежать ситуации, когда из-за микроскопической погрешности программа прибавит лишнюю единицу там, где число должно быть целым, рекомендуется предварительно округлить результат до 2 или 3 знаков перед основной проверкой. Рассмотрим улучшенный вариант первой формулы:
?(ОКР(ВашРасчет, 3) = ЦЕЛ(ОКР(ВашРасчет, 3)),
ОКР(ВашРасчет, 3),
ЦЕЛ(ОКР(ВашРасчет, 3)) + 1)
Здесь мы сначала приводим результат к нормальному виду с 3 знаками после запятой (ОКР(..., 3)), а потом уже применяем логику округления "вверх". Это гарантирует защиту от математических аномалий.
Если мы объединим всё вышесказанное и применим к исходной задаче автора (с учетом РасчетнаяБаза, ОтработаноДней и НормаДней), итоговая формула в справочнике "Начисления" будет выглядеть так:
?(
((РасчетнаяБаза / ОтработаноДней) * НормаДней) = ЦЕЛ((РасчетнаяБаза / ОтработаноДней) * НормаДней),
(РасчетнаяБаза / ОтработаноДней) * НормаДней,
ЦЕЛ((РасчетнаяБаза / ОтработаноДней) * НормаДней) + 1
)
Совет: чтобы формула не выглядела слишком громоздкой, в 1С:ЗУП 3.1 можно предварительно рассчитать промежуточный показатель (если это уместно), но чаще всего приходится писать именно такие длинные конструкции. Тщательно проверяйте количество закрывающих скобок — это самая частая причина ошибки "Формула заполнена неверно".
Проанализируем ещё несколько важных нюансов при настройке округления:
ОтработаноДней может быть равно нулю, программа выдаст ошибку при расчете. Всегда полезно добавлять проверку: ?(ОтработаноДней = 0, 0, ...).РасчетнаяБаза, убедитесь, что в настройках начисления на вкладке "Расчет базы" указаны верные базовые начисления.Используя предложенные методы, вы сможете настроить практически любую логику округления, требуемую вашим локальным нормативным актом или учетной политикой организации, не прибегая к доработке конфигурации программистами.