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

В этой статье мы разберем 5 рабочих способов вычитания процентов — от ручного ввода формул в отчетах до автоматизации через встроенный язык. Особое внимание уделим типичным ошибкам, из-за которых результаты получаются некорректными (например, когда процент вычитается не от той суммы или округление искажает итог). А для программистов приведём готовые кодовые конструкции, которые можно сразу вставить в свои обработки.

Если вы работаете с 1С:Бухгалтерия 8.3, 1С:Управление торговлей или 1С:Зарплата и управление персоналом — здесь найдете решение под свою задачу. Для новичков объясним базовые принципы, для опытных пользователей — раскроем тонкости работы с ЧислоПрописью(), Окр() и другими функциями.

📊 С какой конфигурацией 1С вы чаще работаете?
1С:Бухгалтерия
1С:Управление торговлей
1С:Зарплата и Управление Персоналом
1С:Розница
Другая конфигурация

1. Вычитание процентов вручную: формулы для отчетов и документов

Самый простой способ — использовать встроенные формулы в отчетах или полях документов. Например, если нужно уменьшить цену товара на 10%, достаточно ввести выражение прямо в ячейку табличной части.

Рассмотрим на примере документа Реализация товаров и услуг в 1С:Управление торговлей 11:

  1. Откройте документ и перейдите в табличную часть Товары.
  2. Добавьте новый реквизит (колонку) с типом Число и названием "Цена со скидкой".
  3. В формуле для этого реквизита укажите:
    Цена * (1 - Скидка / 100)
  4. Где Цена — базовая цена товара, а Скидка — процент скидки (например, 10).

Важно: если скидка уже указана в документе как сумма (а не процент), формула будет другой:

Цена - СуммаСкидки

Для отчетов (например, Оборотно-сальдовая ведомость) можно использовать аналогичный подход в настройках группировок. Добавьте вычисляемое поле с формулой:

Сумма * (1 - 5 / 100)

где 5 — это процент, который нужно вычесть.

💡

Если в отчете требуется вычесть процент от итоговой суммы по группе, используйте функцию Итог() в формуле:

Итог(Сумма) * (1 - Процент / 100)

2. Автоматическое вычитание процентов через обработки

Если вычитание процентов нужно выполнять регулярно (например, при проведении документов), лучше автоматизировать процесс через внешние обработки или дополнительные реквизиты. Это избавит от ручного ввода и снизит риск ошибок.

Создадим простую обработку для массового применения скидки 15% ко всем строкам документа:

  1. Откройте Конфигуратор и создайте новую обработку (Файл → Новый → Обработка).
  2. Добавьте на форму кнопку "Применить скидку" и поле для ввода процента.
  3. В модуле обработки разместите код:
    Процедура ПрименитьСкидку(Процент)
    

    Для Каждого Строка Из ДокументОбъект.Товары Цикл

    Строка.Цена = Строка.Цена * (1 - Процент / 100);

    КонецЦикла;

    КонецПроцедуры

  4. Привяжите обработку к документу через Дополнительные отчеты и обработки.

Для бухгалтерских задач (например, вычет НДС 20%) можно использовать аналогичный подход, но с учетом налоговых накладных и регистров. В этом случае обработка должна корректировать не только сумму, но и связанные проводки.

Что будет, если не округлить результат?

Если не использовать функцию Окр(), суммы в документах могут отличаться на копейки из-за особенностей хранения чисел с плавающей запятой. Например, 100 * 0.15 в 1С может дать результат 14.999999999999998 вместо 15.00.

3. Программное вычитание процентов на встроенном языке

Для гибких решений (например, динамических скидок в зависимости от суммы заказа) потребуется написать код на встроенном языке 1С. Ниже приведены готовые фрагменты для разных сценариев.

Пример 1: Вычитание фиксированного процента из суммы

Функция ВычестьПроцент(Сумма, Процент)

