В процессе автоматизации розничных и оптовых продаж часто возникает задача реализации сложных маркетинговых акций, включая механизм выдачи подарков. Одной из таких задач (помимо работы с промокодами) является предоставление скидки на «комплект» при условии, что товары продаются как отдельные позиции, но при наборе определенного количества срабатывает бонус или требуется учет промокодов. Особую сложность вызывает условие кратности: когда скидка должна применяться только к целым комплектам, оставляя «хвосты» (остатки, не собранные в полный набор) по полной цене. В этой статье мы подробно разберем, как реализовать такой механизм и индивидуальные скидки в 1С:Управление торговлей 11.4 и 11.5.
Для начала проанализируем, что предлагает нам типовая конфигурация. В справочнике СкидкиНаценки существует условие предоставления «За комплектность покупки». Мы можем указать перечень номенклатуры и минимальное количество каждого товара, которое должно присутствовать в документе.
Однако здесь мы сталкиваемся с серьезным ограничением: стандартный механизм работает по принципу триггера «Да/Нет». Если условие выполнено (например, куплено 5 единиц «Мыла» и 5 единиц «Мочалок»), программа применяет процент скидки ко всем единицам этих товаров в строках документа. Если покупатель берет 9 единиц «Мыла» и 10 «Мочалок», типовая скидка 20% применится ко всем 19 позициям, в то время как бизнес-логика требует применить ее только к 5 единицам каждого товара, а оставшиеся 4 «Мыла» и 5 «Мочалок» продать без скидки.
Рассмотрим вариант использования справочника Номенклатура с типом «Набор». Это позволяет продавать комплект как единую сущность, которая в чеке или накладной может распадаться на комплектующие.
Набор-пакет.Плюсы: Это типовой функционал, корректно отрабатывающий кратность (сколько наборов добавили, на столько и получили скидку).
Минусы: Менеджерам или кассирам придется вручную добавлять в документ именно «Набор». Если они просто подберут товары по отдельности, программа не «узнает» в них комплект автоматически. Для решения этой проблемы потребуется разработка внешней обработки «Поиск и замена товаров наборами», которая будет сканировать табличную часть перед расчетом скидок.
Выясним, как использовать возможности системы по подключению внешних алгоритмов. В 1С:УТ 11 предусмотрена возможность указать способ предоставления скидки через Внешнюю обработку. Это самый гибкий путь для программиста, позволяющий реализовать любую логику без изменения основной конфигурации.
Проанализируем пример логики, которую необходимо заложить в такую обработку. Нам нужно проверить количества Na, Nb, Nc для товаров a, b, c. Допустим, состав комплекта определяется коэффициентами n, m, k.
Алгоритм будет выглядеть следующим образом:
// Пример логики расчета количества полных комплектов
КоличествоКомплектов = Цел(Минимум(КоличествоТовараА / n, КоличествоТовараБ / m, КоличествоТовараВ / k));
Если КоличествоКомплектов > 0 Тогда
КоличествоСоСкидкойА = КоличествоКомплектов * n;
КоличествоСоСкидкойБ = КоличествоКомплектов * m;
КоличествоСоСкидкойВ = КоличествоКомплектов * k;
// Далее необходимо распределить сумму скидки по строкам
КонецЕсли;
Главная сложность здесь заключается в том, что расчет скидок в 1С:УТ происходит по строкам. Чтобы одна часть товара в строке была со скидкой, а другая — без, нам придется программно выполнять Line Splitting (расщепление строк).
Разберем по шагам, как реализовать наиболее корректное решение через расширение конфигурации. Наша задача — перехватить момент расчета автоматических скидок и модифицировать табличную часть документа.
Рассмотрим примерное техническое задание для реализации:
СкидкиНаценкиСервер).ОбработатьКратностьКомплектов.Проанализируем пример кода для расчета суммы скидки (фрагмент логики):
Процедура Тройник(ТоварыДокумента, ПараметрыАкции)
// a, b, c - коды номенклатуры
// n, m, k - требуемое количество для одного комплекта
// 1. Собираем текущие остатки по товарам в документе
// 2. Вычисляем МаксКомплектов = Мин(ФактА/n, ФактБ/m, ФактВ/k)
Если МаксКомплектов >= 1 Тогда
Для Каждого СтрокаТЧ Из ТоварыДокумента Цикл
Если СтрокаТЧ.Номенклатура = ТоварА Тогда
// Проверяем, нужно ли разбивать строку
Если СтрокаТЧ.Количество > (МаксКомплектов * n) Тогда
НоваяСтрока = ТоварыДокумента.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
СтрокаТЧ.Количество = МаксКомплектов * n;
НоваяСтрока.Количество = НоваяСтрока.Количество - СтрокаТЧ.Количество;
КонецЕсли;
// Применяем скидку только к целевой строке
СтрокаТЧ.СуммаСкидки = (СтрокаТЧ.Цена * СтрокаТЧ.Количество) * (ПроцентСкидки / 100);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
При реализации данного механизма следует учитывать несколько критических моментов:
Вытеснение или Умножение, в зависимости от маркетинговой политики предприятия.Подводя итог, можно сказать, что хотя в 1С:УТ 11.4 и 11.5 нет прямой галочки «Учитывать кратность» для условий комплектности, система обладает достаточной гибкостью для реализации этого требования. Выбор между «Наборами» и программным «Расщеплением строк» зависит от готовности менять бизнес-процесс подбора товаров в документ.