Разработка и Конфигурация · 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), иначе расчёт молча даст пустой результат.
Вычисление процента в запросе
В языке запросов 1С процент считается арифметическим выражением над полями. Критический нюанс — приведение типов: если оба операнда целые, результат деления тоже будет целым, и дробная часть потеряется.
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.СуммаОборот,
ВЫРАЗИТЬ(Продажи.СуммаОборот * 100 / &ИтогоПродаж КАК ЧИСЛО(15, 2)) КАК ДоляПроцент
ИЗ
РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи
Конструкция ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) одновременно задаёт точность и округляет результат. Вместо параметра итоговой суммы часто используют вложенный запрос или соединение с итоговой таблицей — так доля каждой строки считается от общего итога.
Для защиты от деления на ноль в запросе применяется конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ:
ВЫБОР
КОГДА ЕСТЬNULL(План.Сумма, 0) = 0
ТОГДА 0
ИНАЧЕ ВЫРАЗИТЬ(Факт.Сумма * 100 / План.Сумма КАК ЧИСЛО(15, 2))
КОНЕЦ КАК ПроцентВыполнения
// Типовой шаблон процента в запросе
ВЫБОР
КОГДА ЕСТЬNULL(База, 0) = 0 ТОГДА 0
ИНАЧЕ ВЫРАЗИТЬ(Часть * 100 / База КАК ЧИСЛО(15, 2))
КОНЕЦ КАК ПроцентПроценты в СКД и отчётах
В системе компоновки данных процент можно посчитать тремя способами: в запросе набора данных, в вычисляемом поле и в ресурсе с выражением. Выбор зависит от того, нужен ли процент на уровне детальных строк или по группировкам и итогам.
Если процент нужен только в строках — достаточно вычисляемого поля с выражением вида Факт * 100 / План. Если процент должен корректно пересчитываться в итогах и группировках, его нужно оформить как ресурс и задать выражение расчёта итога явно, иначе СКД по умолчанию просуммирует проценты по строкам, что даст бессмысленное число.
В ресурсах доступна функция ВычислитьВыражение(), а для расчёта доли от итога по группировке — процент от общего итога через выражение с указанием группировки. В пользовательском режиме типовых отчётов (например, «Анализ продаж») доля в процентах часто уже есть среди предустановленных показателей — проверьте настройки полей, прежде чем дорабатывать отчёт.
Где считать процент
Подходит для детальных строк и простых отчётов; ограничение — итоги по группировкам посчитаются суммой процентов
Гибко для строк, легко менять без правки запроса; те же проблемы с итогами
Правильный пересчёт в группировках и общих итогах; требует аккуратного выражения и проверки на ноль
Типовые прикладные сценарии
Скидки и наценки
Скидка считается от базовой цены: ЦенаСоСкидкой = Цена (100 - ПроцентСкидки) / 100. Наценка — наоборот: ЦенаПродажи = Себестоимость (100 + ПроцентНаценки) / 100. В типовых конфигурациях (УТ, ERP, Розница) скидки обычно рассчитываются механизмом скидок и наценок, и вмешиваться в формулы вручную не нужно — достаточно правильно задать процент в карточке скидки.
НДС
Выделение НДС из суммы «в том числе НДС» и начисление сверху — разные формулы, их часто путают. Для ставки 20%: начисление — Сумма 20 / 100, выделение — Сумма 20 / 120. В типовых конфигурациях расчёт НДС выполняется типовыми процедурами, и самостоятельно считать его кодом не рекомендуется — используйте штатные механизмы учёта НДС, чтобы не разойтись с декларацией.
Процент выполнения плана и доли
Доля строки в итоге: ЗначениеСтроки * 100 / ИтогПоКолонке. При выгрузке в Excel или печать помните: если округлить каждую долю до целых, сумма процентов может дать 99 или 101. Это нормальное следствие округления; если требуется ровно 100%, применяют метод наибольшего остатка или корректируют самую крупную строку.
- 1Определите базис: от чего считается процент (итог отчёта, план, прошлый период)
- 2Решите, где считать: запрос, вычисляемое поле или ресурс СКД
- 3Добавьте защиту от деления на ноль и обработку NULL
- 4Задайте точность через ВЫРАЗИТЬ или Окр и формат поля с знаком %
- 5Проверьте итоги: процент в группировках должен пересчитываться, а не суммироваться
Проверка результата и форматирование
После внедрения расчёта проверьте его на контрольных примерах с известным ответом: половина должна дать 50%, удвоение — 200%, нулевой базис — предусмотренное значение без ошибки. Особое внимание уделите строкам с NULL и итогам по группировкам.
Для отображения задайте формат поля: в форматной строке можно указать число знаков и символ процента, например Формат(Процент, "ЧДЦ=2") + " %" или настройку формата поля в СКД. Помните, что хранить значение лучше как число (50,25), а знак процента добавлять только при выводе — иначе сортировка и дальнейшие вычисления по полю сломаются.
Как проверить результат
Получено 25%
0, 0,25 или 2500 — ошибка в порядке операций или типах
Показан 0 или прочерк по правилам отчёта
Ошибка деления на ноль или пустое значение
Процент пересчитан от итогов группы
Проценты по строкам просуммированы
Около 100% с погрешностью округления
Сильное расхождение — округлены промежуточные значения
Часто задаваемые вопросы
Почему в запросе процент получается нулём?
Чаще всего из-за целочисленного деления: если оба поля целые, результат дроби отбрасывается. Приведите выражение к дробному типу через ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) или умножьте числитель на 100 до деления и задайте разрядность поля.
Как показать прочерк вместо процента при нулевом базисе?
В запросе верните NULL в ветке ВЫБОР при нулевом делителе — в отчёте NULL отображается пустотой. В СКД можно дополнительно настроить формат поля или оформление, чтобы пустое значение выводилось как «—».
Чем выделение НДС отличается от начисления?
Начисление считается от суммы без налога: Сумма × Ставка / 100. Выделение — от суммы, уже включающей налог: Сумма × Ставка / (100 + Ставка). Подстановка не той формулы систематически искажает сумму налога.
Можно ли посчитать процент в пользовательском режиме без доработки?
Да, если в типовом отчёте есть нужный показатель или доступен вариант «доля в процентах» в настройках полей. В простых случаях помогает встроенный калькулятор, вызываемый в числовых полях. Если показателя нет — потребуется доработка отчёта или внешняя обработка.
Почему сумма процентов по строкам не равна 100?
Это следствие округления каждой доли по отдельности. Варианты решения: увеличить точность до 2–4 знаков, показать в подвале формулировку о погрешности округления либо применить метод наибольшего остатка, распределяющий разницу на крупнейшие строки.
Где хранить процент: в процентах или в долях единицы?
Однозначного стандарта нет, но в 1С принято хранить как число процентов (15, а не 0,15) — так значения читаемы в формах и отчётах без дополнительного форматирования. Главное — единообразие: смешение подходов в одной базе приводит к ошибкам в сто раз.
Что важно запомнить
Процент в 1С считается формулой Часть × 100 / Целое с обязательной проверкой делителя на ноль. В запросах приводите результат к дробному типу через ВЫРАЗИТЬ, в СКД для корректных итогов используйте ресурсы с выражением расчёта. Храните процент как число, округляйте только финальный результат и проверяйте расчёт на контрольных примерах.