Как отключить автоматический расчет скидок в документе «Реализация товаров» в 1С:Розница 2.2?

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

При работе в конфигурации 1С:Розница 2.2 пользователи часто сталкиваются с ситуацией, когда автоматические скидки, настроенные исключительно для розничных покупателей на кассовой линейке (в Рабочем месте кассира или документе Чек ККМ), начинают непроизвольно рассчитываться в документах оптовых продаж — таких как Реализация товаров (в интерфейсе программы этот документ также может называться «Расходная накладная»). Это приводит к искажению оптовых цен, путанице во взаиморасчетах с контрагентами и ручной корректировке документов менеджерами.

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

---

Почему скидки рассчитываются в «Реализации товаров»?

В архитектуре решения 1С:Розница механизмы расчета автоматических скидок обслуживаются единой подсистемой маркетинга. По умолчанию программа считает, что любая зафиксированная в системе маркетинговая акция с типом «Автоматическая скидка» должна применяться ко всем документам продажи, если для нее выполняются заданные условия. Документ Реализация товаров технически является таким же документом продажи, как и Чек ККМ, поэтому подсистема расчета скидок обрабатывает его по аналогичным алгоритмам.

Выясним, какими способами можно разграничить розничные и оптовые продажи для корректного начисления скидок.

---

Способ 1. Разграничение скидок через структуру магазинов и складов (Типовой функционал)

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

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

---

Способ 2. Ограничение по дисконтным картам и сегментам получателей

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

Вариант А. Использование условий по дисконтным картам.
Большинство розничных скидок должны предоставляться только при предъявлении карты лояльности. Если мы добавим в условия скидки требование «По типу получателя» -> «Дисконтная карта» (или укажем конкретный вид дисконтных карт), то в документе Реализация товаров автоматический расчет просто не сработает, так как в оптовых накладных дисконтные карты, как правило, не сканируются и не выбираются. На кассе же (в РМК) при считывании карты скидка рассчитается автоматически.

Вариант Б. Использование механизма вытеснения и сегментов контрагентов (Схема «Заглушка»).
Рассмотрим более сложную схему настройки в пользовательском режиме:

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

Основной минус данного подхода — необходимость постоянно контролировать актуальность сегмента контрагентов и добавлять туда новых клиентов сразу после их регистрации.

---

Способ 3. Программное отключение авторасчета скидок на уровне формы документа

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

Проанализируем пример реализации данного подхода на встроенном языке 1С:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем системный реквизит расчета скидок в зависимости от нашего флага управления
    АвтоматическийРасчетСкидок = Объект.Ссылка.ВключитьАвтоматическийРасчетСкидок;
КонецПроцедуры

&НаКлиенте
Процедура ВключитьАвтоматическийРасчетСкидокПриИзменении(Элемент)
    // Если пользователь снимает флаг автоматического расчета, принудительно очищаем скидки в документе
    Если Не ВключитьАвтоматическийРасчетСкидок Тогда
        ОтменитьСкидки();
    Иначе
        // Вызываем стандартный перерасчет скидок при активации флага
        РассчитатьСкидкиПринудительно();
    КонецЕсли;
КонецПроцедуры

Этот способ требует внесения изменений в конфигурацию (или создания расширения), однако он дает менеджеру полный контроль над ценообразованием непосредственно в интерфейсе документа.

---

Способ 4. Использование внешней обработки условий предоставления скидки (Рекомендуемый метод)

Начиная с версии 1С:Розница 2.2.2, в программе реализован гибкий механизм расширения условий скидок без снятия конфигурации с поддержки. Мы можем создать внешнюю обработку с видом «Проверка условия предоставления скидки (наценки)». При расчете скидки система будет передавать контекст документа во внешнюю обработку, где мы сможем программно проверить тип документа и заблокировать начисление скидки для Реализация товаров.

Разберем детально создание и структуру такой обработки.

Шаг 1. Создание модуля внешней обработки

Создадим новую внешнюю обработку в конфигураторе и в модуле объекта пропишем обязательные экспортные процедуры интеграции с Библиотекой Стандартных Подсистем (БСП) и функцию проверки условия.


