К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как вычислить процент в 1С: практическое руководство

Как вычислить процент в 1С: формулы в языке 1С, расчёт в запросах, СКД и отчётах, типовые ошибки округления и деления на ноль, примеры кода.

Расчёт процентов — одна из самых частых задач в 1С: скидки и наценки, НДС, доля выполнения плана, процент брака, рентабельность. При этом способ вычисления зависит от контекста: в модуле объекта используется встроенный язык, в запросах — арифметика над полями, в СКД — вычисляемые выражения и ресурсы, а в пользовательском режиме — калькулятор и формулы в отчётах.

Главная сложность не в самой формуле «часть × 100 / целое», а в типичных подводных камнях: деление на ноль, потеря точности из-за округления, целочисленное деление в запросах и неправильный базис расчёта (от чего считать процент). Ниже разобраны все основные сценарии с рабочими примерами кода.

Базовая формула процента на встроенном языке 1С

Во встроенном языке 1С нет отдельного оператора для процентов — используется обычная арифметика. Два классических варианта: найти процент от числа и найти, сколько процентов составляет одно число от другого.

// Процент от числа: скидка 15% от суммы

СуммаСкидки = Сумма * 15 / 100;

// Сколько процентов составляет часть от целого

ПроцентВыполнения = Факт * 100 / План;

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

Результат почти всегда нужно округлить до разумного числа знаков. Для этого используется функция Окр(Число, Разрядность):

Процент = Окр(Факт * 100 / План, 2); // два знака после запятой

Защита от деления на ноль и пустых значений

Самая частая ошибка при расчёте процентов — деление на ноль, когда базис (план, целое, прошлое значение) равен нулю. В модуле это вызывает исключение «Деление на ноль», которое прерывает выполнение кода и может оставить документ непроведённым.

Всегда проверяйте делитель перед расчётом и заранее решайте, что считать результатом: ноль, пустое значение или 100%. Это бизнес-решение, а не техническое — например, при нулевом плане процент выполнения логичнее показать как «—», чем как 0%.

Если План = 0 Тогда

ПроцентВыполнения = 0; // или Неопределено — по смыслу отчёта

Иначе

ПроцентВыполнения = Окр(Факт * 100 / План, 2);

КонецЕсли;

Отдельный случай — значение Неопределено или NULL из соединения таблиц. В модуле проверяйте через ЗначениеЗаполнено(), в запросах — через ЕСТЬNULL(Поле, 0), иначе расчёт молча даст пустой результат.

Типичные ошибки
01
Деление без проверки нулевого базиса — исключение прерывает проведение документа или построение отчёта
02
Округление промежуточных значений до финального расчёта — сумма процентов по строкам не сходится к 100%
03
Смешение базиса: процент скидки считается от цены со скидкой вместо исходной цены
04
Игнорирование NULL в запросах с левым соединением — процент по строке остаётся пустым

Вычисление процента в запросе

В языке запросов 1С процент считается арифметическим выражением над полями. Критический нюанс — приведение типов: если оба операнда целые, результат деления тоже будет целым, и дробная часть потеряется.

ВЫБРАТЬ

Продажи.Номенклатура,

Продажи.СуммаОборот,

ВЫРАЗИТЬ(Продажи.СуммаОборот * 100 / &ИтогоПродаж КАК ЧИСЛО(15, 2)) КАК ДоляПроцент

ИЗ

РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи

Конструкция ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) одновременно задаёт точность и округляет результат. Вместо параметра итоговой суммы часто используют вложенный запрос или соединение с итоговой таблицей — так доля каждой строки считается от общего итога.

Для защиты от деления на ноль в запросе применяется конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ:

ВЫБОР

КОГДА ЕСТЬNULL(План.Сумма, 0) = 0

ТОГДА 0

ИНАЧЕ ВЫРАЗИТЬ(Факт.Сумма * 100 / План.Сумма КАК ЧИСЛО(15, 2))

КОНЕЦ КАК ПроцентВыполнения

bsl
// Типовой шаблон процента в запросе
ВЫБОР
    КОГДА ЕСТЬNULL(База, 0) = 0 ТОГДА 0
    ИНАЧЕ ВЫРАЗИТЬ(Часть * 100 / База КАК ЧИСЛО(15, 2))
КОНЕЦ КАК Процент

Проценты в СКД и отчётах

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

Если процент нужен только в строках — достаточно вычисляемого поля с выражением вида Факт * 100 / План. Если процент должен корректно пересчитываться в итогах и группировках, его нужно оформить как ресурс и задать выражение расчёта итога явно, иначе СКД по умолчанию просуммирует проценты по строкам, что даст бессмысленное число.

В ресурсах доступна функция ВычислитьВыражение(), а для расчёта доли от итога по группировке — процент от общего итога через выражение с указанием группировки. В пользовательском режиме типовых отчётов (например, «Анализ продаж») доля в процентах часто уже есть среди предустановленных показателей — проверьте настройки полей, прежде чем дорабатывать отчёт.

Где считать процент

В запросе набора данных

Подходит для детальных строк и простых отчётов; ограничение — итоги по группировкам посчитаются суммой процентов

Вычисляемое поле СКД

Гибко для строк, легко менять без правки запроса; те же проблемы с итогами