Возврат Окр(Сумма * (1 - Процент / 100), 2);

КонецФункции

Функция Окр() округляет результат до 2 знаков после запятой (копеек).

Пример 2: Вычитание процента с проверкой на отрицательное значение

Функция БезопасноеВычитаниеПроцента(Сумма, Процент)

Если Сумма < 0 Тогда

Возврат 0; // или выбросить исключение

КонецЕсли;

Результат = Сумма * (1 - Процент / 100);

Возврат Окр(Результат, 2);

КонецФункции

Пример 3: Вычитание процента с учетом НДС

Функция ВычестьПроцентСНДС(СуммаСНДС, Процент, СтавкаНДС = 20)

СуммаБезНДС = Окр(СуммаСНДС / (1 + СтавкаНДС / 100), 2);

СуммаСоСкидкой = СуммаБезНДС * (1 - Процент / 100);

Возврат Окр(СуммаСоСкидкой * (1 + СтавкаНДС / 100), 2);

КонецФункции

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

- Указан ли процент как число (10) или как доля (0.10)?

- Есть ли округление до копеек (Окр(.., 2))?

- Учтена ли ставка НДС, если работаете с ценами "с НДС"?

- Добавлена ли обработка отрицательных сумм?

-->

4. Вычитание процентов в запросах 1С

Если нужно вычесть проценты непосредственно в запросе 1С, используйте конструкцию ВЫБРАТЬ с арифметическими операциями. Это удобно для отчетов, где данные формируются динамически.

Пример запроса для вычета 10% от суммы продаж:

ВЫБРАТЬ

РеализацияТоваровУслуг.Контрагент КАК Контрагент,

СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаБезСкидки,

СУММА(РеализацияТоваровУслуг.СуммаДокумента) * 0.9 КАК СуммаСоСкидкой

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО

РеализацияТоваровУслуг.Контрагент

Для более сложных расчетов (например, прогрессивные скидки) используйте ВЫБОР КОГДА:

ВЫБРАТЬ

Товар,

СУММА(Количество * Цена) КАК Сумма,

ВЫБОР

КОГДА СУММА(Количество * Цена) > 10000

ТОГДА СУММА(Количество Цена) 0.85 // скидка 15% для заказов > 10 000

ИНАЧЕ СУММА(Количество Цена) 0.95 // скидка 5% для остальных

КОНЕЦ КАК СуммаСоСкидкой

ИЗ

Документ.ЗаказПокупателя.Товары КАК Товары

ГДЕ

Товары.Ссылка = &СсылкаНаДокумент

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

💡

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

5. Типичные ошибки и как их избежать

Даже опытные пользователи сталкиваются с ошибками при вычитании процентов. Вот самые распространённые проблемы и их решения:

Ошибка 1: Вычитание процента от неправильной базы

Пример: В документе указана цена 1000 руб. и скидка 10%, но вычитается процент от суммы 1000 + НДС вместо базовой цены.

Решение: Всегда уточняйте, от какой суммы вычитается процент — от цены без НДС или с НДС. Используйте функцию ЦенаБезНДС(), если нужно работать с "чистой" суммой.

Ошибка 2: Игнорирование округления

Пример: Результат 100 * 0.15 = 14.999999999999998 отображается как 15.00 в интерфейсе, но в проводках фиксируется с погрешностью.

Решение: Всегда применяйте Окр(Результат, 2) для финансовых расчетов.

Ошибка 3: Работа с отрицательными суммами

Пример: При вычитании 10% от -1000 получается -1100 вместо ожидаемого -900 (если логика подразумевает уменьшение модуля суммы).

Решение: Добавляйте проверку знака:

Если Сумма < 0 Тогда

Результат = Сумма * (1 + Процент / 100); // для отрицательных увеличиваем модуль

Иначе

Результат = Сумма * (1 - Процент / 100);

КонецЕсли;

