Как настроить скидку на второй и третий товар в чеке в 1С:Розница 2?

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

В розничной торговле часто проводятся стимулирующие маркетинговые акции, например: при покупке обуви предоставляется скидка 20% на вторую пару и 30% на третью пару в чеке. При этом для бизнеса важно, чтобы скидка распределялась корректно — на конкретные единицы товара по порядку или по возрастанию цены, независимо от того, выбрал покупатель одинаковые или разные модели. Разберем, с какими сложностями можно столкнуться при настройке такой акции в конфигурации 1С:Розница 2, почему типовые правила не справляются с задачей и как правильно реализовать алгоритм.

Почему типовой механизм скидок не подходит для этой задачи

Проанализируем логику работы типовой подсистемы автоматических скидок в 1С:Розница редакции 2. При попытке настроить акцию через документ Маркетинговая акция со стандартными скидками возникают следующие системные ограничения:

  1. Равномерное распределение скидки по строкам: Если настроить условие предоставления «За разовый объем продаж» (например, количество в документе не менее 2 единиц), то система применит указанный процент скидки ко всем позициям заданного сегмента, попавшим в чек, а не изолированно ко второй или третьей паре.
  2. Автоматическое объединение одинаковых позиций: В режиме рабочего места кассира (РМК) при повторном сканировании одного и того же штрихкода конфигурация автоматически увеличивает количество в уже существующей строке чека. В типовом строчном расчете невозможно разделить одну строку с количеством «2» на «первую штуку без скидки» и «вторую штуку со скидкой».
  3. Отсутствие сортировки по стоимости: Штатный расчет процентов не ранжирует однотипные позиции по цене, чтобы гарантированно дать скидку на более дешевый или более дорогой товар из корзины.

В конфигурации существует механизм подарков («Выдать подарок» с признаком «Из корзины покупателя»), который умеет находить самую дешевую позицию для сценариев формата «1+1=3» (или «3=2»). Однако этот механизм жестко ограничен предоставлением 100% скидки и не позволяет задать гибкий процент (например, 15% на вторую и 20% на третью позицию).

Решение 1: Подключение внешней обработки расчета скидки

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

Рассмотрим по шагам, где найти примеры и как их применить:

  1. Поиск готового шаблона: В каталоге шаблонов установки конфигурации (папка релиза 1С:Розница) поставляются готовые внешние обработки для демонстрации нестандартных расчетов:
    • обработка с примером условия «На каждую N-ю строку чека»;
    • обработка с примером способа расчета «Скидка на произвольный комплект».
  2. Подключение обработки: Откроем раздел Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Добавим новую обработку с видом Скидка (наценка) или Условие предоставления скидки.
  3. Создание скидки: В справочнике Скидки (наценки, ограничения) выберем способ предоставления Внешняя обработка и укажем зарегистрированный файл. В коде обработки прописывается поиск нужных позиций из корзины, их сортировка по цене и адресное начисление скидки на конкретные строки.

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

Решение 2: Переопределение расчета через расширение конфигурации (.cfe)

Если магазин работает в распределенной информационной базе (РИБ) или требуется централизованное управление логикой без загрузки внешних файлов через интерфейс каждого узла, наиболее надежным способом будет использование механизма расширений.

Разберем реализацию логики с помощью расширения:

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

Посмотрим на пример логики, которую необходимо реализовать в модуле для распределения скидки на вторую и третью пару обуви:


// Пример алгоритма отбора и начисления скидок на N-е позиции сегмента
ТаблицаТоваров = ЧекККМ.Товары.Выгрузить();
ТаблицаТоваров.Колонки.Добавить("ПорядковыйНомерВСегменте");

// Отбираем только позиции нужного сегмента (например, Обувь)
ПараметрыОтбора = Новый Структура("ЭтоОбувь", Истина);
НайденныеСтроки = ТаблицаТоваров.НайтиСтроки(ПараметрыОтбора);

// Сортируем позиции по убыванию или возрастанию цены
ТаблицаТоваров.Сортировать("Цена Убыв");

СчетчикШтук = 0;
Для Каждого СтрТовар Из ТаблицаТоваров Цикл
    Для Итератор = 1 По СтрТовар.Количество Цикл
        СчетчикШтук = СчетчикШтук + 1;
        Если СчетчикШтук = 2 Тогда
            // Начисляем 20% на вторую единицу
            СтрТовар.СуммаАвтоматическойСкидки = СтрТовар.СуммаАвтоматическойСкидки + (СтрТовар.Цена * 0.20);
        ИначеЕсли СчетчикШтук = 3 Тогда
            // Начисляем 30% на третью единицу
            СтрТовар.СуммаАвтоматическойСкидки = СтрТовар.СуммаАвтоматическойСкидки + (СтрТовар.Цена * 0.30);
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Такой подход гарантирует точное начисление скидки на конкретные единицы товара независимо от того, были ли они просканированы одной строкой с количеством 3 или тремя отдельными строками в чеке РМК.

Особенности реализации в 1С:Розница 3.0

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

← На главную