В розничной торговле часто проводятся стимулирующие маркетинговые акции, например: при покупке обуви предоставляется скидка 20% на вторую пару и 30% на третью пару в чеке. При этом для бизнеса важно, чтобы скидка распределялась корректно — на конкретные единицы товара по порядку или по возрастанию цены, независимо от того, выбрал покупатель одинаковые или разные модели. Разберем, с какими сложностями можно столкнуться при настройке такой акции в конфигурации 1С:Розница 2, почему типовые правила не справляются с задачей и как правильно реализовать алгоритм.
Проанализируем логику работы типовой подсистемы автоматических скидок в 1С:Розница редакции 2. При попытке настроить акцию через документ Маркетинговая акция со стандартными скидками возникают следующие системные ограничения:
В конфигурации существует механизм подарков («Выдать подарок» с признаком «Из корзины покупателя»), который умеет находить самую дешевую позицию для сценариев формата «1+1=3» (или «3=2»). Однако этот механизм жестко ограничен предоставлением 100% скидки и не позволяет задать гибкий процент (например, 15% на вторую и 20% на третью позицию).
Разработчики 1С предусмотрели возможность гибкого расширения логики скидок без снятия конфигурации с поддержки. В 1С:Розница 2 механизмы скидок поддерживают внешние модули.
Рассмотрим по шагам, где найти примеры и как их применить:
Скидка (наценка) или Условие предоставления скидки.Скидки (наценки, ограничения) выберем способ предоставления Внешняя обработка и укажем зарегистрированный файл. В коде обработки прописывается поиск нужных позиций из корзины, их сортировка по цене и адресное начисление скидки на конкретные строки.Важное преимущество этого метода заключается в том, что внутри программного кода обработки можно гибко управлять исключениями, например предоставлять акционную скидку даже на товары, входящие в сегмент с установленными стоп-ценами, что стандартный конструктор часто запрещает.
Если магазин работает в распределенной информационной базе (РИБ) или требуется централизованное управление логикой без загрузки внешних файлов через интерфейс каждого узла, наиболее надежным способом будет использование механизма расширений.
Разберем реализацию логики с помощью расширения:
СкидкиНаценкиСервер).&Вместо или &После для перехвата расчетных процедур чека.Посмотрим на пример логики, которую необходимо реализовать в модуле для распределения скидки на вторую и третью пару обуви:
// Пример алгоритма отбора и начисления скидок на N-е позиции сегмента
ТаблицаТоваров = ЧекККМ.Товары.Выгрузить();
ТаблицаТоваров.Колонки.Добавить("ПорядковыйНомерВСегменте");
// Отбираем только позиции нужного сегмента (например, Обувь)
ПараметрыОтбора = Новый Структура("ЭтоОбувь", Истина);
НайденныеСтроки = ТаблицаТоваров.НайтиСтроки(ПараметрыОтбора);
// Сортируем позиции по убыванию или возрастанию цены
ТаблицаТоваров.Сортировать("Цена Убыв");
СчетчикШтук = 0;
Для Каждого СтрТовар Из ТаблицаТоваров Цикл
Для Итератор = 1 По СтрТовар.Количество Цикл
СчетчикШтук = СчетчикШтук + 1;
Если СчетчикШтук = 2 Тогда
// Начисляем 20% на вторую единицу
СтрТовар.СуммаАвтоматическойСкидки = СтрТовар.СуммаАвтоматическойСкидки + (СтрТовар.Цена * 0.20);
ИначеЕсли СчетчикШтук = 3 Тогда
// Начисляем 30% на третью единицу
СтрТовар.СуммаАвтоматическойСкидки = СтрТовар.СуммаАвтоматическойСкидки + (СтрТовар.Цена * 0.30);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Такой подход гарантирует точное начисление скидки на конкретные единицы товара независимо от того, были ли они просканированы одной строкой с количеством 3 или тремя отдельными строками в чеке РМК.
Если планируется переход на редакцию 1С:Розница 3.0 (построенную на базе конфигурации УНФ), учитывать программные доработки для подобных акций уже не потребуется. В третьей редакции конструктор автоматических скидок существенно модернизирован: там штатно присутствует возможность задать действие скидки «на каждую N-ю единицу» или «на N единиц при покупке набора» с возможностью указания индивидуального процента скидки без написания программного кода.