Почему в 1С:Розница 2.2 продолжают начисляться бонусы при оплате бонусными баллами?

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

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

Разбор природы проблемы

Основная причина заключается в специфике работы РМК (Рабочего места кассира) и механизма Автоматических скидок. В конфигурации 1С:Розница 2.2 расчет начислений тесно связан с моментом расчета скидок. Если в настройках пользователя включен флаг Автоматический расчет скидок при редактировании документа продажи, система пытается рассчитать все скидки и начисления при добавлении каждого товара.

Когда вы добавляете товар, а затем указываете карту, система фиксирует состояние документа как Объект.СкидкиРассчитаны = Истина. При последующей частичной оплате бонусами, процедура, отвечающая за очистку бонусных начислений, не всегда срабатывает корректно, так как считает расчет уже выполненным и завершенным.

Варианты диагностики и настройки

Прежде чем приступать к исправлению кода, давайте рассмотрим методологические способы решения, которые помогают избежать конфликтов в РМК:

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

Техническое исправление логики в коде

Если вы опытный разработчик и хотите устранить причину на уровне конфигурации, вам следует обратить внимание на процедуру ВыполнитьЧО08ОплатаБонусами. Именно в ней происходит проверка того, нужно ли пересчитывать бонусы. Основная ошибка заключается в том, что текущий код может блокироваться флагом Объект.СкидкиРассчитаны.

Давайте проанализируем фрагмент кода, который отвечает за логику оплаты бонусами:


// Фрагмент процедуры обработки оплаты бонусами
Если ДополнительныеПараметры.УменьшатьСуммуЧекаДляСкидокНаСуммуБонусов Тогда
    ОтменитьСкидкиИОплатуБонусамиСервер();
Иначе
    Если (НЕ Объект.ПродажаПоЗаказу) И (НЕ Объект.СкидкиРассчитаны) Тогда
        НазначитьАвтоматическиеСкидкиКлиент( , , ПараметрыДействия);
    КонецЕсли;
КонецЕсли;

Как мы видим, условие НЕ Объект.СкидкиРассчитаны не дает системе запустить пересчет скидок (и очистку бонусов) при повторном изменении способа оплаты. Чтобы исправить это, необходимо:

  1. Найти место, где устанавливается флаг БудетОплатаБонусами.
  2. Обеспечить вызов процедуры ОтменитьСкидкиИОплатуБонусамиСервер() или принудительный вызов пересчета при изменении состава оплаты в РМК.
  3. Убедиться, что при смене оплаты происходит сброс статуса Объект.СкидкиРассчитаны, если это требуется для корректного пересчета бонусной таблицы.

Важные рекомендации

При внесении изменений в типовой код обязательно учитывайте следующее:

Подводя итог, можно сказать, что решение проблемы лежит в области синхронизации событий РМК. Если автоматический расчет скидок критически важен для ваших кассиров, необходимо доработать процедуру обработки оплаты бонусами так, чтобы она игнорировала старый статус расчета скидок и всегда инициировала пересчет при добавлении оплаты баллами.

← На главную