Как реализовать автоматическую скидку по суммарному количеству товаров в документе 1С:УТ 11.5?

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

В практике автоматизации розничной и оптовой торговли часто возникает задача настройки сложных автоматических скидок. Одна из наиболее распространенных ситуаций — когда скидка должна зависеть не от количества конкретной позиции в строке, а от суммарного количества товаров определенных групп или категорий во всем документе. Например, если клиент покупает 7 единиц одного товара и 4 единицы другого из той же группы, система должна увидеть общее количество (11 единиц) и применить соответствующий порог скидки.

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

Способ 1. Реализация стандартными средствами конфигурации

Прежде чем приступать к разработке программного кода, проанализируем возможности типового функционала. В 1С:УТ 11.5 предусмотрены условия предоставления скидок, которые могут анализировать весь состав документа.

Разберем по шагам, как настроить такую скидку:

  1. Создадим новую скидку (наценку) в справочнике Скидки (наценки).
  2. На закладке Условия предоставления добавим новое условие с типом За разовый объем продаж.
  3. В настройках условия выберем вариант Количество в документе не менее. Это ключевой момент: система будет суммировать количество всех позиций, подходящих под отбор, а не проверять каждую строку отдельно.
  4. Укажем необходимое количество (например, 11 единиц для скидки 2%).
  5. Важно правильно настроить Отбор номенклатуры. Если мы укажем группу номенклатуры в условии, система просуммирует количество только тех товаров, которые входят в эту группу.

Проанализируем ситуацию, когда порогов скидки несколько (линейка скидок). В этом случае рекомендуется создать несколько элементов справочника (1% при количестве > 5, 2% при количестве > 10) и объединить их в группу с вариантом совместного применения Вытеснение. При этом скидка с большим процентом должна иметь более высокий приоритет.

Способ 2. Программный расчет во внешней обработке

Если логика скидок слишком сложна для стандартного конструктора (например, тысячи условий или зависимость от дополнительных реквизитов), разработчики используют внешние обработки поставляемого типа РасчетАвтоматическихСкидок.

Рассмотрим подробнее механизм работы такой обработки. Основная логика сосредоточена в функции Рассчитать. Основная сложность здесь заключается в том, что расчет часто инициируется для конкретной строки, но нам нужно видеть контекст всей табличной части документа.

Выясним причину, по которой программисты иногда заходят в тупик: кажется, что внешняя обработка оперирует только текущей строкой. Однако структура ПараметрыРасчета, передаваемая в обработку, содержит исчерпывающую информацию.

Проанализируем состав структуры ПараметрыРасчета:

Посмотрим на пример кода, который позволяет получить данные о количестве товаров по определенному условию внутри внешней обработки:


// Пример получения данных о суммарном количестве из ТаблицыТоваров
ТаблицаТоваров = ПараметрыРасчета.ТаблицаТоваров;

// Группируем таблицу по нужному признаку (например, по группе номенклатуры)
ТаблицаТоваров.Свернуть("Номенклатура, ГруппаНоменклатуры", "Количество");

// Вычисляем общее количество для применения логики
ОбщееКоличествоПоГруппе = 0;
Для Каждого СтрокаТЧ Из ТаблицаТоваров Цикл
    Если СтрокаТЧ.ГруппаНоменклатуры = НужнаяГруппа Тогда
        ОбщееКоличествоПоГруппе = ОбщееКоличествоПоГруппе + СтрокаТЧ.Количество;
    КонецЕсли;
КонецЦикла;

Использование параметра ВыполненныеУсловия позволяет оптимизировать расчет. Если система уже определила, что условие по количеству выполнено, мы можем просто найти соответствующую запись в этой таблице по ключу связи и применить процент скидки ко всем подходящим строкам.

Оптимизация производительности при большом количестве скидок

Рассмотрим ситуацию, когда в базе данных создано несколько тысяч скидок. При каждом изменении строки документа система пересчитывает все автоматические скидки, что может привести к значительным задержкам в работе пользователя (особенно в РМК — рабочем месте кассира).

Для оптимизации рекомендуем следующие подходы:

  1. Использование Сегментов номенклатуры: Проверка вхождения товара в СегментНоменклатуры работает значительно быстрее, чем проверка иерархии справочника Номенклатура. Сегменты хранятся в плоских таблицах, что ускоряет запросы.
  2. Дополнительные реквизиты: Вместо создания тысяч отдельных объектов скидок для каждого филиала или группы товаров, создайте одну универсальную скидку с алгоритмом во внешней обработке. Этот алгоритм может считывать пороги и проценты из дополнительных реквизитов номенклатуры или партнеров.
  3. Кэширование данных: Если ваша обработка делает запросы к базе данных (например, для получения остатков или цен конкурентов), обязательно реализуйте кэширование результатов в рамках одного сеанса расчета.

Диагностика и проверка

После настройки скидок, будь то типовой механизм или внешняя обработка, важно убедиться в корректности их работы. В любом документе продажи (Заказ клиента, Реализация товаров и услуг, Чек ККМ) воспользуйтесь отчетом "Примененные скидки".

Этот отчет показывает не только итоговый результат, но и список всех скидок-кандидатов. Если скидка по суммарному количеству не применилась, отчет подскажет причину: например, "не выполнено условие по количеству (не хватает 1 ед.)". Это лучший способ понять, видит ли система всю корзину товаров или анализирует строки обособленно.

Таким образом, для реализации скидки по нескольким строкам в УТ 11.5 эффективнее всего использовать типовое условие Количество в документе не менее с отбором по номенклатуре, а при необходимости сложной программной логики — использовать доступ к ТаблицеТоваров через параметры внешней обработки.

← На главную