В процессе работы с маркетинговыми акциями в 1С:Розница часто возникают ситуации, когда требуется реализовать гибкие условия применения скидок. Основная сложность заключается в двух требованиях: во-первых, исключить из действия акции определенные группы или позиции номенклатуры, а во-вторых, ограничить количество товара, участвующего в акции, внутри одного чека (например, если покупатель берет 5 единиц товара, скидка применяется только к 3 из них, а 2 продаются по полной стоимости).
Для исключения товаров из акции лучше всего использовать штатный механизм Сегменты номенклатуры. Мы создаем сегмент с исключением нужных товаров и указываем его в Условиях предоставления скидок. Это избавляет нас от написания кода фильтрации и позволяет администраторам самостоятельно менять состав исключаемых товаров через справочник, без необходимости вмешательства в конфигурацию.
Задача ограничения количества товара, попадающего под действие скидки, является более сложной, так как типовой интерфейс Скидок и наценок не всегда позволяет гибко настроить сценарий «часть со скидкой, часть по полной цене» для сложных условий. Рассмотрим основные подходы к решению этой задачи.
Разберем подход, при котором мы создаем собственную внешнюю обработку для расчета скидки. Когда стандартный интерфейс не позволяет совместить Промокод и программную логику ограничения, мы можем пойти следующим путем:
Внешнюю обработку типа скидки.СкидкаНаценка).Для корректного распределения скидки на ограниченное количество единиц товара мы можем программно разделять строку товара в Чеке ККМ на две позиции: одну с примененной скидкой для N штук, другую — по полной цене для остатка. Это делается через доработку алгоритма РассчитатьСкидкиНаценки в общем модуле.
Сегодня использование Расширений конфигурации является предпочтительным способом по сравнению с внешними обработками. Это позволяет нам внедрить проверку «на количество» прямо в алгоритм расчета, сохраняя доступ ко всем штатным возможностям маркетинговых акций.
Разберем по шагам, как это работает:
РассчитатьСкидкиНаценки.Сумму скидки для строки чека, обеспечивая расчет только для установленного лимита.Примерная логика обработки данных при расчете может выглядеть следующим образом:
// Пример логики ограничения количества внутри расширения
Процедура РассчитатьСкидкуСОграничением(СтрокаЧека, МаксКоличество)
Если СтрокаЧека.Количество > МаксКоличество Тогда
// Применяем скидку только к части товара
СуммаСоСкидкой = МаксКоличество * СтрокаЧека.Цена * (1 - ПроцентСкидки / 100);
СуммаБезСкидки = (СтрокаЧека.Количество - МаксКоличество) * СтрокаЧека.Цена;
СтрокаЧека.СуммаСкидки = СтрокаЧека.Сумма - (СуммаСоСкидкой + СуммаБезСкидки);
КонецЕсли;
КонецПроцедуры
Мы проанализировали ситуацию и рекомендуем отказаться от жестко «зашитых» внешних обработок в пользу расширений по нескольким причинам:
1С:Розница структура документа Чек ККМ может меняться. Внешние обработки при таких изменениях часто перестают работать.Маркетинговых акций.Таким образом, мы рекомендуем использовать комбинацию Сегментов номенклатуры для исключений и Расширения конфигурации для реализации ограничения количества товара. Это обеспечит надежность системы и гибкость маркетинговых инструментов вашего бизнеса.