При работе в конфигурации 1С:Розница 2.2 пользователи часто сталкиваются с ситуацией, когда автоматические скидки, настроенные исключительно для розничных покупателей на кассовой линейке (в Рабочем месте кассира или документе Чек ККМ), начинают непроизвольно рассчитываться в документах оптовых продаж — таких как Реализация товаров (в интерфейсе программы этот документ также может называться «Расходная накладная»). Это приводит к искажению оптовых цен, путанице во взаиморасчетах с контрагентами и ручной корректировке документов менеджерами.
В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько эффективных способов решения этой проблемы: от простых настроек в пользовательском режиме до программных методов с использованием расширений или механизма внешних обработок условий предоставления скидок.
---
В архитектуре решения 1С:Розница механизмы расчета автоматических скидок обслуживаются единой подсистемой маркетинга. По умолчанию программа считает, что любая зафиксированная в системе маркетинговая акция с типом «Автоматическая скидка» должна применяться ко всем документам продажи, если для нее выполняются заданные условия. Документ Реализация товаров технически является таким же документом продажи, как и Чек ККМ, поэтому подсистема расчета скидок обрабатывает его по аналогичным алгоритмам.
Выясним, какими способами можно разграничить розничные и оптовые продажи для корректного начисления скидок.
---
Самый простой и правильный с точки зрения методологии 1С способ — настроить правильную привязку маркетинговых акций к объектам сети. Рассмотрим этот вариант по шагам.
Реализация товаров начисляться не будут.---
Если разделение по складам невозможно, мы можем ограничить действие автоматических скидок с помощью условий предоставления.
Вариант А. Использование условий по дисконтным картам.
Большинство розничных скидок должны предоставляться только при предъявлении карты лояльности. Если мы добавим в условия скидки требование «По типу получателя» -> «Дисконтная карта» (или укажем конкретный вид дисконтных карт), то в документе Реализация товаров автоматический расчет просто не сработает, так как в оптовых накладных дисконтные карты, как правило, не сканируются и не выбираются. На кассе же (в РМК) при считывании карты скидка рассчитается автоматически.
Вариант Б. Использование механизма вытеснения и сегментов контрагентов (Схема «Заглушка»).
Рассмотрим более сложную схему настройки в пользовательском режиме:
Реализация товаров. Заполнение этого сегмента можно автоматизировать по расписанию.Основной минус данного подхода — необходимость постоянно контролировать актуальность сегмента контрагентов и добавлять туда новых клиентов сразу после их регистрации.
---
Если требуется дать пользователю возможность самостоятельно решать, нужно ли рассчитывать скидки в конкретном документе, мы можем доработать форму документа Реализация товаров. Для этого добавим реквизит формы типа Булево (например, ВключитьАвтоматическийРасчетСкидок) и свяжем его с системным флагом расчета скидок.
Проанализируем пример реализации данного подхода на встроенном языке 1С:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Устанавливаем системный реквизит расчета скидок в зависимости от нашего флага управления
АвтоматическийРасчетСкидок = Объект.Ссылка.ВключитьАвтоматическийРасчетСкидок;
КонецПроцедуры
&НаКлиенте
Процедура ВключитьАвтоматическийРасчетСкидокПриИзменении(Элемент)
// Если пользователь снимает флаг автоматического расчета, принудительно очищаем скидки в документе
Если Не ВключитьАвтоматическийРасчетСкидок Тогда
ОтменитьСкидки();
Иначе
// Вызываем стандартный перерасчет скидок при активации флага
РассчитатьСкидкиПринудительно();
КонецЕсли;
КонецПроцедуры
Этот способ требует внесения изменений в конфигурацию (или создания расширения), однако он дает менеджеру полный контроль над ценообразованием непосредственно в интерфейсе документа.
---
Начиная с версии 1С:Розница 2.2.2, в программе реализован гибкий механизм расширения условий скидок без снятия конфигурации с поддержки. Мы можем создать внешнюю обработку с видом «Проверка условия предоставления скидки (наценки)». При расчете скидки система будет передавать контекст документа во внешнюю обработку, где мы сможем программно проверить тип документа и заблокировать начисление скидки для Реализация товаров.
Разберем детально создание и структуру такой обработки.
Создадим новую внешнюю обработку в конфигураторе и в модуле объекта пропишем обязательные экспортные процедуры интеграции с Библиотекой Стандартных Подсистем (БСП) и функцию проверки условия.
// Функция регистрации внешней обработки в механизме БСП
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПроверкаУсловияПредоставленияСкидкиНаценки");
ПараметрыРегистрации.Вставить("Наименование", "Ограничение скидок по типу документа (Только для чеков)");
ПараметрыРегистрации.Вставить("Версия", "1.1");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Информация", "Блокирует автоматический расчет скидок в документах оптовых продаж.");
// БСП требует вернуть таблицу команд, даже если она пустая для данного вида обработки
ТаблицаКоманд = Новый ТаблицаЗначений;
ТаблицаКоманд.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
ТаблицаКоманд.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
// Основной метод, вызываемый платформой при расчете скидки
Функция ПроверитьУсловие(Условие, СтрокаДереваСкидок, ПараметрыВнешнейОбработки = Неопределено, ПараметрыРасчета) Экспорт
РезультатПроверки = Новый Структура;
ТекущееУсловиеВыполнено = Истина; // По умолчанию считаем, что скидка разрешена
// Анализируем параметры расчета, переданные системой
Если ПараметрыРасчета <> Неопределено И ПараметрыРасчета.Свойство("Объект") Тогда
ДокументОбъект = ПараметрыРасчета.Объект;
// Получаем имя метаданных документа безопасным способом
ИмяМетаданных = "";
Попытка
ИмяМетаданных = ДокументОбъект.Метаданные().Имя;
Исключение
Попытка
ИмяМетаданных = ДокументОбъект.Ссылка.Метаданные().Имя;
Исключение
ИмяМетаданных = "";
КонецПопытки;
КонецПопытки;
// Если расчет инициирован из Расходной накладной (Реализация товаров), то блокируем скидку
Если ИмяМетаданных = "РеализацияТоваров" Тогда
ТекущееУсловиеВыполнено = Ложь;
КонецЕсли;
КонецЕсли;
РезультатПроверки.Вставить("ТекущееУсловиеВыполнено", ТекущееУсловиеВыполнено);
Возврат РезультатПроверки;
КонецФункции
После сохранения написанного кода в файл формата .epf, выполним его интеграцию с информационной базой:
Теперь свяжем загруженную обработку с правилами расчета скидок:
При расчете скидки в чеках ККМ внешняя обработка вернет значение Истина, и скидка применится. При расчете в накладной обработка вернет Ложь, полностью заблокировав начисление.
---
Разработчики фирмы «1С» учли неудобство настройки данного сценария в старой линейке конфигураций 2.2 и 2.3. В новых редакциях программ 1С:Розница 3.0 и 1С:Управление нашей фирмой (УНФ) этот функционал уже присутствует «из коробки».
В карточке любой автоматической скидки добавлен специальный переключатель — Контур применения (или область действия скидки):
Для пользователей же версии 2.2 наиболее гибким, изящным и не требующим изменения типовой конфигурации решением остается использование внешней обработки условий предоставления (Способ 4). Это гарантирует беспроблемное обновление программы в будущем и четкое разграничение оптового и розничного контуров продаж.