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