Как в 1С:Розница исключить начисление бонусов на часть покупки, оплаченную бонусными баллами?

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

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

Рассмотрим конкретный пример: товар стоит 100 рублей. Покупатель списывает со своей карты 30 бонусов, а оставшиеся 70 рублей доплачивает наличными. Согласно логике программы лояльности со ставкой 35%, клиенту должно вернуться 35% от внесенных реальных денег (то есть 24,5 рубля), либо начисление должно быть заблокировано вовсе. Однако по умолчанию система производит расчет со всех 100 рублей и начисляет клиенту 35 рублей. Разберем архитектурные причины такого поведения и способы устранения проблемы.

Выясним причину поведения типовой конфигурации

Проанализируем структуру работы подсистемы лояльности в 1С:Розница 2.2. В конфигурации расчет скидок и оформление оплат жестко разделены по этапам:

  1. Расчет скидок и начислений: Начисление бонусных баллов реализовано через подсистему автоматических скидок и наценок. Расчет бонусов производится построчно по табличной части Товары на основе конечной цены позиции после применения всех прямых скидок.
  2. Ввод оплат: Оплата бонусными баллами вводится кассиром позже — в форме оплаты чека как отдельный финансовый инструмент наряду с наличными и эквайрингом. Механизм автоматических скидок в момент расчета строк не знает, какая конкретно строка чека и в какой пропорции будет закрыта бонусами, а какая деньгами.
  3. Ограниченность типовой логики: В параметрах программы лояльности переключатель «При оплате позиций бонусными баллами» поддерживает только крайние состояния — либо полностью начислять бонусы по чеку, либо начислять 0 при факте списания. Промежуточный вариант («начислять только на доплату деньгами») в типовой структуре документов отсутствует.

Кроме того, в некоторых релизах проявляется ошибка пересчета: если дисконтная карта считана в чек до набора корзины, или у пользователя активно право Автоматический расчет скидок при редактировании документа продажи, начисленные бонусы фиксируются в чеке и не сбрасываются даже при наличии запрещающей настройки после добавления оплаты баллами.

Способ 1. Настройка отложенного начисления через СКД по расписанию

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

  1. Открываем справочник Правила расчета бонусных баллов.
  2. В поле способа расчета выбираем вариант Схема компоновки данных - Произвольный.
  3. Формируем схему компоновки данных (СКД), обращаясь к данным закрытых чеков (документы ЧекККМ или регистры накопления продаж и оплат).
  4. В тексте запроса рассчитываем базу начисления не по общей стоимости проданных товаров, а по суммам реальных платежей — отбираем только движения с типами оплаты Наличные и Платежная карта, исключая оплату бонусными баллами.
  5. Настраиваем регламентное задание, которое будет создавать документ Начисление бонусных баллов по расписанию (например, раз в сутки в ночное время).

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

Способ 2. Корректировка базы начисления через расширение конфигурации

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

Рассмотрим алгоритм доработки:

  1. Создаем расширение конфигурации и перехватываем процедуру проведения или пост-расчета документа ЧекККМ (после распределения всех оплат).
  2. Проверяем наличие в чеке строки с видом оплаты Оплата бонусными баллами.
  3. Если оплата бонусами присутствует, рассчитываем коэффициент доплаты реальными деньгами: отношение суммы оплаты (наличные + карта) к общей сумме чека.
  4. Пропорционально уменьшаем начисленные баллы в табличной части чека НачисленныеБонусныеБаллы либо уменьшаем сумму начисления в движениях регистра накопления БонусныеБаллыКСписанию / БонусныеБаллыКНачислению.

Способ 3. Предотвращение зависания бонусов при вводе чека кассиром

Если в вашей программе уже активирован запрет начисления баллов при оплате бонусами, но программа все равно их начисляет, проанализируем настройки прав кассира. Некорректный пересчет часто связан с оперативным расчетом строк.

  1. Переходим в раздел Администрирование → Пользователи и права → Дополнительные права пользователей.
  2. Находим профиль кассира и снимаем флаг Автоматический расчет скидок при редактировании документа продажи.
  3. При такой настройке расчет скидок и бонусов не будет выполняться на лету при добавлении каждой позиции. Он будет вызываться строго по кнопке кассира или при переходе к окну оплаты, когда состав оплат уже определен, что исключит зависание некорректных начислений.
  4. Проверяем версию конфигурации и выполняем обновление до актуального релиза ветки 2.2 или 2.3, так как в ранних версиях содержались платформенные ошибки очистки табличной части начислений.
← На главную