При внедрении программ лояльности в 1С:Розница 2.2 и 2.3 многие сталкиваются с ситуацией, когда покупатель одновременно получает автоматическую или ручную скидку на товар и оплачивает остаток накопленными бонусными баллами. С точки зрения бизнеса это часто приводит к продаже ниже себестоимости. Попытка настроить группу совместного применения скидок Вытеснение не решает задачу: скидка все равно начисляется. Разберем, почему программа ведет себя именно так и какими способами можно реализовать жесткое правило: либо скидка, либо оплата бонусами.
Проанализируем внутреннее устройство документов продажи в 1С:Розница. В системе расчет скидок и процедура оплаты четко разнесены по разным этапам:
Товары еще до того, как кассир переходит к приему оплаты. Правила совместного применения (такие как Вытеснение, Максимум или Сложение) действуют исключительно внутри справочника Скидки (наценки, ограничения).Оплата чека с отдельным видом оплаты Бонусные баллы.Из-за такого разделения система не может при расчете скидок в строках корзины знать, какой именно вид оплаты выберет кассир на следующем шаге. Поэтому скидка рассчитывается всегда, даже если клиент собирается закрыть 100% чека баллами.
В настройках элемента справочника Бонусные программы лояльности предусмотрена опция Уменьшать сумму чека для скидок. Разберем, как она влияет на итоговый расчет:
Таким образом, флаг лишь уменьшает размер скидки, но не отменяет ее применение. Полного взаимоисключения эта настройка не дает.
Если требуется обойтись без доработки программного кода, рассмотрим комбинированную настройку маркетинга:
Бонусные программы лояльности.В конфигурации 1С:Розница поддерживается подключение внешних обработок в качестве условий и алгоритмов расчета скидок. В каталоге поставки конфигурации можно найти демонстрационную обработку СкидкаНаПроизвольныйКомплект.epf, которую удобно взять за основу.
В модуле объекта внешней обработки скидки реализуем проверку состава чека. При расчете скидки внешняя обработка обращается к текущим данным документа: если в чеке уже зафиксирована оплата бонусами, скидка возвращает нулевой размер. Однако следует учитывать, что при классическом сценарии кассир сначала нажимает кнопку расчета скидок, а только затем переходит к оплате, поэтому внешняя обработка должна быть синхронизирована с пересчетом строк при проведении документа.
Для создания полноценного сценария «или скидка, или списание бонусов» без снятия конфигурации с типовой поддержки создадим расширение (.cfe). Реализуем в нем перехват действий в форме ФормаРМКУправляемая.
Разберем логику доработки по шагам:
ОплатитьБонусами).Посмотрим на пример перехвата команды в расширении формы РМК:
&Вместо("ОплатитьБонусами")
Процедура Расш_ОплатитьБонусами()
// Проверяем наличие предоставленных скидок в корзине
ЕстьСкидки = Ложь;
Для Каждого СтрТовар Из Объект.Товары Цикл
Если СтрТовар.СуммаАвтоматическойСкидки > 0 Или СтрТовар.СуммаРучнойСкидки > 0 Тогда
ЕстьСкидки = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьСкидки Тогда
ТекстВопроса = "В чеке присутствуют скидки. Списание бонусов отменит все скидки в чеке. Продолжить?";
Оповещение = Новый ОписаниеОповещения("Расш_ПослеОтветаПоСкидкам", ЭтотОбъект);
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Возврат;
КонецЕсли;
ПродолжитьВызов();
КонецПроцедуры
Обязательно проанализируем обработчик пересчета чека. Если кассир после списания бонусов добавит в корзину новый товар, штатный механизм РассчитатьСкидки попытается снова начислить автоматические скидки. Чтобы этого не произошло, в процедуру расчета скидок добавляем проверку:
&Вместо("РассчитатьСкидки")
Процедура Расш_РассчитатьСкидки(ПараметрыРасчета)
// Если в таблице оплат уже присутствует оплата бонусами, блокируем начисление скидок
ОплатаБонусамиПрисутствует = Ложь;
Для Каждого СтрОплата Из Объект.Оплата Цикл
Если СтрОплата.ВидОплаты = ПредопределенноеЗначение("Справочник.ВидыОплатЧекаККМ.БонусныеБаллы") Тогда
ОплатаБонусамиПрисутствует = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ОплатаБонусамиПрисутствует Тогда
// Очищаем колонки со скидками во всех строках
Для Каждого СтрТовар Из Объект.Товары Цикл
СтрТовар.ПроцентАвтоматическойСкидки = 0;
СтрТовар.СуммаАвтоматическойСкидки = 0;
СтрТовар.Сумма = СтрТовар.Количество * СтрТовар.Цена;
КонецЦикла;
Возврат;
КонецЕсли;
ПродолжитьВызов(ПараметрыРасчета);
КонецПроцедуры
В редакции 1С:Розница 3.0 (построенной на базе архитектуры 1С:УНФ) подход к программам лояльности был кардинально переработан. В третьей редакции начисление и списание баллов объединены в единое рабочее пространство скидок и наценок. Это позволяет гибко настраивать иерархические деревья совместного применения (Бонусы до скидок, Бонусы после скидок, вытеснение и приоритеты), исключая конфликт между скидками и бонусами стандартными пользовательскими настройками.