При работе с розничными продажами в конфигурациях 1С:Управление торговлей (УТ 11) и 1С:Розница часто возникает проблема «лишних копеек». Когда у покупателя срабатывает процентная накопительная или автоматическая скидка, итоговая сумма чека получается дробной. Кассирам неудобно сдавать копейки, а покупатели требуют округления суммы до целого рубля.
На первый взгляд задача простая, но на практике она тянет за собой цепочку технических сложностей: расхождения с фискальным регистратором (ФР/ККТ) по ФЗ-54, ошибки при оплате картой через банковский терминал (эквайринг) и необходимость ручных действий со стороны кассира. Рассмотрим подробно, как решить эти проблемы как стандартными средствами конфигурации, так и с помощью программной доработки.
Согласно требованиям ФЗ-54, в фискальном чеке нельзя просто указать общую скидку на весь итог документа. Скидка должна быть распределена по каждой товарной позиции (строке чека) пропорционально её стоимости.
Когда система рассчитывает скидку, она делит сумму округления на количество строк. Из-за округления копеек при делении возникает математическая погрешность (так называемая проблема последней копейки). Например, если общую сумму чека нужно уменьшить на 40 копеек, а в чеке 3 товара, то при распределении получается по 13.33 копеек на строку. В итоге на ФР передается одна сумма, а в 1С рассчитывается другая. Кассовый аппарат либо отказывается печатать такой чек из-за арифметической ошибки «Сумма строк не равна итогу», либо печатает чек с расхождением в 1–2 копейки с учетной системой.
В современных версиях конфигурации 1С:Управление торговлей 11 (начиная с версии 11.4) встроен полноценный механизм округлений, который работает через справочник автоматических скидок. Разберем по шагам, как его настроить:
1 рубля.Часто пользователи сталкиваются с тем, что после настройки округления программа при оформлении продажи требует от кассира ручного нажатия кнопки «Рассчитать скидки». Если кассир забывает это сделать, чек пробивается с копейками. Чтобы автоматизировать этот процесс, выполним следующие настройки:
Если типовой функционал по какой-то причине не подходит или используется старая конфигурация, округление можно реализовать программно в модуле документа ЧекККМ. Наша задача — распределить сумму округления по строкам чека так, чтобы сумма скидок по строкам копейка в копейку соответствовала общей скидке округления.
Рассмотрим алгоритм распределения погрешности на последнюю (или самую дорогую) строку чека:
// Пример программного округления чека и распределения копеек по строкам
ИтоговаяСумма = 0;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
ИтоговаяСумма = ИтоговаяСумма + СтрокаТЧ.Сумма;
КонецЦикла;
ОкругленнаяСумма = Окр(ИтоговаяСумма, 0, РежимОкругления.Окр15к); // Округляем до целого рубля
СуммаСкидкиОкругления = ИтоговаяСумма - ОкругленнаяСумма;
Если СуммаСкидкиОкругления <> 0 Тогда
РаспределеннаяСумма = 0;
КоличествоСтрок = Объект.Товары.Количество();
Для Индекс = 0 По КоличествоСтрок - 1 Цикл
СтрокаТЧ = Объект.Товары[Индекс];
Если Индекс = КоличествоСтрок - 1 Тогда
// Все оставшиеся копейки погрешности относим на последнюю строку
ДоляСкидки = СуммаСкидкиОкругления - РаспределеннаяСумма;
Иначе
// Пропорциональное распределение скидки округления
ДоляСкидки = Окр(СуммаСкидкиОкругления * (СтрокаТЧ.Сумма / ИтоговаяСумма), 2);
РаспределеннаяСумма = РаспределеннаяСумма + ДоляСкидки;
КонецЕсли;
// Корректируем показатели строки чека
СтрокаТЧ.СуммаАвтоматическойСкидки = СтрокаТЧ.СуммаАвтоматическойСкидки + ДоляСкидки;
СтрокаТЧ.Сумма = СтрокаТЧ.Сумма - ДоляСкидки;
// Пересчитываем цену с учетом скидки для передачи на ФР
СтрокаТЧ.Цена = СтрокаТЧ.Сумма / СтрокаТЧ.Количество;
КонецЦикла;
КонецЕсли;
Этот алгоритм гарантирует, что сумма всех строк в табличной части Товары будет в точности равна округленному итогу чека, что исключит ошибку математического расхождения на стороне ККТ. Если же в базе уже накопились документы с ошибками распределения сумм, для их исправления можно использовать инструмент для редактирования чеков ККМ и кассовых смен.
Даже если в 1С суммы сошлись, при передаче данных в обработку обслуживания (драйвер ККТ) может происходить повторный пересчет. Драйвер получает цену, количество и процент скидки, после чего пытается вычислить сумму самостоятельно.
Чтобы избежать этой проблемы, проанализируем код внешней обработки обслуживания фискального регистратора (или код интеграции БПО). При формировании XML-пакета или вызове методов драйвера необходимо передавать уже готовую, рассчитанную в 1С сумму строки с учетом всех округлений.
Например, вместо передачи процента скидки, передавайте в метод печати строки ККТ точное значение суммы:
Результат = Обработка.ПечататьСтроку(Объект, Позиция.Наименование, Позиция.Количество, Позиция.СуммаСоСкидкой1С, 0, Позиция.НомерСекции, Позиция.СтавкаНДС);
В данном случае параметр скидки передается как 0, так как цена товара в чеке уже скорректирована с учетом скидки округления на стороне 1С.
Особое внимание следует уделить оплате картой. Распространена ситуация, когда по терминалу списывается, например, 1500 рублей, а из-за округления ККТ пытается пробить чек на 1499.99 рублей. Из-за разницы даже в одну копейку банковский терминал отменяет операцию, либо транзакция проходит в банке, но касса выдает ошибку, и чек в 1С не проводится. Для поиска подобных расхождений и зависших оплат подойдёт отчет для выявления непробитых чеков по эквайринговым операциям.
Для предотвращения этой проблемы необходимо строго соблюдать последовательность выполнения операций в кодовой базе РМК:
ЧекККМ до момента вызова платежного терминала. Сумма документа должна стать окончательной.Объект.СуммаДокумента (уже округленное до целых рублей).Некоторые специалисты предлагают решить проблему копеек путем настройки округления непосредственно в правилах расчета цен (в справочнике Типы цен номенклатуры). Выясним, почему это плохое решение для розницы:
Таким образом, единственным верным и методически правильным подходом является округление именно итоговой суммы чека с последующим распределением скидки по позициям номенклатуры.