// Функция регистрации внешней обработки в механизме БСП
Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ПроверкаУсловияПредоставленияСкидкиНаценки");
    ПараметрыРегистрации.Вставить("Наименование", "Ограничение скидок по типу документа (Только для чеков)");
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Информация", "Блокирует автоматический расчет скидок в документах оптовых продаж.");
    
    // БСП требует вернуть таблицу команд, даже если она пустая для данного вида обработки
    ТаблицаКоманд = Новый ТаблицаЗначений;
    ТаблицаКоманд.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    ТаблицаКоманд.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    ТаблицаКоманд.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

// Основной метод, вызываемый платформой при расчете скидки
Функция ПроверитьУсловие(Условие, СтрокаДереваСкидок, ПараметрыВнешнейОбработки = Неопределено, ПараметрыРасчета) Экспорт
    
    РезультатПроверки = Новый Структура;
    ТекущееУсловиеВыполнено = Истина; // По умолчанию считаем, что скидка разрешена
    
    // Анализируем параметры расчета, переданные системой
    Если ПараметрыРасчета <> Неопределено И ПараметрыРасчета.Свойство("Объект") Тогда
        ДокументОбъект = ПараметрыРасчета.Объект;
        
        // Получаем имя метаданных документа безопасным способом
        ИмяМетаданных = "";
        Попытка
            ИмяМетаданных = ДокументОбъект.Метаданные().Имя;
        Исключение
            Попытка
                ИмяМетаданных = ДокументОбъект.Ссылка.Метаданные().Имя;
            Исключение
                ИмяМетаданных = "";
            КонецПопытки;
        КонецПопытки;
        
        // Если расчет инициирован из Расходной накладной (Реализация товаров), то блокируем скидку
        Если ИмяМетаданных = "РеализацияТоваров" Тогда
            ТекущееУсловиеВыполнено = Ложь;
        КонецЕсли;
    КонецЕсли;
    
    РезультатПроверки.Вставить("ТекущееУсловиеВыполнено", ТекущееУсловиеВыполнено);
    Возврат РезультатПроверки;
    
КонецФункции

Шаг 2. Подключение обработки в пользовательском режиме

После сохранения написанного кода в файл формата .epf, выполним его интеграцию с информационной базой:

  1. Откроем программу в режиме «1С:Предприятие» под правами администратора.
  2. Перейдем в раздел Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки.
  3. Нажмем кнопку Добавить из файла..., выберем наш созданный файл обработки и запишем элемент справочника.

Шаг 3. Настройка условия предоставления в маркетинге

Теперь свяжем загруженную обработку с правилами расчета скидок:

  1. Перейдем в раздел Маркетинг -> Условия предоставления скидок (наценок).
  2. Создадим новое условие предоставления скидки.
  3. В реквизите Тип условия выберем значение Внешняя обработка.
  4. В появившемся поле выбора укажем нашу добавленную ранее обработку «Ограничение скидок по типу документа (Только для чеков)».
  5. Запишем условие. Теперь добавим это созданное условие ко всем скидкам, которые не должны рассчитываться в оптовых документах продажи.

При расчете скидки в чеках ККМ внешняя обработка вернет значение Истина, и скидка применится. При расчете в накладной обработка вернет Ложь, полностью заблокировав начисление.

---

Как это реализовано в современных версиях 1С (Розница 3.0 / УНФ)?

Разработчики фирмы «1С» учли неудобство настройки данного сценария в старой линейке конфигураций 2.2 и 2.3. В новых редакциях программ 1С:Розница 3.0 и 1С:Управление нашей фирмой (УНФ) этот функционал уже присутствует «из коробки».

В карточке любой автоматической скидки добавлен специальный переключатель — Контур применения (или область действия скидки):

Для пользователей же версии 2.2 наиболее гибким, изящным и не требующим изменения типовой конфигурации решением остается использование внешней обработки условий предоставления (Способ 4). Это гарантирует беспроблемное обновление программы в будущем и четкое разграничение оптового и розничного контуров продаж.

← На главную