Как настроить скидку 50% на второй товар с меньшей стоимостью в 1С

Бизнес-аналитик 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

Акция «Вторая вещь за полцены» (или скидка 50% на товар с наименьшей стоимостью в чеке) — один из самых популярных и эффективных инструментов в розничной торговле. Она отлично стимулирует покупателей увеличивать средний чек, приобретая по две вещи за раз. Однако при попытке настроить такую механику в программе 1С многие маркетологи и ИТ-специалисты сталкиваются со сложностями алгоритмического характера. Система должна не просто найти два товара, но и правильно отсортировать их по цене, а затем рассчитать скидку именно на более дешевую позицию.

В этой статье мы подробно разберем, как решить эту задачу. Мы проанализируем ограничения старых конфигураций, рассмотрим обходной маневр через механизм «Подарков», научимся использовать внешние обработки и, наконец, изучим современный штатный функционал, который появился в актуальных версиях программных продуктов 1С.

---

В чем заключается сложность алгоритма?

Прежде чем перейти к настройкам, давайте разберем логику работы скидки на концептуальном уровне. Предположим, покупатель приносит на кассу два товара:

По условиям акции скидка в размере 50% должна примениться к товару Б (так как 600 < 1000). В итоге покупатель должен заплатить: 1000 + (600 * 0.5) = 1300 рублей. Общая сумма скидки составляет 300 рублей.

Для корректного отражения этой операции в чеке и последующей отправки данных в онлайн-кассу (в соответствии с 54-ФЗ) система должна распределить («размазать») эти 300 рублей скидки по обеим позициям в чеке пропорционально их стоимости. Это критически важно для корректного оформления возвратов. Если покупатель решит вернуть только первый товар (Товар А), система должна точно знать, какую сумму за него возвращать, чтобы магазин не остался в убытке.

---

Способ 1. Современное решение в 1С:Розница 3.0 и 1С:УНФ 3.0 (штатный функционал)

Если ваша компания использует современные редакции программ «1С:Розница 3.0» или «1С:Управление нашей фирмой 3.0» (начиная с версии 3.0.9), вам крупно повезло. Разработчики полностью обновили маркетинговый блок, добавив встроенную поддержку сложных цикличесних скидок. Программист для решения этой задачи больше не нужен.

Давайте настроим акцию по шагам:

  1. Переходим в раздел Продажи, далее выбираем справочник Скидки (наценки).
  2. Нажимаем кнопку Создать и выбираем тип скидки Процент.
  3. В поле «Процент» указываем значение 50.
  4. В поле Способ применения выбираем значение На строку с условием (или «На документ с условием» в зависимости от необходимой детализации распределения).
  5. Переходим к настройке условий предоставления. Создаем новое условие с типом За разовую покупку комплекта (набора) или Каждый N-й товар в документе.
  6. Указываем кратность: скидка предоставляется на каждый 2-й товар из списка.
  7. Важнейший шаг: в правилах распределения скидки устанавливаем признак сортировки по цене. Система автоматически активирует алгоритм «Сортировать по возрастанию цены». Это заставит программу выстроить товары в чеке от самых дешевых к самым дорогим и применить скидку именно к первым (наименее ценным) позициям.
  8. Записываем скидку и создаем документ Действие скидок (наценок) для ее активации на нужных торговых точках.

Теперь при расчете чека кассиром система сама отсортирует подходящие товары по цене и сделает скидку 50% на более дешевый из них.

---

Способ 2. Обходное решение для старых версий (1С:Розница 2.2 / 2.3) через механизм «Подарок»

В старых редакциях «1С:Розница 2.3» встроенного механизма сортировки для процентных скидок не было. Однако пользователи нашли лазейку, используя стандартный механизм выдачи подарков. Рассмотрим, как настроить похожую акцию штатными средствами прошлых версий.

Логика настройки выглядит следующим образом:

  1. Создаем новый Сегмент номенклатуры, в который добавляем все товары, участвующие в акции. Это позволит ограничить действие скидки только нужными вещами.
  2. Создаем скидку с типом Подарок.
  3. В настройках подарка устанавливаем флаг Из корзины покупателя.
  4. В качестве условия предоставления скидки выбираем В документе присутствует комплект товаров (указываем количество товаров из нашего сегмента равным 2).

