В практике торговых предприятий часто возникает задача реализации сложных маркетинговых схем. Типичный пример: одна и та же скидка (например, 25%) в зависимости от условий должна либо суммироваться с другими скидками (применяться к первоначальной цене), либо умножаться (применяться к остатку после предыдущих скидок). В типовой конфигурации 1С:Управление торговлей 11.5 логика взаимодействия скидок определяется правилами группы, в которую они входят, что создает определенные трудности при настройке. Рассмотрим, как решить эту задачу максимально эффективно.
В справочнике СкидкиНаценки логика взаимодействия привязана к группе, что иногда осложняет продажу по различным ценам в зависимости от количества. Мы можем выбрать один из вариантов:
Проблема автора заключается в том, что один и тот же элемент справочника не может находиться в двух группах одновременно. Разберем три способа обхода этого ограничения.
Проанализируем самый простой вариант. Мы можем выполнить быструю установку скидок и создать два идентичных элемента в справочнике СкидкиНаценки:
Однако, если наша скидка является расчетной или данные о ней должны выгружаться во внешние системы (сайт, мобильное приложение) под единым идентификатором, возникает проблема уникальности. Чтобы решить ее, воспользуемся механизмом Дополнительных реквизитов.
Выясним, как это настроить: добавим для справочника СкидкиНаценки доп. реквизит «Внешний ID». Присвоим обоим элементам одинаковое значение в этом поле. Теперь при программной обработке или выгрузке отчетов мы сможем группировать эти скидки по нашему пользовательскому идентификатору, игнорируя тот факт, что в базе 1С это разные ссылки.
Рассмотрим ситуацию, когда можно обойтись стандартной иерархией без дублирования. Система обрабатывает дерево скидок сверху вниз. Мы можем создать корневую группу с правилом Последовательное применение. Внутри нее создадим подгруппу с правилом Сложение.
Посмотрим на алгоритм расчета в таком случае:
Этот метод требует аккуратной настройки Приоритетов (проверить результат поможет подробный отчет по скидкам). Скидки с более высоким приоритетом обрабатываются раньше.
Если логика выбора между «сложением» и «умножением» динамическая (например, зависит от состава корзины), наиболее надежным вариантом будет использование программного кода. В УТ 11.5 предусмотрен тип скидки «Наценка (скидка) процентом (расчетная)».
Проанализируем ситуацию: при выборе этого типа в карточке скидки появляется возможность подключить внешнюю обработку. Это позволяет нам полностью контролировать математику расчета. Разберем пример логики, которую можно реализовать в коде обработки:
// Пример логики в экспортной процедуре расчета
Процедура РассчитатьСкидку(ПараметрыРасчета) Экспорт
БазоваяЦена = ПараметрыРасчета.Цена;
ТекущаяЦена = ПараметрыРасчета.ЦенаПослеПредыдущихСкидок;
// Если условие требует сложения (от изначальной суммы)
Если ПараметрыРасчета.УсловиеСложенияВыполнено Тогда
СуммаСкидки = БазоваяЦена * 0.25;
// Если условие требует умножения (от остатка)
Иначе
СуммаСкидки = ТекущаяЦена * 0.25;
КонецЕсли;
ПараметрыРасчета.Результат = СуммаСкидки;
КонецПроцедуры
Этот способ позволяет избежать создания лишних элементов в справочнике и дает полную свободу действий. Мы используем объект СкидкиНаценки как "оболочку", а всю математику выносим во внешний файл. Это упрощает обновление конфигурации, так как типовые механизмы остаются нетронутыми.
При работе со скидками в УТ 11.5 необходимо помнить о следующих моментах:
Подведем итог: если вам нужна простая настройка «здесь и сейчас», используйте дублирование элементов с общим доп. реквизитом для идентификации. Если же требуется гибкость и вы не хотите загромождать справочник — выбирайте внешнюю обработку для расчетной скидки. Это позволит реализовать любую, даже самую сложную математическую модель применения скидок, сохраняя чистоту информационной базы.