Имя: Пароль:
1C
1С v8
Несовпадение сумм в фискальном чеке и в чеке ККМ
0 moonlight
 
29.11.16
22:49
Добрый день!

Розница (Аптека)

Проскакиваю случаи несовпадения итоговых сумм в фискальном чеке и в чеке ККМ 1с

Есть функция:
// Функция вычисления процента скидки, передаваемого фискальному регистратору.
//В связи с особенностями пересчета сумм в фискальном регистраторе и связанными
//с ним расхождениями на копейку с суммой в 1С, выполняется перерасчет процента
//скидки.
//
Функция ВычислениеПроцентаСкидки(СуммаБезСкидки, СуммаСоСкидкой1С) Экспорт
    
    // Если суммы при округлении сходятся, то дальнейшие расчеты не актуальны
    Если СуммаСоСкидкой1С=Окр(СуммаБезСкидки, 2) ИЛИ СуммаБезСкидки=0 Тогда
        Возврат 0;
    КонецЕсли;
    
    // Зависимость итоговой суммы от % является ступенчатой. Получим значение % с неболшим отступом от края ступени
    ПроцентСкидки    = 1 - (СуммаСоСкидкой1С-0.0025)/СуммаБезСкидки;
    
    // Оперделим стоимость товара, которая получиться при расчете метадами ФР
    СуммаСоСкидкойФР = Окр(СуммаБезСкидки - Окр(СуммаБезСкидки*ПроцентСкидки, 2), 2);
    
    // Производим итеративное решение Н.А.Н.У.
    Пока НЕ СуммаСоСкидкой1С=СуммаСоСкидкойФР Цикл
        
        // Расчитываем значение на которое необходимо произвести корректировку полученного ранее процента скидки
        ПрирощениеСуммы    = СуммаСоСкидкойФР - СуммаСоСкидкой1С;
        ПрирощениеПроцента = ?(ПрирощениеСуммы > 0, ПрирощениеСуммы-0.0025, ПрирощениеСуммы+0.0025) / СуммаБезСкидки;
        
        // Расчитываем новое значение процента скидки и новую сумму по методу расчета ФР
        ПроцентСкидки    = ПроцентСкидки + ПрирощениеПроцента;
        СуммаСоСкидкойФР = Окр(СуммаБезСкидки - Окр(СуммаБезСкидки*ПроцентСкидки, 2) ,2);
        
    КонецЦикла;
    
    // Возвращаем уточненный процент скидки
    Возврат ПроцентСкидки * 100;
    
КонецФункции

СуммаСоСкидкой1С- сумма в документе Чекк ККМ округленная до 2х знаков. так как хранится в поле гдя под дробную часть отведено 2 знака

СуммаБезСкидки- сумма не округленная!

Посмотрел код, пока не знаю где подправить, так как на стороне 1с и в ФР расчет ведется по разному.

Вопрос. У кого нибудь встречалась такая ситуация расхождения сум в 1с и в чеке ФР. Если да, как поступали: правили конфу или правили что  то и как то?
1 Cyberhawk
 
29.11.16
23:32
КЗР в инфобазе
2 Torquader
 
29.11.16
23:34
Проблема стара как мир.
И, надо понимать, что в разных моделях ФР-ов заложен разный алгоритм расчёта скидки.
Где-то делается честно - сумма чека умножается на процент скидки, сдвигается на два разряда вправо и вычитается из суммы чека. В других местах, из 100 вычитается процент скидки - на полученный результат умножают сумму чека и сдвигают на два разряда влево.

Несколько способов решения проблемы:
1) Если у вас нет весовых товаров, то процент скидки указываете только в целых числах (то есть кратно одному проценту), а все цены указываете в рублях - тогда - при получении скидок суммы получатся хоть и с копейками, но округления не будет. Данный способ позволял честно делать оплату по карте на фискальном регистраторе, так как при указании суммы оплаты по карте, отличной от суммы чека вместо закрытия чека выдавалась ошибка.

2) Печатать весь чек текстовыми строками, а в конце пробивать одну покупку на итоговую сумму - тогда весь расчёт будет в самой 1С. Такой подход выбрать в популярных программах для автоматизации рабочего места кассира от Штрих-М и от АТОЛ. К сожалению, введение новых online-касс, где требуется указание всех товаров, запрещает так делать.

3) Указывать все цены и суммы уже с учётом скидок, чтобы ФР при расчёте не ошибался. Такой подход как раз был предложен в первых протоколах работы online-касс и имеет право на существование, но иногда получаются строки с нулевой ценой, что не есть хорошо.
3 Torquader
 
29.11.16
23:35
Кроме того, некоторые фискальные регистраторы позволяют получить итог чека после передачи данных всех продаж, но до закрытия чека - данное значение может быть использовано для вывода итога покупателю и для записи в 1С, где сумму скидки можно будет скорректировать.