В практике автоматизации розничной торговли часто возникают задачи по созданию сложных программ лояльности. Один из популярных сценариев — циклическая скидка: например, на первую покупку дается скидка 300 рублей, на вторую — 500 рублей, а третья единица товара отдается бесплатно, после чего цикл повторяется. При попытке настроить такую схему в типовой конфигурации 1С:Управление торговлей 11 (УТ 11) пользователи часто сталкиваются с тем, что система «не видит» предыдущие продажи клиента, выдавая ошибку: Текущее значение: 0. Разберем подробно, почему так происходит, как работают механизмы накопления и какие существуют способы решения этой задачи.
Когда мы настраиваем автоматическую скидку с условием Количество проданной номенклатуры по клиенту не менее 1 ед., мы ожидаем, что система мгновенно проверит историю покупок по карте лояльности. Однако в 1С:УТ 11 данные для условий по накоплениям (объем продаж, количество товара) не берутся напрямую из документов в режиме реального времени. Система использует механизм агрегатов.
Разберем, почему возникает ситуация, когда продажа совершена, а скидка не применяется:
ВыручкаИСебестоимостьПродаж). Для того чтобы эти данные стали доступны механизму расчета скидок, должно отработать регламентное задание Обновление агрегатов или специальный расчет показателей. Если задание запускается раз в час или раз в сутки, то покупка, совершенная пять минут назад, не будет учтена в текущем чеке.Максимум, система применит только одну, наиболее выгодную.Проанализируем ситуацию с циклом (1-я — скидка А, 2-я — скидка Б, 3-я — бесплатно). Стандартный механизм условий в 1С построен по принципу достижения порога. Мы можем сказать системе: «если куплено 3 и более единиц, дай скидку». Но мы не можем штатными средствами без программирования реализовать условие «каждая третья покупка» или «сбросить счетчик после третьей единицы».
Штатные условия За накопленный объем продаж работают только по нарастающей. Как только клиент купил 3 единицы, он всегда будет удовлетворять условию «более 3», и система не поймет, что четвертая покупка должна снова считаться как «первая» в новом цикле.
Рассмотрим наиболее близкий к типовому функционалу способ реализации цикла через Бонусные баллы. Хотя это требует от кассира дополнительных действий, это позволяет обойти проблему «засыпания» регистров накопления.
Алгоритм настройки может быть следующим:
Этот метод работает мгновенно в рамках Бонусной программы, так как остатки баллов обычно актуализируются быстрее, чем агрегаты продаж.
Если бизнес-процесс требует полной автоматизации без участия кассира и использования бонусов, необходимо использовать механизм дополнительных условий предоставления скидок. В современных версиях 1С (начиная с 11.4) это реализуется через расширения конфигурации.
Мы можем создать новое условие, которое будет выполнять прямой запрос к базе данных, игнорируя агрегаты. Рассмотрим пример логики запроса (псевдокод) для проверки «какая по счету покупка данного товара совершается клиентом»:
// Пример логики запроса для проверки номера покупки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот) КАК КолВо
|ИЗ
| РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, , Авто, АналитикаУчетаНоменклатуры.Номенклатура = &Номенклатура И АналитикаПоПартнерам.Партнер = &Партнер) КАК ВыручкаИСебестоимостьПродажОбороты";
Запрос.УстановитьПараметр("Номенклатура", ТекущийТовар);
Запрос.УстановитьПараметр("Партнер", ТекущийКлиент);
Результат = Запрос.Выполнить().Выгрузить();
КоличествоРанееКупленного = ?(Результат.Количество() > 0, Результат[0].КолВо, 0);
// Вычисляем остаток от деления на 3 (для цикла из 3-х шагов)
ШагЦикла = КоличествоРанееКупленного % 3;
Проанализировав ШагЦикла, программный код скидки может вернуть Истина или Ложа для конкретной строки чека. Если ШагЦикла = 0, применяется скидка для «первой» покупки, если ШагЦикла = 2 — товар отдается бесплатно.
Разберем еще один «полуавтоматический» способ — маркетинговые акции с промокодами или купонами. Это позволяет избежать проблем с обновлением агрегатов.
Схема работы:
Справочник.БонусныеПрограммы или РегистрСведений.РегистрацияЦенНоменклатуры (в части промокодов) обновляются сразу.Если вы все же решили использовать штатные накопительные скидки, обязательно проверьте следующие настройки в вашей базе 1С:
Администрирование — Обслуживание — Регламентные операции. Найдите задание Обновление агрегатов. Установите расписание «повторять каждые 60 секунд». Это минимизирует задержку, но может увеличить нагрузку на сервер.Виды карт лояльности стоит признак Тип карты: Именная, так как накопительные скидки работают только в привязке к конкретному партнеру (клиенту).Номенклатура не было пересекающихся групп, которые могут блокировать друг друга по приоритету.Подведем итог: штатная настройка «циклической» скидки в 1С:УТ 11 невозможна из-за линейности накопительных условий и задержек в расчете агрегатов. Оптимальным решением для бизнеса будет либо переход на бонусную систему (списание баллов — это и есть «сброс» цикла), либо разработка небольшого расширения, которое добавит кастомное условие расчета «каждой N-й покупки» через прямой запрос к регистру продаж.