Реализация сложных систем лояльности в 1С:Управление торговлей 11.4 — задача, требующая понимания механизмов взаимодействия сегментов, условий предоставления скидок и регламентных операций. Рассмотрим ситуацию: нам необходимо внедрить «лестничную» систему скидок (3%, 5%, 7%), которая зависит от объема закупок в предыдущем месяце. При этом, если клиент не выполняет условия в текущем периоде, он теряет накопленный прогресс и возвращается к базовым условиям.
Проанализируем типовой функционал и выясним, почему стандартные накопительные скидки не всегда подходят «из коробки», и какие инструменты позволят нам добиться полной автоматизации процесса.
Стандартный механизм скидок в 1С:УТ 11 отлично справляется с простыми условиями: «купил на 50 000 — получи скидку». Однако, когда появляется условие «непрерывности» (стаж закупок) и жесткий «откат» при пропуске месяца, типовой конструктор условий начинает давать сбои. Программа хорошо видит накопленный итог за всё время или сумму текущего чека, но штатно не хранит историю выполнения условий для каждого шага «лестницы» скидок.
Разберем основные подходы, которые позволяют решить эту задачу максимально эффективно.
Это наиболее гибкий и «почти типовой» метод. Его преимущество в том, что конфигурация остается на поддержке, а вся логика выносится в схему компоновки данных (СКД) сегмента клиентов.
Посмотрим на алгоритм настройки:
ВыручкаИСебестоимостьПродаж. Запрос должен проверять оборот по партнеру за предыдущий календарный месяц.Проанализируем пример логики запроса для сегмента «Скидка 5%» (второй уровень). Нам нужно убедиться, что в прошлом месяце клиент купил на сумму от 100 000 руб., а в позапрошлом — на сумму от 50 000 руб. (что обеспечило ему переход). Если же мы хотим упростить и проверять только факт выполнения условий в прошлом месяце для удержания скидки, запрос будет выглядеть примерно так:
ВЫБРАТЬ
Партнеры.Ссылка КАК Партнер
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Ссылка В (
ВЫБРАТЬ
Обороты.Партнер
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(
ДОБАВИТЬКДАТЕ(&НачалоПериода, МЕСЯЦ, -1),
ДОБАВИТЬКДАТЕ(&КонецПериода, МЕСЯЦ, -1),
Авто,
) КАК Обороты
СГРУППИРОВАТЬ ПО
Обороты.Партнер
ИМЕЮЩИЕ
СУММА(Обороты.СуммаВыручкиОборот) >= 100000
)
Выясним важный момент: чтобы сегменты обновлялись автоматически первого числа каждого месяца, необходимо настроить типовое регламентное задание Очистка и заполнение сегментов клиентов. Таким образом, состав сегмента будет актуализироваться без участия человека, а привязанные к этим сегментам автоматические скидки будут применяться или отключаться в зависимости от вхождения клиента в группу.
Рассмотрим вариант использования бонусных баллов. В 1С:УТ 11 бонусная программа позволяет реализовать механику «сгорания», что идеально ложится на условие «отката».
Разберем по шагам:
В этой схеме, если клиент выполнил условия в мае, он получает бонусы, которыми может «оплатить» покупку в июне. Если в июне покупок не было — бонусы сгорают, и в июле у клиента нет преимуществ. Это полностью автоматизирует процесс «сброса», однако меняет визуальное представление для клиента: вместо прямой скидки в реализации он видит оплату бонусами.
Если логика переходов слишком сложная (например, нужно учитывать не только сумму, но и ассортиментные группы, или хранить «стаж» клиента более 3 месяцев), лучше прибегнуть к написанию небольшой внешней обработки. Как справедливо отмечено в обсуждении на форуме, программиста не должна пугать разработка, которая будет подключена через механизм Дополнительные отчеты и обработки.
Рассмотрим преимущества этого метода:
Условия предоставления скидок или состав Типовых соглашений.Пример структуры кода для такой обработки может выглядеть следующим образом:
Процедура ВыполнитьПересчетСкидокПоРезультатамМесяца()
// Получаем данные о продажах за прошлый месяц
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... ИЗ РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(...)";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
// Проверяем текущий уровень клиента из доп. реквизита
ТекущийУровень = Результат.Партнер.ДополнительныеРеквизиты.Найти(...);
Если Результат.СуммаВыручки >= ПорогДляСледующегоУровня Тогда
ПовыситьУровень(Результат.Партнер);
ИначеЕсли Результат.СуммаВыручки < ПорогТекущегоУровня Тогда
СброситьДоБазового(Результат.Партнер);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выясним, какой путь выбрать именно вам. Если вы стремитесь к максимальной чистоте конфигурации и ваши условия ограничиваются только результатом предыдущего месяца, используйте динамические сегменты с кастомным СКД-запросом. Это надежный инструмент, который требует минимального вмешательства программиста (только написание запроса).
Если же ваша система лояльности подразумевает «память» на несколько месяцев вперед (например, «скидка 7% дается только после 3 месяцев непрерывных закупок на 150к»), то без внешней обработки, работающей по регламентному заданию, не обойтись. Она позволит системе «запоминать» прогресс каждого клиента и автоматически управлять его правами на скидку, избавляя менеджеров от рутины и ошибок ручного пересчета.
Важный момент: не забудьте проверить настройки Приоритетности скидок в дереве скидок 1С:УТ. Даже если клиент попадет в сегмент 7%, неправильно настроенный приоритет или группа совместного применения могут заблокировать расчет нужного процента.