Как округлить сумму чека ККМ после скидки в 1С:УТ и Рознице без расхождений с кассой и терминалом?

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

При работе с розничными продажами в конфигурациях 1С:Управление торговлей (УТ 11) и 1С:Розница часто возникает проблема «лишних копеек». Когда у покупателя срабатывает процентная накопительная или автоматическая скидка, итоговая сумма чека получается дробной. Кассирам неудобно сдавать копейки, а покупатели требуют округления суммы до целого рубля.

На первый взгляд задача простая, но на практике она тянет за собой цепочку технических сложностей: расхождения с фискальным регистратором (ФР/ККТ) по ФЗ-54, ошибки при оплате картой через банковский терминал (эквайринг) и необходимость ручных действий со стороны кассира. Рассмотрим подробно, как решить эти проблемы как стандартными средствами конфигурации, так и с помощью программной доработки.

Почему возникает расхождение с фискальным регистратором (ККТ)?

Согласно требованиям ФЗ-54, в фискальном чеке нельзя просто указать общую скидку на весь итог документа. Скидка должна быть распределена по каждой товарной позиции (строке чека) пропорционально её стоимости.

Когда система рассчитывает скидку, она делит сумму округления на количество строк. Из-за округления копеек при делении возникает математическая погрешность (так называемая проблема последней копейки). Например, если общую сумму чека нужно уменьшить на 40 копеек, а в чеке 3 товара, то при распределении получается по 13.33 копеек на строку. В итоге на ФР передается одна сумма, а в 1С рассчитывается другая. Кассовый аппарат либо отказывается печатать такой чек из-за арифметической ошибки «Сумма строк не равна итогу», либо печатает чек с расхождением в 1–2 копейки с учетной системой.

Решение 1. Настройка штатного механизма округления в 1С:УТ 11

В современных версиях конфигурации 1С:Управление торговлей 11 (начиная с версии 11.4) встроен полноценный механизм округлений, который работает через справочник автоматических скидок. Разберем по шагам, как его настроить:

  1. Перейдем в раздел CRM и маркетинг — Скидки (наценки).
  2. Создадим новый элемент и выберем тип скидки «Округление суммы документа».
  3. В открывшейся форме укажем параметры округления. Например, округлять до 1 рубля.
  4. Важно выбрать вариант округления «В пользу клиента». Это исключит претензии со стороны контролирующих органов, так как округление в большую сторону (в пользу магазина) может трактоваться как необоснованное завышение розничной цены.
  5. Для того чтобы округление срабатывало корректно и в самую последнюю очередь (после расчета всех накопительных и ручных скидок), созданную скидку-округление необходимо поместить в самую нижнюю позицию в группе совместного применения скидок с вариантом «Последовательное применение» или «Сложение».

Решение 2. Настройка автоматического расчета без лишних кликов кассира

Часто пользователи сталкиваются с тем, что после настройки округления программа при оформлении продажи требует от кассира ручного нажатия кнопки «Рассчитать скидки». Если кассир забывает это сделать, чек пробивается с копейками. Чтобы автоматизировать этот процесс, выполним следующие настройки:

  1. Перейдем в меню НСИ и администрирование — Настройка НСИ и разделов — Продажи.
  2. В блоке Розничные продажи найдем и установим флаг «Рассчитывать скидки при пробитии чека». Теперь система будет принудительно запускать алгоритм расчета скидок и округлений в момент нажатия кнопки «Оплата».
  3. Также в настройках интерфейса РМК (Рабочего места кассира) рекомендуется включить флаг «Автоматически рассчитывать скидки», чтобы расчет происходил динамически при добавлении каждого нового товара в корзину.

Решение 3. Программный пересчет скидки по строкам (для разработчиков)

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

Рассмотрим алгоритм распределения погрешности на последнюю (или самую дорогую) строку чека:


// Пример программного округления чека и распределения копеек по строкам
ИтоговаяСумма = 0;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    ИтоговаяСумма = ИтоговаяСумма + СтрокаТЧ.Сумма;
КонецЦикла;

ОкругленнаяСумма = Окр(ИтоговаяСумма, 0, РежимОкругления.Окр15к); // Округляем до целого рубля
СуммаСкидкиОкругления = ИтоговаяСумма - ОкругленнаяСумма;

