В процессе работы с рабочим местом кассира (РМК) в конфигурации 1С:Управление торговлей 11 (начиная с релизов 11.4 и выше) многие пользователи и разработчики сталкиваются с неудобством: автоматические скидки не рассчитываются «на лету» при добавлении товара в корзину. Вместо этого система требует нажатия кнопки «Рассчитать скидки», а при переходе к оплате часто блокирует процесс модальным окном с текстом: «Предварительно необходимо рассчитать скидки/наценки. Выполнить расчет?». В этой статье мы подробно разберем, почему так происходит и как программно автоматизировать этот процесс.
Рассмотрим ситуацию глубже. В типовом функционале 1С разработчики сознательно разделили процессы подбора товара и расчета маркетинговых условий. Сделано это для оптимизации производительности. Если в базе настроены десятки сложных скидок (например, «каждая третья единица товара», «скидка на комплект», «накопительные скидки по картам»), расчет при каждом изменении строки в чеке мог бы вызывать существенные задержки (фризы) интерфейса.
Однако для большинства торговых точек, где условия просты, такая задержка не критична, а вот лишние клики кассира замедляют обслуживание очереди. Проанализируем основные факторы, влияющие на расчет:
Администрирование — CRM и маркетинг должна быть включена опция Автоматические скидки в продажах.00-00190697), когда в документах «Заказ клиента» или «Чек ККМ» автоматический расчет не срабатывает корректно без принудительного вызова команды.Если ваша задача — сделать так, чтобы при добавлении определенной позиции она всегда шла со скидкой 100%, мы можем воспользоваться типовым механизмом маркетинговых мероприятий. Для этого выполним следующие действия:
Скидка процентом и укажем 100%.Условия предоставления можно не указывать условий, если скидка должна срабатывать всегда.Назначение выберем конкретную номенклатуру или группу номенклатуры.Действует и укажем область применения (склад или магазин).Но даже при такой настройке, в стандартном РМК скидка отобразится только после нажатия кнопки расчета. Выясним, как это автоматизировать.
Чтобы скидка рассчитывалась сразу после добавления товара, нам потребуется создать расширение конфигурации. Нам нужно перехватить событие изменения табличной части Товары на форме РМК. Разберем по шагам, какой код нам понадобится.
Для начала рассмотрим, как инициировать расчет программно. В типовой конфигурации за это отвечает серверный модуль СкидкиНаценкиСервер. Посмотрим на пример кода, который можно вызвать в обработчике ПослеЗаписи или при изменении строки:
// Создаем структуру параметров для расчета
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ПрименятьКОбъекту", Истина);
ПараметрыРасчета.Вставить("ТолькоПредварительныйРасчет", Ложь);
ПараметрыРасчета.Вставить("ВосстанавливатьУправляемыеСкидки", Истина);
ПараметрыРасчета.Вставить("УправляемыеСкидки", Новый СписокЗначений);
// Вызываем типовой метод расчета
РезультатРасчета = СкидкиНаценкиСервер.Рассчитать(Объект, ПараметрыРасчета);
Этот код выполняет те же действия, что и кнопка на форме. Однако, чтобы внедрить его в РМК, нужно учитывать специфику управляемых форм. В форме ФормаРМК наиболее подходящим местом для интеграции будет процедура, срабатывающая после подбора товара. Рекомендуется использовать метод РассчитатьСкидкиНаценки(ЭтаФорма) клиентского модуля СкидкиНаценкиКлиент.
Часто программисты сталкиваются с тем, что расчет вызван, суммы изменились, но при нажатии «Оплатить» 1С все равно спрашивает о расчете. Проанализируем ситуацию: это происходит потому, что внутри формы установлен флаг (реквизит или переменная), сообщающий системе, что расчет еще не актуален (данные в ТЧ менялись после последнего расчета).
Чтобы подавить это окно, в расширении для формы РМК необходимо программно установить признак того, что скидки рассчитаны. Рассмотрим пример использования расширения для процедуры перед оплатой:
&НаКлиенте
Процедура РМК_ПередОплатойПосле(Команда)
// Устанавливаем флаг, что скидки уже рассчитаны,
// чтобы избежать появления стандартного диалога
ЭтаФорма.СкидкиРассчитаны = Истина;
КонецПроцедуры
Важный момент: если вы просто установите флаг СкидкиРассчитаны = Истина, не выполнив сам расчет, клиент может уйти с товаром по полной цене, так как автоматические алгоритмы не отработают. Поэтому эти действия всегда должны идти в паре. Для контроля корректности расчета и проверки итоговых сумм в чеках можно использовать отчет по предоставленным скидкам и наценкам.
Иногда автоматические скидки перестают работать из-за того, что база была скопирована или обновлена некорректно. В сообщениях форума упоминается, что «разблокировать работу с внешними ресурсами» приходится каждый день. Это верный признак того, что 1С считает информационную базу копией.
Проанализируем последствия: в режиме копии блокируются все РегламентныеЗадания. Если в вашей схеме скидок используются условия, зависящие от сегментов номенклатуры или партнеров, которые обновляются фоновыми заданиями, скидки могут не применяться. Чтобы решить это, перейдите в НСИ и администрирование — Обслуживание — Регламентные операции и нажмите Разблокировать работу с внешними ресурсами. Если проблема повторяется, проверьте параметры запуска сервера 1С и идентификатор базы в кластере.
Как упоминалось в начале темы, расчет часто опирается на формулу: ТекущаяСтрока.СуммаАвтоматическойСкидки = Окр(ТекущаяСтрока.Количество * ТекущаяСтрока.Цена * ТекущаяСтрока.ПроцентАвтоматическойСкидки / 100, 2).
Если вы хотите изменить сам алгоритм (например, внедрить свои правила округления или особые условия суммирования), вам придется переопределять функции в общем модуле ОбработкаТабличнойЧастиКлиентСервер. Однако делать это через прямое изменение кода конфигурации не рекомендуется — используйте префиксы расширений (&Вместо, &Перед, &После).
Разберем пример изменения суммы автоматической скидки в расширении:
&Вместо("РассчитатьСуммуСкидкиНаценки")
Процедура Расшир_РассчитатьСуммуСкидкиНаценки(СтрокаТабличнойЧасти, Параметры)
// Вызываем оригинальный расчет
ПродолжитьВызов(СтрокаТабличнойЧасти, Параметры);
// Добавляем свою логику, если скидка достигла 100%
Если СтрокаТабличнойЧасти.ПроцентАвтоматическойСкидки >= 100 Тогда
СтрокаТабличнойЧасти.СуммаАвтоматическойСкидки = СтрокаТабличнойЧасти.Сумма;
СтрокаТабличнойЧасти.Сумма = 0;
КонецЕсли;
КонецПроцедуры
Для полной автоматизации процесса в УТ 11 необходимо:
СкидкиНаценкиКлиент.РассчитатьСкидкиНаценки(ЭтаФорма) в обработчик события ТоварыПриИзменении.СкидкиРассчитаны, чтобы кассир не видел лишних уведомлений при переходе к оплате чека.Используя эти методы, мы добьемся того, что интерфейс РМК станет максимально отзывчивым, а человеческий фактор (забыл нажать кнопку — не предоставил скидку) будет сведен к минимуму. Для комплексного анализа начисленных скидок в разрезе складов, номенклатуры и партнеров можно воспользоваться отчетом по автоматическим и ручным скидкам.