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