Как настроить скидку на комплект товаров с учетом кратности в 1С:Управление торговлей 11

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

В процессе автоматизации розничных и оптовых продаж часто возникает задача реализации сложных маркетинговых акций, включая механизм выдачи подарков. Одной из таких задач (помимо работы с промокодами) является предоставление скидки на «комплект» при условии, что товары продаются как отдельные позиции, но при наборе определенного количества срабатывает бонус или требуется учет промокодов. Особую сложность вызывает условие кратности: когда скидка должна применяться только к целым комплектам, оставляя «хвосты» (остатки, не собранные в полный набор) по полной цене. В этой статье мы подробно разберем, как реализовать такой механизм и индивидуальные скидки в 1С:Управление торговлей 11.4 и 11.5.

Проблема стандартного механизма «За комплектность покупки»

Для начала проанализируем, что предлагает нам типовая конфигурация. В справочнике СкидкиНаценки существует условие предоставления «За комплектность покупки». Мы можем указать перечень номенклатуры и минимальное количество каждого товара, которое должно присутствовать в документе.

Однако здесь мы сталкиваемся с серьезным ограничением: стандартный механизм работает по принципу триггера «Да/Нет». Если условие выполнено (например, куплено 5 единиц «Мыла» и 5 единиц «Мочалок»), программа применяет процент скидки ко всем единицам этих товаров в строках документа. Если покупатель берет 9 единиц «Мыла» и 10 «Мочалок», типовая скидка 20% применится ко всем 19 позициям, в то время как бизнес-логика требует применить ее только к 5 единицам каждого товара, а оставшиеся 4 «Мыла» и 5 «Мочалок» продать без скидки.

Способ 1: Использование механизма «Наборов номенклатуры»

Рассмотрим вариант использования справочника Номенклатура с типом «Набор». Это позволяет продавать комплект как единую сущность, которая в чеке или накладной может распадаться на комплектующие.

  1. Создадим номенклатурную позицию с типом Набор-пакет.
  2. В настройках укажем состав: например, «Щетка» — 3 шт., «Паста» — 2 шт., «Нить» — 1 шт.
  3. Установим цену на этот набор или настроим автоматическую скидку, которая будет срабатывать именно при выборе этой позиции.

Плюсы: Это типовой функционал, корректно отрабатывающий кратность (сколько наборов добавили, на столько и получили скидку).

Минусы: Менеджерам или кассирам придется вручную добавлять в документ именно «Набор». Если они просто подберут товары по отдельности, программа не «узнает» в них комплект автоматически. Для решения этой проблемы потребуется разработка внешней обработки «Поиск и замена товаров наборами», которая будет сканировать табличную часть перед расчетом скидок.

Способ 2: Внешняя обработка расчета скидок

Выясним, как использовать возможности системы по подключению внешних алгоритмов. В 1С:УТ 11 предусмотрена возможность указать способ предоставления скидки через Внешнюю обработку. Это самый гибкий путь для программиста, позволяющий реализовать любую логику без изменения основной конфигурации.

Проанализируем пример логики, которую необходимо заложить в такую обработку. Нам нужно проверить количества Na, Nb, Nc для товаров a, b, c. Допустим, состав комплекта определяется коэффициентами n, m, k.

Алгоритм будет выглядеть следующим образом:


// Пример логики расчета количества полных комплектов
КоличествоКомплектов = Цел(Минимум(КоличествоТовараА / n, КоличествоТовараБ / m, КоличествоТовараВ / k));

Если КоличествоКомплектов > 0 Тогда
    КоличествоСоСкидкойА = КоличествоКомплектов * n;
    КоличествоСоСкидкойБ = КоличествоКомплектов * m;
    КоличествоСоСкидкойВ = КоличествоКомплектов * k;
    
    // Далее необходимо распределить сумму скидки по строкам
КонецЕсли;

Главная сложность здесь заключается в том, что расчет скидок в 1С:УТ происходит по строкам. Чтобы одна часть товара в строке была со скидкой, а другая — без, нам придется программно выполнять Line Splitting (расщепление строк).

Способ 3: Реализация через Расширение и процедуру разбиения строк

Разберем по шагам, как реализовать наиболее корректное решение через расширение конфигурации. Наша задача — перехватить момент расчета автоматических скидок и модифицировать табличную часть документа.

Рассмотрим примерное техническое задание для реализации:

  1. Создаем расширение, в котором подписываемся на процедуру расчета скидок (например, в модуле СкидкиНаценкиСервер).
  2. Пишем процедуру, которую назовем, к примеру, ОбработатьКратностьКомплектов.
  3. Программа должна найти в документе все позиции, входящие в акцию, и вычислить максимально возможное число полных комплектов.
  4. Если найдено, например, 2 полных комплекта, а товара в строке больше, мы программно разбиваем одну строку на две: в первой оставляем количество, кратное комплекту, и применяем скидку, во второй — остаток без скидки.

Проанализируем пример кода для расчета суммы скидки (фрагмент логики):


Процедура Тройник(ТоварыДокумента, ПараметрыАкции) 
    // a, b, c - коды номенклатуры
    // n, m, k - требуемое количество для одного комплекта
    
    // 1. Собираем текущие остатки по товарам в документе
    // 2. Вычисляем МаксКомплектов = Мин(ФактА/n, ФактБ/m, ФактВ/k)
    
    Если МаксКомплектов >= 1 Тогда
        Для Каждого СтрокаТЧ Из ТоварыДокумента Цикл
            Если СтрокаТЧ.Номенклатура = ТоварА Тогда
                // Проверяем, нужно ли разбивать строку
                Если СтрокаТЧ.Количество > (МаксКомплектов * n) Тогда
                    НоваяСтрока = ТоварыДокумента.Добавить();
                    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
                    СтрокаТЧ.Количество = МаксКомплектов * n;
                    НоваяСтрока.Количество = НоваяСтрока.Количество - СтрокаТЧ.Количество;
                КонецЕсли;
                // Применяем скидку только к целевой строке
                СтрокаТЧ.СуммаСкидки = (СтрокаТЧ.Цена * СтрокаТЧ.Количество) * (ПроцентСкидки / 100);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Важные нюансы при внедрении

При реализации данного механизма следует учитывать несколько критических моментов:

Подводя итог, можно сказать, что хотя в 1С:УТ 11.4 и 11.5 нет прямой галочки «Учитывать кратность» для условий комплектности, система обладает достаточной гибкостью для реализации этого требования. Выбор между «Наборами» и программным «Расщеплением строк» зависит от готовности менять бизнес-процесс подбора товаров в документ.

← На главную