Акция «Вторая вещь за полцены» (или скидка 50% на товар с наименьшей стоимостью в чеке) — один из самых популярных и эффективных инструментов в розничной торговле. Она отлично стимулирует покупателей увеличивать средний чек, приобретая по две вещи за раз. Однако при попытке настроить такую механику в программе 1С многие маркетологи и ИТ-специалисты сталкиваются со сложностями алгоритмического характера. Система должна не просто найти два товара, но и правильно отсортировать их по цене, а затем рассчитать скидку именно на более дешевую позицию.
В этой статье мы подробно разберем, как решить эту задачу. Мы проанализируем ограничения старых конфигураций, рассмотрим обходной маневр через механизм «Подарков», научимся использовать внешние обработки и, наконец, изучим современный штатный функционал, который появился в актуальных версиях программных продуктов 1С.
---
Прежде чем перейти к настройкам, давайте разберем логику работы скидки на концептуальном уровне. Предположим, покупатель приносит на кассу два товара:
По условиям акции скидка в размере 50% должна примениться к товару Б (так как 600 < 1000). В итоге покупатель должен заплатить: 1000 + (600 * 0.5) = 1300 рублей. Общая сумма скидки составляет 300 рублей.
Для корректного отражения этой операции в чеке и последующей отправки данных в онлайн-кассу (в соответствии с 54-ФЗ) система должна распределить («размазать») эти 300 рублей скидки по обеим позициям в чеке пропорционально их стоимости. Это критически важно для корректного оформления возвратов. Если покупатель решит вернуть только первый товар (Товар А), система должна точно знать, какую сумму за него возвращать, чтобы магазин не остался в убытке.
---
Если ваша компания использует современные редакции программ «1С:Розница 3.0» или «1С:Управление нашей фирмой 3.0» (начиная с версии 3.0.9), вам крупно повезло. Разработчики полностью обновили маркетинговый блок, добавив встроенную поддержку сложных цикличесних скидок. Программист для решения этой задачи больше не нужен.
Давайте настроим акцию по шагам:
50.Теперь при расчете чека кассиром система сама отсортирует подходящие товары по цене и сделает скидку 50% на более дешевый из них.
---
В старых редакциях «1С:Розница 2.3» встроенного механизма сортировки для процентных скидок не было. Однако пользователи нашли лазейку, используя стандартный механизм выдачи подарков. Рассмотрим, как настроить похожую акцию штатными средствами прошлых версий.
Логика настройки выглядит следующим образом:
Как это работает на практике: когда кассир добавляет в чек две вещи из выбранного сегмента, система распознает условие комплекта. Флаг «Из корзины покупателя» заставляет программу найти в чеке позицию с наименьшей стоимостью и уменьшить ее цену.
Критическое ограничение этого способа: встроенный механизм «Подарок» по своей природе обнуляет стоимость товара, то есть дает на него 100% скидку (товар отдается бесплатно). Сделать скидку именно 50% стандартным механизмом «Подарок» в Рознице 2.3 невозможно. Данный способ подойдет вам только в том случае, если вы готовы скорректировать условия акции до формата «1+1 = третий в подарок» (где подарок будет бесплатным).
---
Если вам обязательно нужна скидка именно в 50% на второй дешевый товар в старой конфигурации (например, в «1С:Управление торговлей 11» или «1С:Розница 2.3»), единственным правильным и стабильным решением будет использование внешней обработки расчета скидок.
В платформе 1С заложена прекрасная архитектурная возможность расширения функционала скидок без изменения типовой конфигурации. Для этого используются внешние обработки, подключаемые через механизм дополнительных отчетов и обработок.
В каталоге шаблонов установленной конфигурации 1С (обычно он находится в папке пользователя на диске C: в подкаталоге tmplts/1c/retail/.../discount) разработчики заботливо оставили готовые примеры. Там можно найти шаблон обработки для начисления скидки на каждую N-ю строку документа.
Программисту достаточно взять этот шаблон за основу и дописать в алгоритме сортировку таблицы товаров перед расчетом скидки. Рассмотрим концептуальный пример кода, который решает эту задачу:
// Алгоритм распределения скидки на второй товар в чеке с наименьшей ценой
// Данный код выполняется внутри внешней обработки расчета скидок
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Номенклатура");
ТаблицаТоваров.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("СуммаСкидки", Новый ОписаниеТипов("Число"));
// Заполняем временную таблицу позициями из чека, которые соответствуют условиям акции
Для Каждого СтрокаДокумента Из ОбъектДокумента.Товары Цикл
Если СтрокаДокумента.Номенклатура.ВСегменте(СсылкаНаСегментАкции) Тогда
НоваяСтрока = ТаблицаТоваров.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДокумента);
КонецЕсли;
КонецЦикла;
// Сортируем таблицу по возрастанию цены (самые дешевые товары окажутся сверху)
ТаблицаТоваров.Сортировать("Цена Возр");
// Вычисляем общее количество акционных товаров в корзине
ОбщееКоличество = ТаблицаТоваров.Итог("Количество");
КоличествоСкидок = Цел(ОбщееКоличество / 2); // Скидка на каждый второй товар
ПримененоСкидок = 0;
// Распределяем 50% скидку на более дешевые товары
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
Если ПримененоСкидок < КоличествоСкидок Тогда
ДоступноДляСкидки = Мин(СтрокаТовара.Количество, КоличествоСкидок - ПримененоСкидок);
// Рассчитываем сумму скидки (50% от цены за единицу товара)
СтрокаТовара.СуммаСкидки = (СтрокаТовара.Цена * 0.5) * ДоступноДляСкидки;
ПримененоСкидок = ПримененоСкидок + ДоступноДляСкидки;
КонецЕсли;
КонецЦикла;
Преимущество этого подхода заключается в том, что конфигурация вашей базы данных остается абсолютно типовой. Вы не снимете программу с поддержки, что гарантирует легкое и беспроблемное обновление 1С в будущем. Внешняя обработка просто подключается в режиме предприятия в справочнике дополнительных обработок и выбирается в качестве алгоритма в карточке скидки.
---
Выбор оптимального решения зависит от версии вашей учетной системы: