Распределить общую скидку между позициями
Робот «Распределить общую скидку между позициями» распределяет переданную скидку по разрешённым позициям и проверяет точное сохранение итогов.

Видимая часть формы настройки в Битрикс24. Скриншот показывает поля действия; он не подтверждает выполнение учебного примера.
Для кого и какую задачу решает
Руководителю продаж и администратору, который распределяет согласованную общую скидку между разрешёнными позициями.
Скидку на весь заказ нужно разнести так, чтобы сумма копеек сохранилась, а исключённые товары не получили скидку. Робот использует подготовленные полные суммы строк и признак eligible. Он возвращает расчёт новых сумм без записи товарных строк.
Параметры и подготовка
| Поле | Как заполнить |
|---|---|
Единая валюта, код из трех латинских букв (CURRENCY) |
Обязательное поле |
Число дробных знаков: 0–6 (SCALE) |
Обязательное поле |
Политика распределения (ALLOCATION) |
Обязательное поле. Пропорционально весам, затем наибольшие остатки (largest_remainders) |
Равные остатки (TIE_BREAK) |
Обязательное поле. По возрастанию ID как строки (id_asc) |
Позиции JSON (LINES) |
Обязательное поле |
Тип скидки (DISCOUNT_KIND) |
Обязательное поле. Сумма (amount); Процент разрешенной базы (percent) |
Сумма скидки или процент (DISCOUNT) |
Обязательное поле |
Округление суммы из процента (ROUNDING) |
Необязательное поле. Только точная сумма (exact); Ближайшее, половина вверх (half_up); Вниз (down); Вверх (up) |
Перед настройкой выберите, откуда процесс получит каждое значение: постоянная настройка, поле карточки или результат предыдущего шага. Подписи в таблице соответствуют полям робота. Коды в скобках помогают различать похожие параметры при передаче данных между шагами.
Как использовать
- Передайте LINES с уникальными id, amount и currency. Amount означает уже рассчитанную полную сумму строки, а не цену одной единицы.
- Для исключённых позиций задайте eligible=false. По умолчанию строка разрешена; используйте именно JSON true/false.
- Выберите DISCOUNT_KIND amount или percent и задайте DISCOUNT. Для процента явно выберите ROUNDING; готовая денежная скидка должна точно соответствовать SCALE.
- Выберите largest_remainders и id_asc. После выполнения сверьте gross, eligibleBase, discount и net, затем отдельно согласуйте применение расчёта к товарам.
Как заполнить JSON-поля
Позиции JSON (LINES)
[
{
"id": "A",
"amount": "100.00",
"currency": "RUB",
"eligible": true
},
{
"id": "B",
"amount": "50.00",
"currency": "RUB",
"eligible": false
}
]
До 1000 позиций с уникальными id. amount полная сумма строки, currency обязателен. eligible необязательный JSON boolean, по умолчанию true. [] допустим при нулевой скидке.
Это массив: внешние квадратные скобки обязательны. Пустой массив [] отличается от объекта {}; возможность пустого списка определяется правилами этого поля, описанными ниже.
Учебный пример и ожидаемый результат
LINES=[{"id":"A","amount":"100.00","currency":"RUB","eligible":true},{"id":"B","amount":"50.00","currency":"RUB","eligible":false}]. CURRENCY=RUB, SCALE=2, DISCOUNT_KIND=amount, DISCOUNT=10.00, ALLOCATION=largest_remainders, TIE_BREAK=id_asc. Ожидается скидка 10.00 только для A, итог A 90.00, B 50.00, общий net 140.00.
Пример показывает подготовленные учебные данные. Фактический результат зависит от переданных значений и доступных данных вашего процесса.
Что возвращает и как продолжить процесс
- «Распределенная скидка и итог по строкам JSON» (
linesJson). - «Исходная сумма» (
gross). - «Разрешенная база» (
eligibleBase). - «Общая скидка» (
discount). - «Итог после скидки» (
net). - «Валюта» (
currency). - «Дробных знаков» (
scale).
linesJson содержит исходную сумму каждой строки, распределённую скидку и netAmount. Разрешённая база может быть меньше общей суммы заказа. Именно с ней сравнивается ограничение скидки; исключённые строки не расширяют базу.
Выход «Статус выполнения» проверяйте перед передачей результата дальше. При отрицательном статусе прочитайте «Пояснение ошибки» и направьте процесс на исправление исходных данных. Успешный статус подтверждает выполнение действия; содержательные признаки результата проверяйте отдельно.
Ограничения и разбор ошибок
LINES: [{"id":"A","amount":"100.00","currency":"RUB","eligible":true}]. amount: уже рассчитанная полная сумма строки; количество и налоги не выводятся автоматически. eligible по умолчанию true; false исключает строку из базы скидки и распределения. DISCOUNT_KIND=amount задает денежную сумму, percent: процент от разрешенной базы от 0 до 100. Для процента обязателен ROUNDING: exact/half_up/down/up; готовые суммы всегда должны точно соответствовать SCALE. Правила largest_remainders и id_asc выбираются явно; распределение пропорционально разрешенным суммам строк. Скидка не может превышать разрешенную базу; пустые строки и нулевая скидка дают валидный ноль. Возвращает новые суммы как расчет, не изменяя товары CRM. Денежные суммы неотрицательные, каждая меньше 10^24; до 36 значащих и 18 дробных цифр. Все строки обязаны содержать currency, совпадающую с выбранной. Код валюты проверяется по форме, не по внешнему справочнику. SCALE задается явно от 0 до 6; готовые денежные суммы должны точно соответствовать ему. До 1000 строк в каждом массиве; ID внутри массива: уникальная строка от 1 до 100 символов без крайних пробелов. Входные JSON и каждый строковый результат ограничены 1 МБ.
Процент задаётся от 0 до 100. Нельзя распределить скидку больше разрешённой базы. Количества, налоги и правила применимости скидки робот не выводит из товарных ID; они должны быть учтены до подготовки amount.