В практической работе розничных магазинов часто возникает потребность в гибком комбинировании скидок непосредственно в момент оформления продажи кассиром. Например, покупатель приобретает один из товаров в кредит (что дает ему право на скидку 10%) и одновременно предъявляет личную дисконтную карту лояльности (дающую дополнительную скидку 5%). При этом остальные товары в чеке должны получить только скидку по карте лояльности.
Попытка реализовать эту схему в типовом рабочем месте кассира (РМК) конфигурации «1С:Розница 2.2» с помощью механизма управляемых скидок часто приводит к неожиданной проблеме: скидка, для которой явно задана область применения «В строке», всё равно распределяется и применяется ко всему документу (ко всем позициям в табличной части Товары). Выясним причину такого поведения системы и подробно разберем все возможные варианты решения этой задачи.
Для начала проанализируем, как должна работать система в идеальных условиях. В 1С:Розница управляемые скидки — это скидки, которые рассчитываются не автоматически, а по требованию кассира (нажатием кнопки в РМК). Если область применения установлена «В строке», программа должна применять расчет только к выделенной в данный момент товарной позиции.
Однако в релизах «1С:Розница» линеек 2.2 и 2.3 присутствует известная системная ошибка (баг платформенного кода логики РМК). При вызове окна управляемых скидок для конкретной строки механизм проведения расчета игнорирует контекст текущей строки и пересчитывает скидку для всей табличной части. В результате товар, который не должен был участвовать в акции, получает незапланированную скидку.
Рассмотрим, какими путями можно решить эту задачу, начиная с организационных обходов и заканчивая техническим исправлением кода.
Это самое простое и быстрое решение, не требующее привлечения программистов и изменения настроек программы. Если у клиента в корзине есть товар со сложным сочетанием скидок («Товар 1» с 10% по кредиту + 5% по карте) и обычный товар («Товар 2» только с 5% по карте), мы можем оформить их продажу двумя разными операциями:
Преимущества: Полная совместимость с типовой конфигурацией без необходимости доработок; корректное отражение скидок в отчетах.
Недостатки: Увеличивается время обслуживания покупателя на кассе; тратится больше кассовой ленты; покупатель получает два фискальных документа вместо одного, что может вызвать у него вопросы.
Вместо использования справочника управляемых скидок мы можем прибегнуть к стандартному механизму ввода произвольной ручной скидки на строку. Этот функционал вызывается в РМК с помощью комбинации клавиш Shift + F8 (или нажатием кнопки «Ручные скидки» -> «Скидка процентом в строке»).
Поскольку скидки должны применяться последовательно (сначала вычитается 10%, а затем из оставшейся суммы вычитается еще 5%), мы не можем просто сложить проценты (10% + 5% = 15% — это неверно). Нам необходимо рассчитать совокупный (эффективный) процент скидки.
Проанализируем математическую модель расчета:
Допустим, базовая цена товара составляет 1000 рублей.
При последовательном применении скидок расчет выглядит так:
1000 - 10% = 900 рублей.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%.
Кассир может действовать по следующему алгоритму:
Преимущества: Продажа оформляется одним чеком; не требует программирования.
Недостатки: Человеческий фактор (кассир должен помнить формулу или иметь под рукой таблицу готовых расчетов); сложно контролировать правомерность предоставления таких скидок при последующем аудите продаж.
Если мы хотим автоматизировать процесс и избежать ручных расчетов кассира, нам нужно правильно настроить дерево скидок в справочнике Скидки (наценки, ограничения). Рассмотрим этот процесс по шагам:
Вариант совместного применения выберем значение «Последовательное применение».При корректной работе платформы кассиру достаточно считать карту (автоматически сработает 5% на весь чек), а затем выбрать строку с «Товаром 1», нажать кнопку «Управляемые скидки» и активировать скидку 10%. Система сама пересчитает строку последовательно.
Примечание: Если из-за вышеупомянутого бага скидка все равно применяется ко всему чеку, перейдем к Решению 4.
Чтобы заставить управляемые скидки по строке работать строго локально, не затрагивая остальные позиции документа, разработчики 1С используют механизм расширений. Это позволяет исправить ошибку в коде формы РМК без снятия конфигурации с поддержки.
Рассмотрим пример кода, который необходимо скорректировать в модуле формы ФормаРМКУправляемая. Проблема кроется в процедуре расчета скидок, где контекст строки теряется при передаче параметров. Мы можем переопределить поведение системы, перехватив обработку расчета:
&Вместо("РассчитатьСкидкиНаценки")
Процедура Мой_РассчитатьСкидкиНаценки(ПараметрыРасчета)
// Получаем текущую строку табличной части РМК
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Проверяем, запущена ли обработка управляемой скидки для конкретной строки
Если ПараметрыРасчета.Свойство("ОбластьПрименения") И ПараметрыРасчета.ОбластьПрименения = ПредопределенноеЗначение("Перечисление.ОбластиПримененияСкидокНаценок.ВСтроке") Тогда
// Ограничиваем расчет только идентификатором текущей выделенной строки
ПараметрыРасчета.Вставить("ИдентификаторСтроки", ТекущиеДанные.ИдентификаторСтроки);
КонецЕсли;
КонецЕсли;
// Вызываем оригинальный расчет с модифицированными параметрами контекста
ПродолжитьВызов(ПараметрыРасчета);
КонецПроцедуры
Такой программный код принудительно передает в расчетный модуль идентификатор строки, благодаря чему скидка рассчитывается строго для выделенного товара, не затрагивая другие позиции в чеке. Это позволяет полноценно использовать схему, описанную в Решении 3.
Мы проанализировали несколько путей обхода ограничения РМК в «1С:Розница 2.2». Если у вас нет возможности привлекать программиста для написания расширения (Решение 4), наиболее надежным и простым методом будет **Решение 1 (разделение чеков)** или **Решение 2 (ввод суммарного процента 14.5% вручную)**.
Если же бизнес-процессы требуют частого совмещения различных типов скидок непосредственно на кассе, рекомендуется установить готовое расширение конфигурации или рассмотреть возможность перехода на современную редакцию программы «1С:Розница 3.0», где архитектура скидок была полностью переработана, а управление построчными скидками в РМК работает стабильно и корректно по умолчанию.