Вычитание процентов от суммы — одна из самых частых операций в 1С:Предприятие, которую выполняют и бухгалтеры при расчете скидок/налогов, и программисты при написании отчетов, и менеджеры при работе с прайс-листами. Казалось бы, что может быть проще: взять сумму, умножить на процент, вычесть результат. Но в 1С эта задача имеет десятки нюансов: от округления копеек до особенностей работы с отрицательными числами в разных конфигурациях.
В этой статье мы разберем 5 рабочих способов вычитания процентов — от ручного ввода формул в отчетах до автоматизации через встроенный язык. Особое внимание уделим типичным ошибкам, из-за которых результаты получаются некорректными (например, когда процент вычитается не от той суммы или округление искажает итог). А для программистов приведём готовые кодовые конструкции, которые можно сразу вставить в свои обработки.
Если вы работаете с 1С:Бухгалтерия 8.3, 1С:Управление торговлей или 1С:Зарплата и управление персоналом — здесь найдете решение под свою задачу. Для новичков объясним базовые принципы, для опытных пользователей — раскроем тонкости работы с ЧислоПрописью(), Окр() и другими функциями.
1. Вычитание процентов вручную: формулы для отчетов и документов
Самый простой способ — использовать встроенные формулы в отчетах или полях документов. Например, если нужно уменьшить цену товара на 10%, достаточно ввести выражение прямо в ячейку табличной части.
Рассмотрим на примере документа Реализация товаров и услуг в 1С:Управление торговлей 11:
- Откройте документ и перейдите в табличную часть
Товары. - Добавьте новый реквизит (колонку) с типом
Числои названием "Цена со скидкой". - В формуле для этого реквизита укажите:
Цена * (1 - Скидка / 100) - Где
Цена— базовая цена товара, аСкидка— процент скидки (например, 10).
Важно: если скидка уже указана в документе как сумма (а не процент), формула будет другой:
Цена - СуммаСкидки
Для отчетов (например, Оборотно-сальдовая ведомость) можно использовать аналогичный подход в настройках группировок. Добавьте вычисляемое поле с формулой:
Сумма * (1 - 5 / 100)
где 5 — это процент, который нужно вычесть.
Если в отчете требуется вычесть процент от итоговой суммы по группе, используйте функцию Итог() в формуле:
Итог(Сумма) * (1 - Процент / 100)2. Автоматическое вычитание процентов через обработки
Если вычитание процентов нужно выполнять регулярно (например, при проведении документов), лучше автоматизировать процесс через внешние обработки или дополнительные реквизиты. Это избавит от ручного ввода и снизит риск ошибок.
Создадим простую обработку для массового применения скидки 15% ко всем строкам документа:
- Откройте
Конфигуратори создайте новую обработку (Файл → Новый → Обработка). - Добавьте на форму кнопку "Применить скидку" и поле для ввода процента.
- В модуле обработки разместите код:
Процедура ПрименитьСкидку(Процент)Для Каждого Строка Из ДокументОбъект.Товары Цикл
Строка.Цена = Строка.Цена * (1 - Процент / 100);
КонецЦикла;
КонецПроцедуры
- Привяжите обработку к документу через
Дополнительные отчеты и обработки.
Для бухгалтерских задач (например, вычет НДС 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С сталкиваются с ошибками при вычитании процентов. Вот самые распространённые проблемы и их решения:
Ошибка 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С вычитание процентов реализовано по-разному. Рассмотрим особенности для популярных решений.
| Конфигурация | Где применяется вычитание процентов | Особенности реализации | Типичные документы |
|---|---|---|---|
| 1С:Бухгалтерия 8.3 | Расчет НДС, скидок, удержаний из зарплаты | Используются регистры накопления. Проценты часто вычитаются через механизм Плановые начисления. |
Счет-фактура, Начисление зарплаты |
| 1С:Управление торговлей 11 | Скидки, наценки, бонусы | Проценты вычитаются через Виды скидок (настраиваются в справочнике). Поддерживаются многоуровневые скидки. |
Заказ покупателя, Реализация товаров |
| 1С:Зарплата и Управление Персоналом | Удержания, премии, налоги | Проценты вычитаются через Виды расчета. Важно учитывать базу для начисления (оклад, МРОТ и т.д.). |
Начисление зарплаты, Удержания из зарплаты |
| 1С:Розница | Скидки по картам лояльности, акции | Проценты вычитаются автоматически при пробитии чека. Настройки скидок хранятся в справочнике Маркетинговые мероприятия. |
Чек ККМ, Заказ розничного покупателя |
Для 1С:Бухгалтерия Например, при вычете НДС 20% от суммы сделки необходимо формировать соответствующие проводки по дебету 68.02 и кредиту 19.03.
В 1С:Управление торговлей проценты обычно вычитаются через механизм скидок, который настраивается в справочнике Виды скидок. Здесь можно задавать:
- 📌 Пороговые скидки (например, "при сумме заказа от 5000 руб. — скидка 5%").
- 📌 Накопительные скидки (по карте лояльности).
- 📌 Персональные скидки для конкретных контрагентов.
В 1С:Зарплата вычитание процентов чаще всего связано с удержаниями (например, алименты, профсоюзные взносы). Здесь процент вычитается от базы, которая может зависеть от МРОТ, оклада или других начислений.
В 1С:УТ 11 скидки можно применять не только к ценам, но и к сумме документа. Для этого в настройках вида скидки выберите параметр "Применять к сумме документа" вместо "Применять к строкам".
7. Вычитание процентов в отчетах: СКД и компоновщик данных
В системе компоновки данных (СКД) вычитание процентов реализуется через вычисляемые поля. Это удобно для создания динамических отчетов, где процент может задаваться пользователем.
Пример настройки вычисляемого поля в СКД:
- Откройте схему компоновки данных отчета (например,
Анализ продаж). - Перейдите на закладку
Настройки→Вычисляемые поля. - Добавьте новое поле с выражением:
Выражение: Сумма * (1 - ВвестиПараметр("ПроцентСкидки") / 100)Тип: Число(15, 2)
- Создайте параметр
ПроцентСкидкис типомЧислои укажите его значение по умолчанию (например, 10).
Для отчетов с иерархической структурой (например, по группам номенклатуры) можно вычитать проценты от итогов по группе. Для этого:
- В настройках группировки добавьте вычисляемое поле.
- Используйте функцию
Итог():Итог(Сумма, Группа) * (1 - 5 / 100) - Укажите, что поле должно рассчитываться
По группировке.
Если в отчете нужно показать исходную сумму, процент скидки и итоговую сумму, добавьте три вычисляемых поля:
- 📊
СуммаБезСкидки— исходная сумма. - 📊
ПроцентСкидки— значение процента (можно сделать параметром). - 📊
СуммаСоСкидкой— результат вычитания.
Как передать процент в отчет из формы?
Чтобы пользователь мог вводить процент прямо в форме отчета, создайте параметр компоновки данных с типом Число и свяжите его с полем ввода на форме. Затем используйте этот параметр в вычисляемых полях.
8. Автоматизация вычитания процентов через регламентные задания
Если вычитание процентов нужно выполнять регулярно (например, ежемесячное списание 5% от остатков на счетах), удобно использовать регламентные задания. Это избавит от ручного запуска обработок.
Пример настройки регламентного задания для списания процентов:
- Откройте
Администрирование → Регламентные задания. - Создайте новое задание с типом
Выполнение обработки. - Укажите обработку, которая выполняет вычитание процентов (см. раздел 3).
- Настройте расписание (например,
Ежемесячно, 1-е число в 23:00). - В параметрах обработки передайте необходимые данные (например, процент для списания).
Для бухгалтерских задач (например, начисление пеней по просроченным платежам) регламентное задание может выглядеть так:
Процедура ВыполнитьСписаниеПроцентов(Процент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка КАК Договор,
| СУММА(ДоговорыКонтрагентов.СуммаДолга) КАК СуммаДолга
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаОтчета,) КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.СуммаДолга > 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?
Это связано с особенностями хранения чисел с плавающей запятой. Чтобы избежать погрешности:
- Используйте
Окр()для округления результата. - Проверьте настройки точности в конфигурации (например, в справочнике
Валюты). - Если работаете с денежными суммами, преобразуйте результат в тип
Число(15, 2).
Пример корректного кода:
Результат = Окр(1000 * 0.9, 2); // Вернет 900.00
Как вычесть процент от суммы в отчете "Анализ субконто"?
В отчете Анализ субконто вычитание процентов реализуется через настройки компоновки данных:
- Откройте настройки отчета и перейдите на закладку
Вычисляемые поля. - Добавьте новое поле с выражением:
СуммаОборот * (1 - 10 / 100)где
10— процент для вычитания. - Укажите тип поля
Число(15, 2). - Добавьте поле в структуру отчета на закладке
Группировки.
Можно ли вычесть процент от суммы в печатной форме документа?
Да, для этого нужно отредактировать макет печатной формы:
- Откройте документ (например,
Счет на оплату) и перейдите в режим редактирования печатной формы. - Добавьте новую ячейку в таблицу и укажите в ней формулу:
=Окр(СуммаДокумента * (1 - 5 / 100), 2)где
5— процент скидки. - Настройте формат ячейки как
Числос двумя знаками после запятой.
Если печатная форма на СКД, используйте вычисляемые поля (аналогично отчетам).
Как вычесть процент от суммы в мобильном приложении 1С?
В мобильном приложении 1С логика вычитания процентов такая же, как и в десктопной версии, но с учетом ограничений интерфейса:
- 📱 Для документов используйте те же формулы в полях (см. раздел 1).
- 📱 В отчетах настройки вычисляемых полей сохраняются, но могут быть ограничения по редактированию.
- 📱 Для сложных расчетов создайте обработку на сервере и вызывайте её через
ВыполнитьНаСервере().
Пример кода для мобильной обработки:
Процедура РассчитатьСкидкуНаСервере(Сумма, Процент) Экспорт
Возврат Окр(Сумма * (1 - Процент / 100), 2);
КонецПроцедуры