Рассмотрим интересную практическую задачу: компании необходимо поощрять своих лучших покупателей. Требуется настроить систему так, чтобы клиентам, входящим в Топ-3 по объему выручки за прошлый год, автоматически назначалась скидка 10%. Одновременно с этим, Топ-3 клиентам по количеству заказов также должна предоставляться скидка 10%. Если клиент оказался настолько хорош, что попал в обе группы, скидки должны складываться (в сумме 20%). Состав лучших клиентов должен пересматриваться раз в год. Проанализируем, как реализовать этот механизм, используя исключительно стандартный функционал программы 1С:Управление торговлей 11.5.
Для реализации подобной логики в типовой конфигурации мы будем использовать связку нескольких подсистем. Разберем по шагам, что именно нам предстоит настроить:
ТиповыеСоглашенияСКлиентами.Посмотрим на каждый из этих этапов подробнее.
Перейдем в раздел CRM и маркетинг и создадим новый сегмент клиентов. В настройках сегмента необходимо выбрать способ формирования ПериодическиОбновлять. Однако стандартных отборов нам не хватит для вычисления лидеров продаж. Нам потребуется нажать кнопку Редактировать схему компоновки.
В открывшемся окне генератора схемы мы увидим стандартный набор данных. Наша задача — изменить текст запроса так, чтобы система агрегировала выручку за прошлый год, отсортировала ее по убыванию и взяла только первые три записи.
Частая ошибка, с которой сталкиваются разработчики на этом этапе — неправильное использование операторов ПЕРВЫЕ и УПОРЯДОЧИТЬ ПО. Если вы поместите ПЕРВЫЕ 3 во вложенный запрос, а сортировку оставите во внешнем (или наоборот), система возьмет три случайные записи из базы данных, а уже потом отсортирует этот случайный кусок. Чтобы получить достоверные данные, отбор и сортировка должны находиться в одном блоке запроса.
Проанализируем правильный вариант кода для первого набора данных (отбор по выручке):
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 3
АналитикаПоПартнерам.Партнер КАК Партнер,
СУММА(ВыручкаИСебестоимость.СуммаВыручкиОборот) КАК Выручка
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &ОкончаниеПериода, Авто, ) КАК ВыручкаИСебестоимость
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаПоПартнерам
ПО ВыручкаИСебестоимость.АналитикаУчетаПоПартнерам = АналитикаПоПартнерам.КлючАналитики
СГРУППИРОВАТЬ ПО
АналитикаПоПартнерам.Партнер
УПОРЯДОЧИТЬ ПО
Выручка УБЫВ
Обратите внимание: мы используем виртуальную таблицу Обороты регистра накопления. В параметрах СКД (на вкладке "Параметры") необходимо будет жестко задать периоды: &НачалоПериода — начало прошлого года, &ОкончаниеПериода — конец прошлого года.
Теперь создадим второй сегмент. Логика работы с ним аналогична, но источником данных будет выступать не регистр выручки, а документы. Отредактируем схему компоновки второго сегмента.
Здесь нам нужно обратиться к таблице документов ЗаказКлиента. Мы сгруппируем данные по полю Партнер и применим агрегатную функцию КОЛИЧЕСТВО для подсчета уникальных документов.
Посмотрим на пример запроса для второго сегмента:
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 3
ЗаказКлиента.Партнер КАК Партнер,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЗаказКлиента.Ссылка) КАК КоличествоЗаказов
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ГДЕ
ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &ОкончаниеПериода
И ЗаказКлиента.Проведен = ИСТИНА
СГРУППИРОВАТЬ ПО
ЗаказКлиента.Партнер
УПОРЯДОЧИТЬ ПО
КоличествоЗаказов УБЫВ
Таким образом, мы получили два независимых сегмента, каждый из которых содержит ровно трех лучших партнеров по заданным критериям.
В настройках сегментов мы указали тип "Периодически обновлять". Однако сама по себе база данных пересчитывать эти сегменты не будет. Без дополнительной настройки состав обновится только в том случае, если пользователь зайдет в карточку сегмента и вручную нажмет кнопку Сформировать.
Чтобы автоматизировать процесс, настроим фоновое задание. Перейдем в раздел НСИ и администрирование, далее откроем Обслуживание и найдем пункт РегламентныеИФоновыеЗадания. В списке заданий найдите элемент с названием "Обновление сегментов партнеров". Откройте его и задайте расписание. Поскольку по условию задачи статусы пересматриваются раз в год, расписание можно настроить, например, на запуск 1 января в 02:00 ночи. Обязательно убедитесь, что регламентное задание включено.
Сегменты готовы, теперь перейдем к финансовой части. Откроем раздел CRM и маркетинг и перейдем в Скидки (наценки). Нам необходимо создать две отдельные карточки скидок по 10%.
В первой карточке (назовем ее "Скидка Топ-3 по выручке") на вкладке "Условия предоставления" добавим условие: Клиент входит в сегмент, и выберем наш первый созданный сегмент. Аналогичные действия проделаем для второй скидки (10% для "Топ-3 по заказам"), привязав ее ко второму сегменту.
Ключевой момент задачи: скидки могут складываться, если клиент попал в оба Топ-3. В 1С:УТ логика пересечения настраивается через группы (папки) в дереве скидок. Выполним следующие действия:
Сложение (если оставить стандартный "Максимум", то клиент получит только 10% вместо заслуженных 20%).Завершающий этап. Просто создать скидку в системе недостаточно — она не начнет действовать сама по себе. Скидки должны быть привязаны к правилам продаж, по которым работают ваши менеджеры.
Перейдем в раздел CRM и маркетинг -> ТиповыеСоглашенияСКлиентами. Откроем соглашение, которое используется для оформления продаж (или несколько соглашений, если их много). Перейдем на вкладку Скидки (наценки). Найдем в дереве нашу группу "Бонусы для лидеров" и обе скидки внутри нее. Установим для них статус Действует.
Теперь задача полностью решена. Когда менеджер создает документ реализации или заказ клиента, система проверяет партнера. Если фоновое задание в начале года поместило этого партнера в сегмент "Топ-3 по выручке", применится 10%. Если он оказался еще и в "Топ-3 по заказам", применится вторая скидка, и благодаря правилу группы Сложение, в документе рассчитается итоговая скидка 20%.