Как применить несколько управляемых скидок последовательно к одной строке в РМК 1С:Розница 2.2?

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

В практической работе розничных магазинов часто возникает потребность в гибком комбинировании скидок непосредственно в момент оформления продажи кассиром. Например, покупатель приобретает один из товаров в кредит (что дает ему право на скидку 10%) и одновременно предъявляет личную дисконтную карту лояльности (дающую дополнительную скидку 5%). При этом остальные товары в чеке должны получить только скидку по карте лояльности.

Попытка реализовать эту схему в типовом рабочем месте кассира (РМК) конфигурации «1С:Розница 2.2» с помощью механизма управляемых скидок часто приводит к неожиданной проблеме: скидка, для которой явно задана область применения «В строке», всё равно распределяется и применяется ко всему документу (ко всем позициям в табличной части Товары). Выясним причину такого поведения системы и подробно разберем все возможные варианты решения этой задачи.

Анализ проблемы: почему типовой механизм работает некорректно?

Для начала проанализируем, как должна работать система в идеальных условиях. В 1С:Розница управляемые скидки — это скидки, которые рассчитываются не автоматически, а по требованию кассира (нажатием кнопки в РМК). Если область применения установлена «В строке», программа должна применять расчет только к выделенной в данный момент товарной позиции.

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

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

Решение 1. Оформление продажи разными чеками (Организационный обход)

Это самое простое и быстрое решение, не требующее привлечения программистов и изменения настроек программы. Если у клиента в корзине есть товар со сложным сочетанием скидок («Товар 1» с 10% по кредиту + 5% по карте) и обычный товар («Товар 2» только с 5% по карте), мы можем оформить их продажу двумя разными операциями:

  1. Первый чек: Добавляем в РМК только «Товар 1». Применяем к нему ручную управляемую скидку 10%, считываем карту лояльности (автоматическая скидка 5% рассчитывается последовательно). Пробиваем чек.
  2. Второй чек: Оформляем продажу «Товара 2». Считываем только дисконтную карту покупателя (применяется автоматическая скидка 5%). Пробиваем чек.

Преимущества: Полная совместимость с типовой конфигурацией без необходимости доработок; корректное отражение скидок в отчетах.

Недостатки: Увеличивается время обслуживания покупателя на кассе; тратится больше кассовой ленты; покупатель получает два фискальных документа вместо одного, что может вызвать у него вопросы.

Решение 2. Математическое объединение скидок кассиром (Ручной ввод процента в строке)

Вместо использования справочника управляемых скидок мы можем прибегнуть к стандартному механизму ввода произвольной ручной скидки на строку. Этот функционал вызывается в РМК с помощью комбинации клавиш Shift + F8 (или нажатием кнопки «Ручные скидки» -> «Скидка процентом в строке»).

Поскольку скидки должны применяться последовательно (сначала вычитается 10%, а затем из оставшейся суммы вычитается еще 5%), мы не можем просто сложить проценты (10% + 5% = 15% — это неверно). Нам необходимо рассчитать совокупный (эффективный) процент скидки.

Проанализируем математическую модель расчета:

Допустим, базовая цена товара составляет 1000 рублей.

При последовательном применении скидок расчет выглядит так:

  1. Применение первой скидки (10%): 1000 - 10% = 900 рублей.
  2. Применение второй скидки (5%): 900 - 5% = 855 рублей.

Общая сумма скидки составила: 1000 - 855 = 145 рублей, что эквивалентно единой скидке в размере 14.5%.

Формула расчета совокупного процента:

Эффективный процент = (1 - (1 - Скидка1 / 100) * (1 - Скидка2 / 100)) * 100

Для наших значений: (1 - (1 - 0.10) * (1 - 0.05)) * 100 = (1 - 0.90 * 0.95) * 100 = (1 - 0.855) * 100 = 14.5%.

Кассир может действовать по следующему алгоритму:

  1. Выделяет в РМК «Товар 1» (который оформляется в кредит).
  2. Нажимает Shift + F8 и вводит ручную скидку на строку в размере 14.5%.
  3. Выделяет «Товар 2» и вводит ручную скидку на строку в размере 5% (эквивалент дисконтной карты).
  4. Пробивает один общий чек.

Преимущества: Продажа оформляется одним чеком; не требует программирования.

Недостатки: Человеческий фактор (кассир должен помнить формулу или иметь под рукой таблицу готовых расчетов); сложно контролировать правомерность предоставления таких скидок при последующем аудите продаж.

Решение 3. Использование механизма совместного применения скидок (Настройка правил)

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

  1. Перейдем в раздел Маркетинг -> Скидки (наценки, ограничения).
  2. Создадим новую группу совместного применения. Для реквизита Вариант совместного применения выберем значение «Последовательное применение».
  3. Внутри этой группы создадим две скидки:
    • Скидка №1: «Кредитная скидка 10%». Способ предоставления — Процент (10%). В области применения укажем «В строке». Способ предоставления — «Управляемая» (будет назначаться вручную кассиром).
    • Скидка №2: «Скидка по карте лояльности 5%». Способ предоставления — Процент (5%). В области применения укажем «В строке». В условиях предоставления укажем «Предъявление дисконтной карты».
  4. В настройках группы распределим приоритеты: Скидка №1 должна стоять выше в списке (иметь меньший порядок), чтобы система сначала применила 10%, а затем на уменьшенную базу начислила 5% по карте.

При корректной работе платформы кассиру достаточно считать карту (автоматически сработает 5% на весь чек), а затем выбрать строку с «Товаром 1», нажать кнопку «Управляемые скидки» и активировать скидку 10%. Система сама пересчитает строку последовательно.

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

Решение 4. Программное исправление через расширение конфигурации

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

Рассмотрим пример кода, который необходимо скорректировать в модуле формы ФормаРМКУправляемая. Проблема кроется в процедуре расчета скидок, где контекст строки теряется при передаче параметров. Мы можем переопределить поведение системы, перехватив обработку расчета:


&Вместо("РассчитатьСкидкиНаценки")
Процедура Мой_РассчитатьСкидкиНаценки(ПараметрыРасчета)
    
    // Получаем текущую строку табличной части РМК
    ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
    
    Если ТекущиеДанные <> Неопределено Тогда
        // Проверяем, запущена ли обработка управляемой скидки для конкретной строки
        Если ПараметрыРасчета.Свойство("ОбластьПрименения") И ПараметрыРасчета.ОбластьПрименения = ПредопределенноеЗначение("Перечисление.ОбластиПримененияСкидокНаценок.ВСтроке") Тогда
            
            // Ограничиваем расчет только идентификатором текущей выделенной строки
            ПараметрыРасчета.Вставить("ИдентификаторСтроки", ТекущиеДанные.ИдентификаторСтроки);
            
        КонецЕсли;
    КонецЕсли;
    
    // Вызываем оригинальный расчет с модифицированными параметрами контекста
    ПродолжитьВызов(ПараметрыРасчета);
    
КонецПроцедуры

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

Подведение итогов

Мы проанализировали несколько путей обхода ограничения РМК в «1С:Розница 2.2». Если у вас нет возможности привлекать программиста для написания расширения (Решение 4), наиболее надежным и простым методом будет **Решение 1 (разделение чеков)** или **Решение 2 (ввод суммарного процента 14.5% вручную)**.

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

← На главную