Если СуммаСкидкиОкругления <> 0 Тогда
    РаспределеннаяСумма = 0;
    КоличествоСтрок = Объект.Товары.Количество();
    
    Для Индекс = 0 По КоличествоСтрок - 1 Цикл
        СтрокаТЧ = Объект.Товары[Индекс];
        
        Если Индекс = КоличествоСтрок - 1 Тогда
            // Все оставшиеся копейки погрешности относим на последнюю строку
            ДоляСкидки = СуммаСкидкиОкругления - РаспределеннаяСумма;
        Иначе
            // Пропорциональное распределение скидки округления
            ДоляСкидки = Окр(СуммаСкидкиОкругления * (СтрокаТЧ.Сумма / ИтоговаяСумма), 2);
            РаспределеннаяСумма = РаспределеннаяСумма + ДоляСкидки;
        КонецЕсли;
        
        // Корректируем показатели строки чека
        СтрокаТЧ.СуммаАвтоматическойСкидки = СтрокаТЧ.СуммаАвтоматическойСкидки + ДоляСкидки;
        СтрокаТЧ.Сумма = СтрокаТЧ.Сумма - ДоляСкидки;
        
        // Пересчитываем цену с учетом скидки для передачи на ФР
        СтрокаТЧ.Цена = СтрокаТЧ.Сумма / СтрокаТЧ.Количество;
    КонецЦикла;
КонецЕсли;

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

Решение 4. Устранение расхождения в драйвере торгового оборудования

Даже если в 1С суммы сошлись, при передаче данных в обработку обслуживания (драйвер ККТ) может происходить повторный пересчет. Драйвер получает цену, количество и процент скидки, после чего пытается вычислить сумму самостоятельно.

Чтобы избежать этой проблемы, проанализируем код внешней обработки обслуживания фискального регистратора (или код интеграции БПО). При формировании XML-пакета или вызове методов драйвера необходимо передавать уже готовую, рассчитанную в 1С сумму строки с учетом всех округлений.

Например, вместо передачи процента скидки, передавайте в метод печати строки ККТ точное значение суммы:

Результат = Обработка.ПечататьСтроку(Объект, Позиция.Наименование, Позиция.Количество, Позиция.СуммаСоСкидкой1С, 0, Позиция.НомерСекции, Позиция.СтавкаНДС);

В данном случае параметр скидки передается как 0, так как цена товара в чеке уже скорректирована с учетом скидки округления на стороне 1С.

Решение 5. Синхронизация с банковским терминалом (Эквайрингом)

Особое внимание следует уделить оплате картой. Распространена ситуация, когда по терминалу списывается, например, 1500 рублей, а из-за округления ККТ пытается пробить чек на 1499.99 рублей. Из-за разницы даже в одну копейку банковский терминал отменяет операцию, либо транзакция проходит в банке, но касса выдает ошибку, и чек в 1С не проводится. Для поиска подобных расхождений и зависших оплат подойдёт отчет для выявления непробитых чеков по эквайринговым операциям.

Для предотвращения этой проблемы необходимо строго соблюдать последовательность выполнения операций в кодовой базе РМК:

  1. Окончательный расчет: Все автоматические скидки, ручные скидки и скидки-округления должны быть полностью рассчитаны в документе ЧекККМ до момента вызова платежного терминала. Сумма документа должна стать окончательной.
  2. Запрос к эквайрингу: На банковский терминал передается строго то значение суммы, которое зафиксировано в реквизите Объект.СуммаДокумента (уже округленное до целых рублей).
  3. Печать чека ККТ: Только после успешного ответа от эквайрингового терминала (код авторизации получен) управление передается на фискальный регистратор для пробития чека с абсолютно той же самой суммой.

Почему не стоит округлять розничные цены в «Типах цен»?

Некоторые специалисты предлагают решить проблему копеек путем настройки округления непосредственно в правилах расчета цен (в справочнике Типы цен номенклатуры). Выясним, почему это плохое решение для розницы:

Таким образом, единственным верным и методически правильным подходом является округление именно итоговой суммы чека с последующим распределением скидки по позициям номенклатуры.

← На главную