Разработка и Конфигурация · 9 мин
Что означает процент в языке 1С
Что означает процент в языке 1С: как хранить и считать проценты, форматировать вывод, округлять результат и избегать типичных ошибок в коде и отчётах.
В языке 1С нет отдельного типа данных «процент». Под процентом разработчики и пользователи обычно понимают числовое значение, которое хранится как обычное число (тип Число) и интерпретируется как доля от ста: ставка НДС, процент скидки, процент выполнения плана, процент оплаты по заказу. Вся логика работы с процентами строится на арифметике с этими числами и на правилах их отображения.
Из-за отсутствия специального типа возникает главная путаница: одно и то же значение может храниться как 20 (двадцать процентов) или как 0,2 (доля от единицы). От выбранного соглашения зависят все формулы в конфигурации, и смешение двух подходов — самая частая причина ошибок в расчётах скидок, налогов и комиссий.
Ниже разобрано, как процент хранится в типовых конфигурациях, как правильно считать сумму по проценту и процент от суммы, как выводить значение пользователю и как проверить корректность результата.
Как процент представлен в языке 1С
Встроенный язык 1С поддерживает числовой тип с фиксированной точностью: указываются общая длина числа и количество знаков после запятой. Реквизит «ПроцентСкидки» с точностью (5,2) может хранить значения от 0,00 до 999,99, что с запасом покрывает любые скидки и наценки. Специального модификатора «процент» у числового типа нет.
В типовых конфигурациях (Управление торговлей, ERP, Бухгалтерия) проценты почти всегда хранятся в диапазоне 0–100: ставка НДС 20, скидка 15, процент предоплаты 30. Реже встречается хранение долей (0,2), например в некоторых механизмах распределения. Перед использованием реквизита стоит посмотреть его назначение в конфигураторе или в формуле, где он применяется.
Базовые формулы расчёта с процентами
Три типовые задачи встречаются в большинстве доработок: найти сумму по проценту, найти процент от суммы и вычислить итог с учётом процента (наценка или скидка). Все они решаются простой арифметикой, если помнить, что процент делится на 100.
// Сумма по проценту (например, сумма скидки)
СуммаСкидки = СуммаДокумента * ПроцентСкидки / 100;
// Итог со скидкой
ИтогСоСкидкой = СуммаДокумента * (100 - ПроцентСкидки) / 100;
// Процент от суммы (например, доля оплаты)
ПроцентОплаты = СуммаОплаты / СуммаЗаказа * 100;
Порядок операций важен: сначала умножение, потом деление на 100. Если разделить первым (ПроцентСкидки / 100 * СуммаДокумента), результат тот же, но при очень малых промежуточных значениях и жёсткой точности реквизита возможна потеря разрядов. Проверять результат удобно на круглых числах: 10% от 2000 должно дать 200.
Округление результата и функция Окр()
Денежные суммы в 1С принято хранить с точностью до копеек — два знака после запятой. Умножение на процент почти всегда даёт больше разрядов, поэтому результат нужно явно округлять функцией Окр(). Если этого не сделать, в документе появятся значения вида 1234,567, которые не пройдут проверку заполнения или «поплывут» при проведении.
СуммаСкидки = Окр(СуммаДокумента * ПроцентСкидки / 100, 2);
Второй параметр Окр() задаёт число знаков, третий (необязательный) — режим округления: по умолчанию используется математическое округление (0,5 вверх). Важно округлять итоговую сумму, а не каждый процент по строкам, иначе сумма скидок по строкам может не сойтись со скидкой по документу на копейку. В типовых механизмах скидок эта разница специально распределяется по строкам.
Вывод процента пользователю: форматная строка
Чтобы число выглядело как процент в отчёте, печатной форме или сообщении, используется функция Формат() с форматной строкой. Само число при этом не меняется — меняется только его представление.
СтрокаВывода = Формат(ПроцентСкидки, "ЧДЦ=2") + " %"; // "15,00 %"
Сообщить("Скидка: " + Формат(ПроцентСкидки, "ЧДЦ=1") + "%");
В макетах табличных документов формат задаётся в свойствах ячейки на закладке «Оформление» — это удобнее, чем собирать строку в коде. В отчётах на СКД формат поля настраивается на вкладке «Наборы данных» или в настройках поля, что позволяет выводить процент с нужным числом знаков без изменения запроса.
Процент в запросах и отчётах
В языке запросов 1С проценты считаются теми же арифметическими операциями. Типичный пример — доля продажи товара в общей выручке или процент выполнения плана. Здесь критична защита от деления на ноль: если знаменатель равен нулю, запрос вернёт ошибку или значение NULL.
ВЫБОР
КОГДА Продажи.СуммаОборот = 0 ТОГДА 0
ИНАЧЕ Продажи.СуммаОборот / Итоги.ОбщаяСумма * 100
КОНЕЦ КАК ПроцентДоли
В СКД вычисляемые поля позволяют считать процент уже после группировки — например, процент итога группы от общего итога через функцию ВычислитьВыражение. Это избавляет от ручного обхода результата запроса и корректно работает при любой фильтрации отчёта пользователем.
- 1Определите, в какой шкале хранятся исходные данные: 0–100 или доли 0–1
- 2Добавьте вычисляемое поле с формулой Числитель / Знаменатель * 100
- 3Защитите формулу от деления на ноль через ВЫБОР или ВЫРАЗИТЬ
- 4Настройте формат поля: число знаков после запятой и символ %
- 5Проверьте на тестовых данных: сумма долей по группе должна давать 100%
Типичные ошибки при работе с процентами
Большинство дефектов связано не с синтаксисом, а с нарушением договорённостей о представлении данных. Проверка этих пунктов занимает минуты, а экономит часы поиска расхождений.
Отдельная группа ошибок — изменение типовых механизмов. Например, в типовых конфигурациях процент скидки и сумма скидки могут быть взаимозависимыми: ручная правка одного поля пересчитывает другое. Доработка, которая записывает значения напрямую, минуя типовые процедуры пересчёта, ломает эту связь.
Как проверить результат
Сумма скидки 200,00, итог 1800,00
Скидка 20000 или 2,00 — перепутана шкала хранения
Итог по строкам равен итогу документа до копейки
Расхождение на копейки из-за округления каждой строки
Процент равен 0, ошибок нет
Ошибка деления на ноль или пустое значение в отчёте
Отображается «15,00 %»
Отображается «0,15» или «15 %» без контроля знаков
Как выбрать шкалу хранения для собственной доработки
Если вы добавляете новый реквизит процента в свою подсистему, ориентируйтесь на окружение: храните так же, как соседние механизмы конфигурации. В торговых и бухгалтерских решениях это почти всегда шкала 0–100 — пользователи привыкли вводить «20», а не «0,2», и формулы типовых объектов написаны под это соглашение.
Как выбрать действие
Хранение долей (0–1) оправдано только в расчётных ядрах, где процент сразу участвует в умножениях и деление на 100 засоряло бы формулы. Даже в этом случае на границах системы — ввод пользователя, печать, обмен — значение приводят к привычной шкале.
Что важно запомнить
Процент в 1С — обычное число, чаще всего в шкале 0–100. Сумма считается как Сумма * Процент / 100 с округлением через Окр(), вывод оформляется функцией Формат() или форматом ячейки. Главные риски — смешение шкал хранения, отсутствие округления и деление на ноль.
Частые вопросы
Есть ли в 1С отдельный тип данных «Процент»?
Нет. Процент хранится как число с заданной точностью. Смысл значения определяется названием реквизита, формулами и форматом вывода, а не типом данных.
Почему скидка 10% от 199,99 даёт неожиданный результат?
Потому что произведение содержит больше двух знаков после запятой. Без Окр() в документ попадает значение вида 19,999, которое затем округляется неявно и может дать расхождение с ожидаемой суммой. Всегда округляйте результат явно.
Как вывести процент без знаков после запятой?
Используйте Формат(Значение, "ЧДЦ=0") и добавьте символ % строкой, либо задайте формат в свойствах ячейки макета или поля отчёта СКД.
Как посчитать процент выполнения плана, если план равен нулю?
Проверяйте знаменатель до деления: через ВЫБОР в запросе или условие в коде. При нулевом плане принято возвращать 0 или NULL — в зависимости от того, как это должно выглядеть в отчёте.
Чем отличается процент в шапке документа от процента в строках?
Процент в строках применяется к сумме каждой строки, в шапке — к итогу документа. Из-за округления сумма построчных скидок может не совпасть со скидкой от итога; типовые механизмы распределяют эту разницу по строкам.
Можно ли вводить в поле процента значение больше 100?
Технически — да, если точность реквизита позволяет. Ограничение задаётся проверкой в коде или свойствами поля ввода. Для скидок значения выше 100 обычно запрещают, для наценок или роста показателя они допустимы.