Многие пользователи и программисты, работающие в 1С:Управление торговлей 11.4, сталкиваются с задачей реализации маркетинговых акций, где цена товара зависит от общего количества выбранных позиций в документе. Классический пример: «4 штуки любого товара из группы за 999 рублей». В данной статье мы разберем, почему типовой механизм скидок не всегда справляется с этой задачей напрямую и какие архитектурные подходы помогут вам достичь нужного результата.
Прежде всего, давайте проанализируем, как 1С обрабатывает автоматические скидки. Стандартный функционал системы ориентирован на работу с конкретной строкой документа. Это означает, что для системы товары в корзине воспринимаются как набор независимых позиций. Система не умеет «смотреть» на весь документ как на единый объект для пересчета совокупной стоимости «комплекта», если этот комплект не описан заранее в справочнике номенклатуры.
Когда мы пытаемся использовать настройку Специальная цена, мы сталкиваемся с тем, что система требует привязки к конкретному Виду цены. Если ваши товары имеют разные базовые цены, попытка установить единую итоговую стоимость через одну настройку скидки приведет к логической ошибке, так как 1С будет вычислять разницу между текущей ценой строки и «акционной» ценой, что не даст итогового «круглого» числа в 999 рублей для всего набора.
Это самый «чистый» способ с точки зрения методологии учета. Если ваш состав товаров, участвующих в акции, стабилен, рассмотрите использование вида номенклатуры Набор-комплект.
Набор.Вид цены для этого набора на уровне 999 рублей.Заказ клиента не отдельные товары, а сам набор. Система автоматически распределит стоимость 999 рублей между составляющими набора пропорционально их долям стоимости.Если акция действует для конкретного клиента или группы клиентов, можно обойтись без механизма автоматических скидок вовсе. Рассмотрите возможность использования Соглашений с клиентами.
В соглашении можно задать специфические Виды цен, где цена за единицу товара будет уже рассчитана как 249,75 рубля (исходя из 999/4). Этот метод эффективен, так как при выборе такого соглашения в документе, 1С подставит акционную цену автоматически, минуя сложную логику Автоматических скидок (наценок).
Если вышеуказанные методы не подходят из-за высокой динамики цен или непредсказуемого состава корзины, единственным гибким вариантом остается написание внешней обработки или расширения. Разберем, как это можно реализовать алгоритмически:
Товары.Вид номенклатуры для товаров в документе.Для программной реализации вам потребуется использовать событие ПередЗаписью или обработчик команды табличной части. Примерная логика кода для пересчета:
// Пример псевдокода для пересчета скидки в строках
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если СтрокаТЧ.Номенклатура.ВидНоменклатуры = НужныйВид Тогда
// Расчет суммы скидки для приведения цены к 249.75
СуммаСкидки = СтрокаТЧ.Цена - 249.75;
СтрокаТЧ.СуммаСкидки = СуммаСкидки;
СтрокаТЧ.Сумма = 249.75;
КонецЕсли;
КонецЦикла;
Подводя итог, можно сделать следующие выводы для вашей задачи:
Автоматических скидок в УТ 11.4 не предназначен для динамического пересчета «суммы корзины».Наборов — это исключит ошибки при списании и расчете себестоимости.Соглашений с установкой жестких цен является наиболее быстрым и менее трудозатратным путем.Рекомендуем сначала протестировать метод с Соглашениями на копии базы, так как это позволит вам избежать лишнего программирования и остаться в рамках типовой логики работы системы.