Ошибка 4: Неучтенные настройки округления в конфигурации

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

Решение: Проверьте настройки округления в справочнике Типы цен номенклатуры и приведите их в соответствие с логикой расчетов.

💡

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

6. Вычитание процентов в типовых конфигурациях

В разных конфигурациях вычитание процентов реализовано по-разному. Рассмотрим особенности для популярных решений.

Конфигурация Где применяется вычитание процентов Особенности реализации Типичные документы
1С:Бухгалтерия 8.3 Расчет НДС, скидок, удержаний из зарплаты Используются регистры накопления. Проценты часто вычитаются через механизм Плановые начисления. Счет-фактура, Начисление зарплаты
1С:Управление торговлей 11 Скидки, наценки, бонусы Проценты вычитаются через Виды скидок (настраиваются в справочнике). Поддерживаются многоуровневые скидки. Заказ покупателя, Реализация товаров
1С:Зарплата и Управление Персоналом Удержания, премии, налоги Проценты вычитаются через Виды расчета. Важно учитывать базу для начисления (оклад, МРОТ и т.д.). Начисление зарплаты, Удержания из зарплаты
1С:Розница Скидки по картам лояльности, акции Проценты вычитаются автоматически при пробитии чека. Настройки скидок хранятся в справочнике Маркетинговые мероприятия. Чек ККМ, Заказ розничного покупателя

Для 1С:Бухгалтерия Например, при вычете НДС 20% от суммы сделки необходимо формировать соответствующие проводки по дебету 68.02 и кредиту 19.03.

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

  • 📌 Пороговые скидки (например, "при сумме заказа от 5000 руб. — скидка 5%").
  • 📌 Накопительные скидки (по карте лояльности).
  • 📌 Персональные скидки для конкретных контрагентов.

В 1С:Зарплата вычитание процентов чаще всего связано с удержаниями (например, алименты, профсоюзные взносы). Здесь процент вычитается от базы, которая может зависеть от МРОТ, оклада или других начислений.

💡

В 1С:УТ 11 скидки можно применять не только к ценам, но и к сумме документа. Для этого в настройках вида скидки выберите параметр "Применять к сумме документа" вместо "Применять к строкам".

7. Вычитание процентов в отчетах: СКД и компоновщик данных

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

Пример настройки вычисляемого поля в СКД:

  1. Откройте схему компоновки данных отчета (например, Анализ продаж).
  2. Перейдите на закладку НастройкиВычисляемые поля.
  3. Добавьте новое поле с выражением:
    Выражение: Сумма * (1 - ВвестиПараметр("ПроцентСкидки") / 100)
    

    Тип: Число(15, 2)

  4. Создайте параметр ПроцентСкидки с типом Число и укажите его значение по умолчанию (например, 10).

Для отчетов с иерархической структурой (например, по группам номенклатуры) можно вычитать проценты от итогов по группе. Для этого:

  1. В настройках группировки добавьте вычисляемое поле.
  2. Используйте функцию Итог():
    Итог(Сумма, Группа) * (1 - 5 / 100)
  3. Укажите, что поле должно рассчитываться По группировке.

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

  • 📊 СуммаБезСкидки — исходная сумма.
  • 📊 ПроцентСкидки — значение процента (можно сделать параметром).
  • 📊 СуммаСоСкидкой — результат вычитания.
Как передать процент в отчет из формы?

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

8. Автоматизация вычитания процентов через регламентные задания

Если вычитание процентов нужно выполнять регулярно (например, ежемесячное списание 5% от остатков на счетах), удобно использовать регламентные задания. Это избавит от ручного запуска обработок.

Пример настройки регламентного задания для списания процентов:

  1. Откройте Администрирование → Регламентные задания.
  2. Создайте новое задание с типом Выполнение обработки.
  3. Укажите обработку, которая выполняет вычитание процентов (см. раздел 3).
  4. Настройте расписание (например, Ежемесячно, 1-е число в 23:00).
  5. В параметрах обработки передайте необходимые данные (например, процент для списания).