Как это работает на практике: когда кассир добавляет в чек две вещи из выбранного сегмента, система распознает условие комплекта. Флаг «Из корзины покупателя» заставляет программу найти в чеке позицию с наименьшей стоимостью и уменьшить ее цену.

Критическое ограничение этого способа: встроенный механизм «Подарок» по своей природе обнуляет стоимость товара, то есть дает на него 100% скидку (товар отдается бесплатно). Сделать скидку именно 50% стандартным механизмом «Подарок» в Рознице 2.3 невозможно. Данный способ подойдет вам только в том случае, если вы готовы скорректировать условия акции до формата «1+1 = третий в подарок» (где подарок будет бесплатным).

---

Способ 3. Использование внешних обработок (универсальный метод для 1С:УТ 11, ERP, КА и старой Розницы)

Если вам обязательно нужна скидка именно в 50% на второй дешевый товар в старой конфигурации (например, в «1С:Управление торговлей 11» или «1С:Розница 2.3»), единственным правильным и стабильным решением будет использование внешней обработки расчета скидок.

В платформе 1С заложена прекрасная архитектурная возможность расширения функционала скидок без изменения типовой конфигурации. Для этого используются внешние обработки, подключаемые через механизм дополнительных отчетов и обработок.

В каталоге шаблонов установленной конфигурации 1С (обычно он находится в папке пользователя на диске C: в подкаталоге tmplts/1c/retail/.../discount) разработчики заботливо оставили готовые примеры. Там можно найти шаблон обработки для начисления скидки на каждую N-ю строку документа.

Программисту достаточно взять этот шаблон за основу и дописать в алгоритме сортировку таблицы товаров перед расчетом скидки. Рассмотрим концептуальный пример кода, который решает эту задачу:


// Алгоритм распределения скидки на второй товар в чеке с наименьшей ценой
// Данный код выполняется внутри внешней обработки расчета скидок

ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Номенклатура");
ТаблицаТоваров.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаТоваров.Колонки.Добавить("СуммаСкидки", Новый ОписаниеТипов("Число"));

// Заполняем временную таблицу позициями из чека, которые соответствуют условиям акции
Для Каждого СтрокаДокумента Из ОбъектДокумента.Товары Цикл
    Если СтрокаДокумента.Номенклатура.ВСегменте(СсылкаНаСегментАкции) Тогда
        НоваяСтрока = ТаблицаТоваров.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДокумента);
    КонецЕсли;
КонецЦикла;

// Сортируем таблицу по возрастанию цены (самые дешевые товары окажутся сверху)
ТаблицаТоваров.Сортировать("Цена Возр");

// Вычисляем общее количество акционных товаров в корзине
ОбщееКоличество = ТаблицаТоваров.Итог("Количество");
КоличествоСкидок = Цел(ОбщееКоличество / 2); // Скидка на каждый второй товар

ПримененоСкидок = 0;

// Распределяем 50% скидку на более дешевые товары
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
    Если ПримененоСкидок < КоличествоСкидок Тогда
        ДоступноДляСкидки = Мин(СтрокаТовара.Количество, КоличествоСкидок - ПримененоСкидок);
        
        // Рассчитываем сумму скидки (50% от цены за единицу товара)
        СтрокаТовара.СуммаСкидки = (СтрокаТовара.Цена * 0.5) * ДоступноДляСкидки;
        ПримененоСкидок = ПримененоСкидок + ДоступноДляСкидки;
    КонецЕсли;
КонецЦикла;

Преимущество этого подхода заключается в том, что конфигурация вашей базы данных остается абсолютно типовой. Вы не снимете программу с поддержки, что гарантирует легкое и беспроблемное обновление 1С в будущем. Внешняя обработка просто подключается в режиме предприятия в справочнике дополнительных обработок и выбирается в качестве алгоритма в карточке скидки.

---

Резюме и рекомендации

Выбор оптимального решения зависит от версии вашей учетной системы:

← На главную