Ресурс с выражением итога

Правильный пересчёт в группировках и общих итогах; требует аккуратного выражения и проверки на ноль

Типовые прикладные сценарии

Скидки и наценки

Скидка считается от базовой цены: ЦенаСоСкидкой = Цена (100 - ПроцентСкидки) / 100. Наценка — наоборот: ЦенаПродажи = Себестоимость (100 + ПроцентНаценки) / 100. В типовых конфигурациях (УТ, ERP, Розница) скидки обычно рассчитываются механизмом скидок и наценок, и вмешиваться в формулы вручную не нужно — достаточно правильно задать процент в карточке скидки.

НДС

Выделение НДС из суммы «в том числе НДС» и начисление сверху — разные формулы, их часто путают. Для ставки 20%: начисление — Сумма 20 / 100, выделение — Сумма 20 / 120. В типовых конфигурациях расчёт НДС выполняется типовыми процедурами, и самостоятельно считать его кодом не рекомендуется — используйте штатные механизмы учёта НДС, чтобы не разойтись с декларацией.

Процент выполнения плана и доли

Доля строки в итоге: ЗначениеСтроки * 100 / ИтогПоКолонке. При выгрузке в Excel или печать помните: если округлить каждую долю до целых, сумма процентов может дать 99 или 101. Это нормальное следствие округления; если требуется ровно 100%, применяют метод наибольшего остатка или корректируют самую крупную строку.

Порядок действий при добавлении процента в отчёт
  1. 1
    Определите базис: от чего считается процент (итог отчёта, план, прошлый период)
  2. 2
    Решите, где считать: запрос, вычисляемое поле или ресурс СКД
  3. 3
    Добавьте защиту от деления на ноль и обработку NULL
  4. 4
    Задайте точность через ВЫРАЗИТЬ или Окр и формат поля с знаком %
  5. 5
    Проверьте итоги: процент в группировках должен пересчитываться, а не суммироваться

Проверка результата и форматирование

После внедрения расчёта проверьте его на контрольных примерах с известным ответом: половина должна дать 50%, удвоение — 200%, нулевой базис — предусмотренное значение без ошибки. Особое внимание уделите строкам с NULL и итогам по группировкам.

Для отображения задайте формат поля: в форматной строке можно указать число знаков и символ процента, например Формат(Процент, "ЧДЦ=2") + " %" или настройку формата поля в СКД. Помните, что хранить значение лучше как число (50,25), а знак процента добавлять только при выводе — иначе сортировка и дальнейшие вычисления по полю сломаются.

Контрольные точки

Как проверить результат

Контрольный пример 50 из 200
Норма

Получено 25%

Тревожный признак

0, 0,25 или 2500 — ошибка в порядке операций или типах

Строка с нулевым планом
Норма

Показан 0 или прочерк по правилам отчёта

Тревожный признак

Ошибка деления на ноль или пустое значение

Итог по группировке
Норма

Процент пересчитан от итогов группы

Тревожный признак

Проценты по строкам просуммированы

Сумма долей по строкам
Норма

Около 100% с погрешностью округления

Тревожный признак

Сильное расхождение — округлены промежуточные значения

Часто задаваемые вопросы

Почему в запросе процент получается нулём?

Чаще всего из-за целочисленного деления: если оба поля целые, результат дроби отбрасывается. Приведите выражение к дробному типу через ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) или умножьте числитель на 100 до деления и задайте разрядность поля.

Как показать прочерк вместо процента при нулевом базисе?

В запросе верните NULL в ветке ВЫБОР при нулевом делителе — в отчёте NULL отображается пустотой. В СКД можно дополнительно настроить формат поля или оформление, чтобы пустое значение выводилось как «—».

Чем выделение НДС отличается от начисления?

Начисление считается от суммы без налога: Сумма × Ставка / 100. Выделение — от суммы, уже включающей налог: Сумма × Ставка / (100 + Ставка). Подстановка не той формулы систематически искажает сумму налога.

Можно ли посчитать процент в пользовательском режиме без доработки?

Да, если в типовом отчёте есть нужный показатель или доступен вариант «доля в процентах» в настройках полей. В простых случаях помогает встроенный калькулятор, вызываемый в числовых полях. Если показателя нет — потребуется доработка отчёта или внешняя обработка.

Почему сумма процентов по строкам не равна 100?

Это следствие округления каждой доли по отдельности. Варианты решения: увеличить точность до 2–4 знаков, показать в подвале формулировку о погрешности округления либо применить метод наибольшего остатка, распределяющий разницу на крупнейшие строки.

Где хранить процент: в процентах или в долях единицы?

Однозначного стандарта нет, но в 1С принято хранить как число процентов (15, а не 0,15) — так значения читаемы в формах и отчётах без дополнительного форматирования. Главное — единообразие: смешение подходов в одной базе приводит к ошибкам в сто раз.

Итог

Что важно запомнить

Процент в 1С считается формулой Часть × 100 / Целое с обязательной проверкой делителя на ноль. В запросах приводите результат к дробному типу через ВЫРАЗИТЬ, в СКД для корректных итогов используйте ресурсы с выражением расчёта. Храните процент как число, округляйте только финальный результат и проверяйте расчёт на контрольных примерах.