В конфигурации 1С:Управление торговлей 10.3 накопительная система скидок является мощным инструментом лояльности. Однако многие администраторы и программисты сталкиваются с классической проблемой: когда клиент накапливает максимальный порог скидки (например, 15%), эта скидка применяется ко всему чеку, включая низкомаржинальные товары (например, гвозди или цемент), наценка на которые может составлять всего 10%. В такой ситуации продажа становится убыточной.
Рассмотрим детально, почему типовой механизм ведет себя именно так, и разберем по шагам доступные способы решения этой задачи — от настройки параметров системы до внесения изменений в программный код.
Проанализируем логику работы программы. В Учетной политике (раздел "Скидки") при включении флага Использовать накопительные скидки система начинает отдавать приоритет документу Установка порогов накопительных скидок. Проблема заключается в том, что этот документ не имеет табличной части для выбора конкретных товаров — он устанавливает общий процент, который рассчитывается исходя из общего объема продаж по дисконтной карте клиента.
Как отмечают пользователи, документ Установка скидок номенклатуры, где можно было бы задать 5% на конкретный товар, часто игнорируется системой, если по карте уже положено 15%. Это происходит из-за того, что в старых редакциях УТ 10.3 алгоритм поиска скидки по накопительной карте срабатывает в последнюю очередь и жестко перезаписывает процент в строке документа.
Попробуем решить задачу без программирования, используя механизм совместного применения. В УТ 10.3 существует справочник Типы скидок и наценок, который управляет тем, как скидки взаимодействуют друг с другом. Выясним, можно ли заставить систему выбирать минимальное значение.
Типы скидок и наценок.Минимум.Установка скидок номенклатуры, выберем в нем нужную группу товаров (например, "Гвозди") и установим процент 5%.Минимум.Важный нюанс: Чтобы эта схема заработала, необходимо, чтобы обе скидки (и накопительная, и товарная) рассматривались системой в рамках одного алгоритма расчета. В некоторых релизах УТ 10.3 накопительная скидка вынесена в отдельный блок вычислений, и настройки совместного применения на нее не влияют. Если после настройки система продолжает выводить 15%, перейдем к следующему методу.
Разберем ситуацию, когда нам нужно, чтобы одна скидка «вытесняла» другую. В системе существует справочник Группы скидок. Мы можем попробовать объединить наши условия в одну группу.
Если мы установим для группы правило Вытеснение, то программа будет искать скидку с максимальным приоритетом. Однако для нашей задачи это не совсем подходит, так как нам нужно не просто выбрать одну из двух, а ограничить верхний предел. Тем не менее, использование ограничений по сумме в справочнике типов скидок иногда позволяет косвенно влиять на результат, хотя это редко применимо к процентам на конкретную строку.
Иногда ограничение можно установить на уровне прав доступа или настроек торговой точки. Посмотрим на дополнительные права пользователей:
Сервис — Пользователи — Настройка дополнительных прав.Максимальный процент скидки.Внимание: Этот параметр чаще всего ограничивает ручные скидки, которые менеджер вводит пальцами в поле "Скидка". На автоматический расчет накопительной системы он может не влиять, но проверить данную настройку стоит, так как в некоторых кастомизированных версиях алгоритм обращается к этому значению.
Если типовые настройки не приносят результата (что часто случается в УТ 10.3 из-за жесткой логики модуля РаботаСДисконтнымиКартами), наиболее надежным способом будет небольшая модификация кода. Нам нужно внедрить условие: "Если товар принадлежит к определенной группе или имеет определенное свойство, то итоговая скидка не может превышать заданный порог".
Рассмотрим пример реализации в общем модуле. Обычно расчет происходит в процедурах, вызываемых при изменении дисконтной карты или при расчете автоматических скидок. Найдем место, где переменная ПроцентСкидки присваивается строке документа.
Пример логики кода, который можно внедрить:
// Вставьте этот код в процедуру расчета скидок (например, перед заполнением строки чека)
МаксимальныйПорог = 0;
Если СтрокаТабличнойЧасти.Номенклатура.ПринадлежитЭлементу(ГруппаГвозди) Тогда
МаксимальныйПорог = 5;
ИначеЕсли СтрокаТабличнойЧасти.Номенклатура.ПринадлежитЭлементу(ГруппаЦемент) Тогда
МаксимальныйПорог = 3;
КонецЕсли;
Если МаксимальныйПорог > 0 Тогда
// Выбираем минимальное между накопленным процентом и нашим ограничением
СтрокаТабличнойЧасти.ПроцентСкидки = Мин(СтрокаТабличнойЧасти.ПроцентСкидки, МаксимальныйПорог);
КонецЕсли;
Проанализируем этот код: мы проверяем принадлежность товара к группе "низкомаржинальных" товаров. Если товар там найден, функция Мин() гарантирует, что даже если у клиента по карте накоплено 15%, в колонку ПроцентСкидки попадет только 5% (или 3% для цемента). Если же у клиента накоплено всего 2%, то применится его честная скидка в 2%, так как она меньше порога.
Чтобы не "зашивать" конкретные группы товаров в код программы (что считается плохим тоном в разработке), лучше использовать Свойства номенклатуры.
Посмотрим, как изменится наш программный код:
// Получаем значение свойства "Максимальный процент скидки" для текущего товара
ОграничениеСкидки = РаботаСНоменклатурой.ПрочитатьЗначениеСвойства(СтрокаТабличнойЧасти.Номенклатура, СвойствоМаксСкидка);
Если ЗначениеЗаполнено(ОграничениеСкидки) И ОграничениеСкидки > 0 Тогда
СтрокаТабличнойЧасти.ПроцентАвтоматическихСкидок = Мин(СтрокаТабличнойЧасти.ПроцентАвтоматическихСкидок, ОграничениеСкидки);
КонецЕсли;
Этот метод гораздо гибче: менеджеры по закупкам смогут сами регулировать ограничения скидок, просто меняя значения в карточке товара, не обращаясь к программисту за правкой кода.
Мы выяснили, что в типовой 1С:Управление торговлей 10.3 накопительная система имеет приоритет, который сложно ограничить стандартными инструментами без влияния на весь чек целиком. Для решения задачи "накопительная скидка на всё, но не более X% на конкретный товар" оптимальным путем является:
Минимум (актуально для последних релизов).Использование программной доработки через свойства позволит вам сохранить прозрачность учета и защитить маржинальность бизнеса при работе с накопительными дисконтными картами.