Для бухгалтерских задач (например, начисление пеней по просроченным платежам) регламентное задание может выглядеть так:

Процедура ВыполнитьСписаниеПроцентов(Процент)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДоговорыКонтрагентов.Ссылка КАК Договор,

| СУММА(ДоговорыКонтрагентов.СуммаДолга) КАК СуммаДолга

|ИЗ

| РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаОтчета,) КАК ДоговорыКонтрагентов

|ГДЕ

| ДоговорыКонтрагентов.СуммаДолга > 0";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

СуммаКСписанию = Окр(Выборка.СуммаДолга * (Процент / 100), 2);

// Здесь код для создания документа списания

КонецЦикла;

КонецПроцедуры

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

💡

Регламентные задания в 1С выполняются в фоне и не блокируют работу пользователей. Однако при ошибках в коде они могут "зависнуть" и тормозить базу. Всегда тестируйте обработки перед добавлением в регламент!

⚠️ Внимание: Настройки регламентных заданий могут отличаться в зависимости от версии платформы 1С:Предприятие. В 1С 8.3.20+ появилась возможность приостанавливать и возобновлять задания без перезапуска сервера.

FAQ: Частые вопросы по вычитанию процентов в 1С

Как вычесть процент от суммы с учетом округления до рублей (без копеек)?

Используйте функцию Окр() с параметром 0:

СуммаСоСкидкой = Окр(ИсходнаяСумма * (1 - Процент / 100), 0);

Если нужно округление до рублей по правилам математики (50 копеек и выше — в большую сторону), используйте:

СуммаСоСкидкой = Окр(ИсходнаяСумма * (1 - Процент / 100) + 0.5, 0);
Почему при вычитании 10% от 1000 получается 899.99 вместо 900?

Это связано с особенностями хранения чисел с плавающей запятой. Чтобы избежать погрешности:

  1. Используйте Окр() для округления результата.
  2. Проверьте настройки точности в конфигурации (например, в справочнике Валюты).
  3. Если работаете с денежными суммами, преобразуйте результат в тип Число(15, 2).

Пример корректного кода:

Результат = Окр(1000 * 0.9, 2); // Вернет 900.00
Как вычесть процент от суммы в отчете "Анализ субконто"?

В отчете Анализ субконто вычитание процентов реализуется через настройки компоновки данных:

  1. Откройте настройки отчета и перейдите на закладку Вычисляемые поля.
  2. Добавьте новое поле с выражением:
    СуммаОборот * (1 - 10 / 100)

    где 10 — процент для вычитания.

  3. Укажите тип поля Число(15, 2).
  4. Добавьте поле в структуру отчета на закладке Группировки.
Можно ли вычесть процент от суммы в печатной форме документа?

Да, для этого нужно отредактировать макет печатной формы:

  1. Откройте документ (например, Счет на оплату) и перейдите в режим редактирования печатной формы.
  2. Добавьте новую ячейку в таблицу и укажите в ней формулу:
    =Окр(СуммаДокумента * (1 - 5 / 100), 2)

    где 5 — процент скидки.

  3. Настройте формат ячейки как Число с двумя знаками после запятой.

Если печатная форма на СКД, используйте вычисляемые поля (аналогично отчетам).

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

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

  • 📱 Для документов используйте те же формулы в полях (см. раздел 1).
  • 📱 В отчетах настройки вычисляемых полей сохраняются, но могут быть ограничения по редактированию.
  • 📱 Для сложных расчетов создайте обработку на сервере и вызывайте её через ВыполнитьНаСервере().

Пример кода для мобильной обработки:

Процедура РассчитатьСкидкуНаСервере(Сумма, Процент) Экспорт

Возврат Окр(Сумма * (1 - Процент / 100), 2);

КонецПроцедуры