Как в 1С:Управление торговлей 11.4 настроить акцию «4 товара за фиксированную сумму»?

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

Многие пользователи и программисты, работающие в 1С:Управление торговлей 11.4, сталкиваются с задачей реализации маркетинговых акций, где цена товара зависит от общего количества выбранных позиций в документе. Классический пример: «4 штуки любого товара из группы за 999 рублей». В данной статье мы разберем, почему типовой механизм скидок не всегда справляется с этой задачей напрямую и какие архитектурные подходы помогут вам достичь нужного результата.

Анализ работы типового механизма скидок

Прежде всего, давайте проанализируем, как 1С обрабатывает автоматические скидки. Стандартный функционал системы ориентирован на работу с конкретной строкой документа. Это означает, что для системы товары в корзине воспринимаются как набор независимых позиций. Система не умеет «смотреть» на весь документ как на единый объект для пересчета совокупной стоимости «комплекта», если этот комплект не описан заранее в справочнике номенклатуры.

Когда мы пытаемся использовать настройку Специальная цена, мы сталкиваемся с тем, что система требует привязки к конкретному Виду цены. Если ваши товары имеют разные базовые цены, попытка установить единую итоговую стоимость через одну настройку скидки приведет к логической ошибке, так как 1С будет вычислять разницу между текущей ценой строки и «акционной» ценой, что не даст итогового «круглого» числа в 999 рублей для всего набора.

Решение 1: Использование «Наборов» (Комплектов)

Это самый «чистый» способ с точки зрения методологии учета. Если ваш состав товаров, участвующих в акции, стабилен, рассмотрите использование вида номенклатуры Набор-комплект.

  1. Создайте новую номенклатурную позицию с типом Набор.
  2. Добавьте в состав набора 4 единицы необходимых товаров.
  3. Установите Вид цены для этого набора на уровне 999 рублей.
  4. При продаже менеджер добавляет в Заказ клиента не отдельные товары, а сам набор. Система автоматически распределит стоимость 999 рублей между составляющими набора пропорционально их долям стоимости.

Решение 2: Использование соглашений с клиентами

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

В соглашении можно задать специфические Виды цен, где цена за единицу товара будет уже рассчитана как 249,75 рубля (исходя из 999/4). Этот метод эффективен, так как при выборе такого соглашения в документе, 1С подставит акционную цену автоматически, минуя сложную логику Автоматических скидок (наценок).

Решение 3: Программная реализация (Обработка)

Если вышеуказанные методы не подходят из-за высокой динамики цен или непредсказуемого состава корзины, единственным гибким вариантом остается написание внешней обработки или расширения. Разберем, как это можно реализовать алгоритмически:

  1. При нажатии кнопки «Рассчитать скидки» (или при записи документа) запускается процедура перебора строк табличной части Товары.
  2. Система проверяет Вид номенклатуры для товаров в документе.
  3. Если количество товаров одного вида достигло 4, алгоритм высчитывает общую сумму и принудительно устанавливает цену или скидку для каждой из 4-х строк так, чтобы в сумме они дали 999 рублей.

Для программной реализации вам потребуется использовать событие ПередЗаписью или обработчик команды табличной части. Примерная логика кода для пересчета:


// Пример псевдокода для пересчета скидки в строках
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    Если СтрокаТЧ.Номенклатура.ВидНоменклатуры = НужныйВид Тогда
        // Расчет суммы скидки для приведения цены к 249.75
        СуммаСкидки = СтрокаТЧ.Цена - 249.75;
        СтрокаТЧ.СуммаСкидки = СуммаСкидки;
        СтрокаТЧ.Сумма = 249.75;
    КонецЕсли;
КонецЦикла;

Итоги и рекомендации

Подводя итог, можно сделать следующие выводы для вашей задачи:

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

← На главную