Как в 1С:Розница ограничить количество применений скидки по карте в день и задать предел суммы для расчета?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

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

Анализ стандартных возможностей подсистемы лояльности

Прежде чем приступать к доработке системы, проанализируем штатный функционал программы 1С:Розница (версии 2.2 и выше). В системе существует справочник СкидкиНаценки, который позволяет гибко настраивать условия лояльности. Однако стандартные условия, такие как «За накопленный объем продаж», работают по накопительному принципу за длительный период и чаще всего блокируют скидку полностью при достижении лимита, а не ограничивают базу ее расчета внутри одного чека.

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

Решение 1: Ограничение максимальной суммы скидки (Штатные средства)

В постановке задачи указано: «размер скидки 5%, предел суммы покупки для скидки 300 р.». Это означает, что даже если клиент совершит покупку на 1000 рублей, он должен получить скидку только с первых 300 рублей, то есть 15 рублей (300 * 0.05 = 15).

Для реализации этого условия выполним следующие действия:

  1. Перейдем в раздел Маркетинг — Скидки (наценки).
  2. Создадим новую скидку с типом Процент и установим значение 5%.
  3. На вкладке Главное найдем поле Максимальная сумма.
  4. Установим значение 15 рублей.

Рассмотрим, как это работает: программа рассчитает 5% от всей суммы чека, но итоговый результат «обрежет» до установленного лимита в 15 рублей. Это полностью закрывает вопрос ограничения «суммы до предела» без написания кода.

Решение 2: Ограничение количества применений в день (Произвольное условие)

Вторая часть задачи — предоставлять скидку «не чаще 2-х раз в день по одной карте» — штатно в 1С:Розница не реализована. Однако в программе предусмотрен механизм Произвольных условий, где мы можем написать фрагмент кода на языке 1С, который будет выполняться в момент расчета скидок в РМК (Рабочем месте кассира).

Разберем алгоритм создания такого условия:

  1. Откроем справочник Условия предоставления скидок.
  2. Создадим новый элемент и выберем тип условия Внешняя обработка или Произвольное условие (в зависимости от версии конфигурации).
  3. В поле кода нам необходимо реализовать запрос к регистру накопления Продажи или к документам ЧекККМ, чтобы посчитать количество транзакций по текущей карте за текущие сутки.

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


// Входные параметры: ТекущаяКарта, ДатаДокумента
// Результат: Булево (Истина - скидка применяется, Ложь - нет)

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Чеки.Ссылка) КАК КоличествоЧеков
    |ИЗ
    |	Документ.ЧекККМ КАК Чеки
    |ГДЕ
    |	Чеки.ДисконтнаяКарта = &ДисконтнаяКарта
    |	И Чеки.Дата МЕЖДУ &НачалоДня И &КонецДня
    |	И Чеки.Проведен = ИСТИНА
    |	И Чеки.СтатусЧЕКА <> ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Аннулированный)";

Запрос.УстановитьПараметр("ДисконтнаяКарта", Объект.ДисконтнаяКарта);
Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецДня", КонецДня(ТекущаяДата()));

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Если Выборка.КоличествоЧеков >= 2 Тогда
        Результат = Ложь; // Скидка не предоставляется
    Иначе
        Результат = Истина; // Скидка разрешена
    КонецЕсли;
КонецЕсли;

Важно учитывать, что обращение к базе данных из каждой строки чека может замедлить работу РМК. Поэтому рекомендуется кэшировать результат или использовать оптимизированные запросы к регистру Продажи.

Решение 3: Борьба с махинациями через анализ данных

Выясним причину, почему бизнес внедряет такие ограничения. Как правило, это связано с тем, что кассиры сканируют одну и ту же «социальную» или «народную» карту для каждого покупателя, забирая скидку себе или просто фиктивно занижая выручку. Ограничение в 2 раза в день делает эту схему невыгодной для массового использования.

Однако, как отмечают эксперты, жесткие блокировки могут вызвать негатив у реальных лояльных клиентов. В качестве альтернативы или дополнения рассмотрим создание контрольного отчета. Проанализируем ситуацию: если по одной карте за день пробито 50 чеков с интервалом в 2 минуты — это явный признак злоупотребления.

Для реализации контроля рекомендуем использовать отчет Продажи по дисконтным картам, добавив в него группировку по Дисконтной карте и Периоду (день), а также колонку Количество документов. Настройка «Варианта отчета» с фильтром Количество документов > 2 позволит службе безопасности магазина выявлять нарушителей без изменения программного кода.

Резюме и рекомендации

Подведем итоги нашего исследования. Для реализации задачи «Скидки до предела суммы не чаще 2-х раз в день» в 1С:Розница оптимальным будет следующий путь:

Рассмотренные методы позволяют гибко управлять лояльностью и защищать прибыль магазина от недобросовестных действий, сохраняя при этом работоспособность стандартной конфигурации 1С.

← На главную