Как устранить ошибки распределения скидок и расхождения сумм при оплате бонусами в 1С:Розница 2.3?

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

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

Причина возникновения проблемы: математика и округления

Когда покупатель решает оплатить часть покупки бонусами, программа воспринимает эту оплату как скидку, которую необходимо распределить по всем строкам чека пропорционально их стоимости. Рассмотрим ситуацию: в чеке три товара по 100 рублей, и клиент тратит 100 бонусов. Программа должна вычесть по 33,33 рубля из каждой позиции. Однако 33,33 * 3 = 99,99. Возникает разница в 0,01 рубля. Фискальный регистратор (особенно новые модели АТОЛ и Штрих-М с ФФД 1.05 и выше) жестко контролирует, чтобы сумма цен за вычетом всех скидок, умноженная на количество, в точности до копейки совпадала с итогом по строке и итогом по чеку. Если алгоритм распределения 1С выдает результат с лишними знаками после запятой, драйвер ККТ блокирует печать чека. Для детального анализа того, как именно накапливались и списывались баллы, удобно использовать отчет по бонусным баллам с датой списания.

Способ 1. Настройка правил округления в бонусной программе

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

  1. Перейдем в раздел МаркетингБонусные программы лояльности.
  2. Откроем используемую бонусную программу.
  3. Найдем настройки округления. Нам необходимо установить правило «Округлять до 0.01» (до копейки) или даже «Округлять до 1» (до рубля), если политика компании это позволяет.
  4. Убедимся, что флаг «Кратно количеству в строке» установлен. Это заставит систему распределять бонусы так, чтобы на каждую единицу товара приходилось целое количество копеек. Также стоит настроить отключение бонусов при скидках в документе, чтобы избежать двойного дисконта, который часто и провоцирует ошибки округления.

Способ 2. Корректировка распределения скидок в настройках РМК

Рассмотрим параметры распределения в настройках рабочего места кассира. Проанализируем настройки учета в разделе АдминистрированиеПродажиОплата. В некоторых релизах Розницы 2.3 доступен выбор алгоритма распределения суммы оплаты бонусами. Если вы используете сторонние маркетинговые инструменты, например интеграцию с UDS Game для Розницы 2, убедитесь, что внешние скидки корректно передаются в типовой механизм распределения.

Необходимо убедиться, что в настройках стоит приоритет на «распределение остатка на первую/последнюю строку». Однако стоит помнить, что при использовании НДС разные ставки в одном чеке могут привести к ошибке, если бонус «перепрыгнет» со строки с 20% на строку с 10%. Поэтому рекомендуем проверять, чтобы бонусная скидка распределялась в рамках одной налоговой группы корректно.

Способ 3. Программная корректировка модуля распределения (для программистов)

Если типовые настройки не помогают, проанализируем программный код, отвечающий за расчет чека. Основная логика распределения скидок (включая бонусные баллы) находится в общем модуле ПродажиСервер или в модуле менеджера документа ЧекККМ. Иногда после обновлений могут возникать и другие сопутствующие проблемы, например, ошибка распределения марок на продукцию, которую также приходится решать на уровне программного кода или групповых обработок.

Посмотрим на пример кода, который исправляет некорректное распределение «хвостов» при оплате бонусами:


// В процедуре распределения суммы скидки
ОстатокБонусов = СуммаОплатыБонусами;
ВсегоСтрок = ТабличнаяЧасть.Количество();
Для каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
    // Рассчитываем долю
    ТекущаяСкидка = Окр(СуммаОплатыБонусами * (СтрокаТЧ.Сумма / ИтогЧека), 2);
    СтрокаТЧ.СуммаБонусов = ТекущаяСкидка;
    ОстатокБонусов = ОстатокБонусов - ТекущаяСкидка;
КонецЦикла;

// Корректировка погрешности на последней строке
Если ОстатокБонусов <> 0 И ВсегоСтрок > 0 Тогда
    ТабличнаяЧасть[ВсегоСтрок - 1].СуммаБонусов = ТабличнаяЧасть[ВсегоСтрок - 1].СуммаБонусов + ОстатокБонусов;
КонецЕсли;

Важно помнить, что после такой ручной корректировки необходимо вызвать процедуру пересчета налогов (НДС), так как изменение суммы строки на 1 копейку может изменить расчетную базу налога. Используем стандартный метод ОбработкаТабличнойЧастиТовары.РассчитатьСуммуНДС(СтрокаТЧ, СтруктураПараметров);.

Способ 4. Обновление драйвера ККТ и прошивки

Выясним причину на уровне оборудования. Иногда проблема кроется не в 1С, а в том, как драйвер интерпретирует команду RegisterItem. Проанализируем версию драйвера АТОЛ (рекомендуется 10.8 и выше) или Штрих-М. В настройках драйвера существует параметр «Способ расчета итога». Если 1С передает скидку на всю позицию, а драйвер пытается пересчитать цену за единицу самостоятельно, возникает конфликт. Установите в настройках драйвера режим работы, при котором 1С передает уже финальные суммы строк с учетом всех скидок, без необходимости пересчета драйвером.

Резюме и практические советы

Подведем итог. Для решения проблемы с бонусами в 1С:Розница 2.3 мы рекомендуем придерживаться следующего алгоритма:

  1. Проверьте, чтобы в Бонусной программе было включено округление до 1 копейки или до 1 рубля.
  2. Проанализируйте состав чека: если в нем есть товары с разными ставками НДС, убедитесь, что бонусы распределяются пропорционально, не нарушая логику налогового учета.
  3. Для автоматизации сложных условий лояльности используйте запрет начисления бонусов на те позиции, где уже применены другие виды скидок.
  4. Если используется весовой товар, обязательно используйте округление «Кратно количеству», чтобы цена за единицу не превращалась в число с бесконечными знаками после запятой.
  5. В случае программной доработки всегда делайте контрольную проверку: СуммаСтрок == ИтогЧека перед вызовом метода НапечататьЧек().

Использование данных методов позволит избежать очередей на кассах из-за ошибок оборудования и обеспечит корректное отражение скидок в управленческом и налоговом учете.

← На главную