При работе с дисконтными программами и маркетинговыми акциями в розничной торговле нередко возникают ситуации, когда автоматические скидки рассчитываются системой не так, как ожидает пользователь или кассир. Типичный пример: покупатель предъявляет купоны на сумму 200 рублей для оплаты покупки стоимостью 441 рубль, однако программа уменьшает итоговую сумму чека не на 200 рублей, а только на 150 рублей. При этом кассир и администратор уверены, что итоговая цена товаров после скидки не опускается ниже минимальной розничной цены (МРЦ) на алкоголь.
В этой статье мы подробно разберем внутренние механизмы расчета скидок в программе «1С:Розница 2.2», выясним технические причины такого поведения системы и рассмотрим пошаговые сценарии решения этой проблемы.
---
Главная архитектурная особенность подсистемы ценообразования в решениях 1С заключается в том, что любая суммовая скидка, назначенная на весь документ (чек в целом), распределяется системой пропорционально стоимости каждой строки номенклатуры. Программа не может применить скидку к общему итогу без распределения её по конкретным позициям номенклатуры, так как каждая проданная единица товара должна иметь свою конечную цену для корректного учета выручки и себестоимости.
Проанализируем конкретный пример математики распределения:
200 * (250 / 441) = 113.38 рублей.200 * (191 / 441) = 86.62 рублей.На этом этапе в расчет вмешивается механизм контроля МРЦ (минимальной розничной цены) для алкогольной продукции. Контроль МРЦ в 1С всегда выполняется строго на уровне каждой отдельной строки (бутылки), а не по чеку в целом.
Предположим, что для данной водки МРЦ составляет 205 рублей. Это означает, что максимально допустимая скидка конкретно на эту бутылку составляет всего 250 - 205 = 45 рублей.
Когда система проводит окончательный расчет распределенной скидки:
113.38 - 45 = 68.38 рублей) не переносится на сопутствующий товар. Он просто аннулируется («сгорает»).45 + 86.62 = 131.62 рубль (в зависимости от соотношения цен товаров в чеке эта итоговая цифра может составить и 150 рублей, как в рассматриваемом случае).---
Помимо жестких законодательных ограничений (таких как МРЦ на алкоголь), на итоговый расчет скидки влияют внутренние настройки программы. В «1С:Розница» все скидки объединяются в дерево (группы совместного применения). Каждая группа имеет свой вариант совместного применения: «Минимум», «Максимум», «Сложение», «Вытеснение» или «Последовательное применение».
Рассмотрим подробнее настройки групп совместного применения:
---
Дополнительно ограничить размер скидки могут следующие настройки системы:
---
Рассмотрим несколько практических вариантов настройки программы «1С:Розница 2.2», чтобы рублевые скидки по купонам применялись корректно и в полном объеме.
Самый простой и надежный способ избежать коллизий с МРЦ — настроить скидку по купону таким образом, чтобы она вообще не распространялась на алкогольную продукцию. В этом случае вся сумма скидки (200 рублей) распределится на сопутствующие товары в чеке (если их стоимость позволяет списать эту сумму).
Разберем по шагам, как это сделать:
Выясним, нет ли скрытых лимитов в дереве скидок:
Если специфика бизнеса требует, чтобы покупатель мог оплачивать купонами любые товары (включая алкоголь до уровня МРЦ), и при этом сумма скидки не «сгорала», потребуется внести небольшие изменения в программный код распределения скидок. Это лучше всего сделать с помощью механизма расширений конфигурации, чтобы не снимать программу с поддержки.
Проанализируем пример логики, которую можно реализовать в расширении для изменения типового поведения системы:
// Фрагмент кода для перераспределения остатков скидки, урезанных по МРЦ
Процедура ПерераспределитьОстаткиСкидокПослеКонтроляМРЦ(ТаблицаТоваров, ОбщаяСуммаСкидки) Экспорт
ПерераспределеннаяСумма = 0;
СуммаКРаспределению = ОбщаяСуммаСкидки;
// Шаг 1. Первичное распределение и расчет ограничений по каждой строке
Для Каждого СтрокаТЧ Из ТаблицаТоваров Цикл
МаксСкидкаПоСтроке = СтрокаТЧ.Сумма - (СтрокаТЧ.Количество * СтрокаТЧ.Номенклатура.МинимальнаяРозничнаяЦена);
СтрокаТЧ.МаксимальнаяСкидка = МаксСкидкаПоСтроке;
КонецЦикла;
// Шаг 2. Распределение остатков на позиции без жестких ограничений
// Программист может написать цикл, который берет нераспределенный из-за МРЦ остаток
// и добавляет его к скидке на другие доступные товары в чеке (например, безалкогольные)
КонецПроцедуры
Использование такого алгоритма позволит гарантировать покупателю честное списание номинала купона, распределяя остатки скидки на разрешенные позиции номенклатуры без нарушения законодательства об обороте алкогольной продукции.