Имя: Пароль:
1C
 
УТ - расчет чека от суммы, а в ККМ - от цены
, ,
0 RomaH
 
naïve
07.06.17
15:26
В чеке
4 штуки по 290,00 рублей
предоставлена скидка 70,18%
итого 345,91

в ККМ
рисует цену 86.48
умножает на 4
сумма = 345.92

в итоге итог по чеку на 2 копейки больше, чем получено наличных
это нормально?
1 h-sp
 
07.06.17
16:09
(0) по закону теперь скидка на каждую строку идет. поэтому поменяйте в ут, чтобы было правильно.
2 yzimin
 
07.06.17
16:34
(0) согласно "Требования к разработке драйверов подключаемого оборудования." и описанию структуры CheckPackage
https://its.1c.ru/db/metod8dev#content:4829:hdoc:chapter270

твоя строка в XML должна выглядеть так
<FiscalString Name="Макароны" Quantity="4" Price="290" Amount="345,91" Tax="none"/>

Price - Цена единицы товара без учета скидок/наценок
Amount - Конечная сумма по позиции чека (с учетом всех скидок/наценок)

Если строка в XML выглядит по-другому, отлаживай. Какой релиз УТ?
3 RomaH
 
naïve
08.06.17
07:17
(2) тогда такой вопрос - если строка выглядит не так
чем это черевато?
4 Злопчинский
 
08.06.17
07:28
(3) если вместо 220 включил в 380 - чем чревато? Отлупом...
5 RomaH
 
naïve
08.06.17
07:37
(4) как это "отлуп" проявляется? - где смотреть?
6 RomaH
 
naïve
08.06.17
07:38
ибо - клиент деньги заплатил, фискальник чек напечатал
что делать... что делать?
7 yzimin
 
08.06.17
07:46
(6) отлаживай.
Если строка выглядит по-другому, отлаживай УТ. Какой релиз?
Если совпадает, пиши в поддержку этого оборудования. Вероятно не соблюдается стандарт. Какой модели ККТ?
8 RomaH
 
naïve
08.06.17
08:06
(7) да поотлаживаю ... УТ 11.3.3.145
мне интересно - а какие последствия? - где смотреть что у нас все плохо - где флаг кторый показывает, что с кассой что-то не то творится
9 RomaH
 
naïve
09.06.17
11:02
в чеке скидки напечатаны

4х86.48=345.92
скидка 814.09

возврат (делал чек для примера)

4х86.48=345.92
скидка 0.01

на ОФД чеки эти есть

проблема в том, что итог по чеку в ККМ на две копейки больше, чем посчитала УТ - денег взяли с пациента на две копейки меньше
соответственно у кассира недостача

переписывать алгоритм расчета итога? или?
т.е. сейчас в УТ берем сумму, делим на количество - получаем цену - все

а надо
получить цену, округлить её до копеек, и пересчитать сумму еще раз - цена * количество
?
10 RomaH
 
naïve
09.06.17
11:08
11 Храбрый
 
09.06.17
11:12
(0) Я тожк сталкивался с такой проблемой и решил ее так.

Все строки в чеке передаю обычным текстом.

И в конце посылаю количество = 1 и общую сумму документа.
В результате ККМ ничего не вычисляет. Данные все идут.
12 Храбрый
 
09.06.17
11:14
(11) Примерно так

ПечатьСтроки("Хлеб 2 х 50, Скидка 10%", Сумма = 90);
ПечатьСтроки("Схара 1 х 300 = 300");

ПечатьЧека(1,390);
13 Масянька
 
09.06.17
11:15
(11) О, как вывернулся... Молодец!
14 RomaH
 
naïve
20.06.17
08:41
так всё-таки
(2) - я не думаю, что УТ выдает что-то не так, поэтому - пока не смотрел что она там в ККМ шлет

но вот то, что УТ считает от суммы, а ККМ пересчитывает от цены - это вроде как факт

никто не сталкивался с таким ? у всех всегда чек по суммам сходится?
15 Звездец
 
20.06.17
08:46
(12) и что у тебя в ОФД после этого?
16 RomaH
 
naïve
20.06.17
08:50
9561.80
17 RomaH
 
naïve
20.06.17
08:52
самое интересное - нет отказа по тому, что сумма оплаты меньше суммы чека
18 RomaH
 
naïve
20.06.17
09:02
(17) - а, нет, ошибаюсь
если кассир берет деньги копейка в копейку - то вываливается отказ от ККМ как раз по этой причине
19 yzimin
 
20.06.17
09:11
(18) тоже на днях описывал свою проблему
ККТ РИТЕЙЛ-01Ф,УТ 11.3,45h, Сумма всех типов оплаты меньше итога чека
возникает ошибка, когда сумма со скидкой нацело не делит на количество. У вас похоже что-то подобное, только ККТ у вас сама принимает решение)))
20 RomaH
 
naïve
20.06.17
09:27
(19) вопрос - как правильно исправить
переписывать УТ - сделать расчет от цены?
21 yzimin
 
20.06.17
09:30
(20) Мы пока в ККТ считаем скидку о суммы, а не от цены.
22 yzimin
 
20.06.17
09:31
(21) + для розницы там обход этой ситуации в ответе 9
23 assasu
 
20.06.17
09:42
(0) эта эбота от фирмы 1С. во всех конфах так сикдка считается и не правильность этого алгоритма проявилась с появлением фз 54
24 assasu
 
20.06.17
09:43
(12)а в этой последней строке как номенклатура называется? а то как бы это обязательный теперь реквизит
25 assasu
 
20.06.17
09:46
(14) да не сходится конечно.. изворачиваемся.
26 RomaH
 
naïve
20.06.17
10:22
как то так:

Процедура НазначитьРучнуюСкидку
...
            СтрокаТЧ.Сумма    = СуммаБезСкидки - ?(СуммаСкидки > СуммаБезСкидки, СуммаБезСкидки, СуммаСкидки);
                        //Пересчитаем "цену"
            лЦенаСоСкидкой = Окр(СтрокаТЧ.Сумма / СтрокаТЧ.Количество,2); //Окр(СтрокаТЧ.Сумма / СтрокаТЧ.Количество,2) * СтрокаТЧ.Количество
            лСуммаСоСкидкой = лЦенаСоСкидкой * СтрокаТЧ.Количество;
            лРазницаВычислений = СтрокаТЧ.Сумма - лСуммаСоСкидкой;
            СтрокаТЧ.СуммаРучнойСкидки = СтрокаТЧ.СуммаРучнойСкидки + лРазницаВычислений;
            СуммаСкидки = СуммаСкидки + лРазницаВычислений;
            СтрокаТЧ.Сумма    = СуммаБезСкидки - ?(СуммаСкидки > СуммаБезСкидки, СуммаБезСкидки, СуммаСкидки);

?
27 RomaH
 
naïve
20.06.17
10:25
вопрос еще - как отловить программно такие чеки
ибо на пользователей надеяться ... "все врут"

по сути вроде как есть электронный чек который должен/может хранится в базе для последующей отправки покупателю
28 h-sp
 
20.06.17
10:30
(27) по идее офд должен отправлять чеки покупателю. Если вы сами будете отправлять, то это будет туфта.
29 yzimin
 
20.06.17
10:42
(26) а я не за пересчёт скидки от цены, а за деление товара на 2 строки: 1) 50.02 руб, 2) 50.03
30 RomaH
 
naïve
20.06.17
10:46
(29) так сложнее
31 assasu
 
20.06.17
10:48
(29) это не сработает если весовой товар.
32 yzimin
 
20.06.17
11:05
(30) это как посмотреть. Я бы на первое время вставил костыль в момент формирования XML CheckPackage, чем разбираться в механизме автоматических, ручных скидок и их пересечении.
33 Naf2017
 
20.06.17
11:08
34 yzimin
 
20.06.17
11:15
(31) хотите сказать CheckPackage невозможно скорректировать под весовой товар?
35 assasu
 
20.06.17
11:20
(34)нет , все можно.
когда товар штучный сразу понятно как разбивать и алгоритм простой.
а если ты продаешь окорочок весом 134 грамма. как разбить на две строки  ?
36 RomaH
 
naïve
20.06.17
11:24
(32) и куда там костыль вставлять?

            Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
                    ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
                    ЗаписьXML.ЗаписатьАтрибут("Name"      , XMLСтрока(ТекущаяПозиция.Наименование));
                    ЗаписьXML.ЗаписатьАтрибут("Quantity"  , XMLСтрока(ТекущаяПозиция.Количество));
                    ЗаписьXML.ЗаписатьАтрибут("Price"     , XMLСтрока(ТекущаяПозиция.Цена));
                    ЗаписьXML.ЗаписатьАтрибут("Amount"    , XMLСтрока(ТекущаяПозиция.Сумма));
                    ЗаписьXML.ЗаписатьАтрибут("Department", XMLСтрока(ТекущаяПозиция.НомерСекции));
                    Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда
                        ЗаписьXML.ЗаписатьАтрибут("Tax"   , XMLСтрока(ТекущаяПозиция.СтавкаНДС));
                    Иначе
                        ЗаписьXML.ЗаписатьАтрибут("Tax"   , "none");
                    КонецЕсли;
                    ЗаписьXML.ЗаписатьКонецЭлемента();
                    СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма;
37 yzimin
 
20.06.17
11:30
(36) я бы как-то заранее преобразовал массив
ОбщиеПараметры.ПозицииЧека. Процедура ПолучитьXMLПакетДляФискализацияЧека оставил без изменения.

(35) судя моей логики, надо разбивать на 133 и 1 грамм с разными ценами - похоже больше на бред)))
38 assasu
 
20.06.17
11:35
(37) в (22) вы писали про ответ 9. это мой ответ.
так вот в нашей столовой есть эти самые окорочка  и весят они как правило меньше кг. но ошибки не было еще ни разу с ними связанными.

есть подозрение что тут высокая математика кроется, для дробных количеств меньше 1 как раз не бывает этой ошибки в 1 копейку.
39 RomaH
 
naïve
20.06.17
11:37
ЗаписьXML.ЗаписатьАтрибут("Quantity"  , XMLСтрока(ТекущаяПозиция.Количество));
                    ЗаписьXML.ЗаписатьАтрибут("Price"     , XMLСтрока(ТекущаяПозиция.Цена));
                    ЗаписьXML.ЗаписатьАтрибут("Amount"    , XMLСтрока(ТекущаяПозиция.Сумма));

в цене вроде как передается цена без скидки сейчас
т.е. фискальник сам высчитывает "значения реквизита «цена за единицу предмета расчета с учетом скидок и наценок» (тег 1079),"

потом округляет и считает

"Значение реквизита «стоимость предмета расчета с учетом скидок и наценок» (тег 1043)"

т.е. что передать фискальнику что бы было правильно?
40 assasu
 
20.06.17
11:39
(39) передать надо так что бы сумма деленная на количество давала число с (ровно) 2-я знаками.
41 RomaH
 
naïve
20.06.17
11:43
(40) тогда у меня в базе будет другая сумма в чеке ... или делить на две строки?
мне проще переписать алгоритм расчета итоговой суммы в строке путем корректировки ручной скидки
42 yzimin
 
20.06.17
11:46
(39) посмотри тут
https://its.1c.ru/db/metod8dev#content:4829:hdoc:chapter270

цена передаётся без скидки, всё верно
43 assasu
 
20.06.17
11:46
(41) если сумма другая будет это и значит что нужно переписать алгоритм расчета суммы итого.

ну или разбивать на строки . зависит от конкретной ситуации в торговой точке.
44 yzimin
 
20.06.17
11:50
(41) Учитывай ещё автоматические скидки. Сегодня их нет, завтра появились.

Реализуя правку на уровне пакета CheckPackage получится универсальное решение, которое подойдёт для всех конфигураций этой версии БПО.
45 RomaH
 
naïve
20.06.17
11:54
(44) правка на уровне пакета - получается только путем разбиения на две строки
46 yzimin
 
20.06.17
12:02
(45) само собой, только для штучных товаров.
47 RomaH
 
naïve
20.06.17
12:12
ну да
и изменение суммы в драйвер фискальника внесли, чтобы не выдавать ошибку по условию расхождения суммы от произведения на больше чем 1 копейку
вместо отказа, фискальник просто исправляет "Значение реквизита «стоимость предмета расчета с учетом скидок и наценок» "

как бы правильное решение - нет остановки кассы
просто чек не сходится с внешним калькулирующим устройством

и да - наверное проверка и корректировка путем разбиения на две строки именно внутри этого условия будет более правильной

            Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
                    ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
                    ЗаписьXML.ЗаписатьАтрибут("Name"      , XMLСтрока(ТекущаяПозиция.Наименование));
                    ЗаписьXML.ЗаписатьАтрибут("Quantity"  , XMLСтрока(ТекущаяПозиция.Количество));
48 h-sp
 
20.06.17
12:12
(40) а разве не наоборот, чтобы количество * цена и округлить до 2х знаков равнялось бы сумме?
49 RomaH
 
naïve
20.06.17
12:13
но у нас есть и дробное количество - будет ли оно попадать в ошибки? - как его корректировать?
50 yzimin
 
20.06.17
12:18
(49) вот поэтому мы откатили на версию драйвера, при которой скидка считается от суммы, а не от цены. Да, с некоторого времени так будет делать нельзя, но ждём реализации на уровне 1С или ПО ККТ
51 RomaH
 
naïve
20.06.17
12:57
типа так?

                лЦенаСоСкидкой = Окр(ТекущаяПозиция.Сумма / ТекущаяПозиция.Количество,2);
                лРазница = ТекущаяПозиция.Сумма - лЦенаСоСкидкой * ТекущаяПозиция.Количество;
                
                Если лРазница <> 0 Тогда
                    
                    Если ТекущаяПозиция.Количество > 1 Тогда
                        
                        лСуммаСоСкидкой = лЦенаСоСкидкой * (ТекущаяПозиция.Количество - 1);
                        
                        ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
                        ЗаписьXML.ЗаписатьАтрибут("Name"      , XMLСтрока(ТекущаяПозиция.Наименование));
                        ЗаписьXML.ЗаписатьАтрибут("Quantity"  , XMLСтрока(ТекущаяПозиция.Количество - 1));
                        ЗаписьXML.ЗаписатьАтрибут("Price"     , XMLСтрока(ТекущаяПозиция.Цена));
                        ЗаписьXML.ЗаписатьАтрибут("Amount"    , XMLСтрока(лСуммаСоСкидкой));
                        ЗаписьXML.ЗаписатьАтрибут("Department", XMLСтрока(ТекущаяПозиция.НомерСекции));
                        Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда
                            ЗаписьXML.ЗаписатьАтрибут("Tax"   , XMLСтрока(ТекущаяПозиция.СтавкаНДС));
                        Иначе
                            ЗаписьXML.ЗаписатьАтрибут("Tax"   , "none");
                        КонецЕсли;
                        ЗаписьXML.ЗаписатьКонецЭлемента();
                        
                        СуммаЧека = СуммаЧека + лСуммаСоСкидкой;
                        
                        
                        ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
                        ЗаписьXML.ЗаписатьАтрибут("Name"      , XMLСтрока(ТекущаяПозиция.Наименование));
                        ЗаписьXML.ЗаписатьАтрибут("Quantity"  , XMLСтрока(1));
                        ЗаписьXML.ЗаписатьАтрибут("Price"     , XMLСтрока(ТекущаяПозиция.Цена));
                        ЗаписьXML.ЗаписатьАтрибут("Amount"    , XMLСтрока(ТекущаяПозиция.Сумма - лСуммаСоСкидкой));
                        ЗаписьXML.ЗаписатьАтрибут("Department", XMLСтрока(ТекущаяПозиция.НомерСекции));
                        Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда
                            ЗаписьXML.ЗаписатьАтрибут("Tax"   , XMLСтрока(ТекущаяПозиция.СтавкаНДС));
                        Иначе
                            ЗаписьXML.ЗаписатьАтрибут("Tax"   , "none");
                        КонецЕсли;
                        ЗаписьXML.ЗаписатьКонецЭлемента();
                        
                        СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма - лСуммаСоСкидкой;
                        
                    Иначе
                        //Пока непонятно
                        ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
                        ЗаписьXML.ЗаписатьАтрибут("Name"      , XMLСтрока(ТекущаяПозиция.Наименование));
                        ЗаписьXML.ЗаписатьАтрибут("Quantity"  , XMLСтрока(ТекущаяПозиция.Количество));
                        ЗаписьXML.ЗаписатьАтрибут("Price"     , XMLСтрока(ТекущаяПозиция.Цена));
                        ЗаписьXML.ЗаписатьАтрибут("Amount"    , XMLСтрока(ТекущаяПозиция.Сумма));
                        ЗаписьXML.ЗаписатьАтрибут("Department", XMLСтрока(ТекущаяПозиция.НомерСекции));
                        Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда
                            ЗаписьXML.ЗаписатьАтрибут("Tax"   , XMLСтрока(ТекущаяПозиция.СтавкаНДС));
                        Иначе
                            ЗаписьXML.ЗаписатьАтрибут("Tax"   , "none");
                        КонецЕсли;
                        ЗаписьXML.ЗаписатьКонецЭлемента();
                        СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма;
                    КонецЕсли;
                Иначе
                    ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
                    ЗаписьXML.ЗаписатьАтрибут("Name"      , XMLСтрока(ТекущаяПозиция.Наименование));
                    ЗаписьXML.ЗаписатьАтрибут("Quantity"  , XMLСтрока(ТекущаяПозиция.Количество));
                    ЗаписьXML.ЗаписатьАтрибут("Price"     , XMLСтрока(ТекущаяПозиция.Цена));
                    ЗаписьXML.ЗаписатьАтрибут("Amount"    , XMLСтрока(ТекущаяПозиция.Сумма));
                    ЗаписьXML.ЗаписатьАтрибут("Department", XMLСтрока(ТекущаяПозиция.НомерСекции));
                    Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда
                        ЗаписьXML.ЗаписатьАтрибут("Tax"   , XMLСтрока(ТекущаяПозиция.СтавкаНДС));
                    Иначе
                        ЗаписьXML.ЗаписатьАтрибут("Tax"   , "none");
                    КонецЕсли;
                    ЗаписьXML.ЗаписатьКонецЭлемента();
                    СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма;
                КонецЕсли;
52 yzimin
 
20.06.17
13:05
(51) не уж-то вам хочется ломать функцию ПолучитьXMLПакетДляФискализацияЧека? Ну создайте отдельный модуль, передавайте параметром всю структуру ОбщиеПараметры и там уже обрабатывайте массив структур ОбщиеПараметры.ПозицииЧека

по реализации ничего не скажу, тестируйте, отлаживайте)
53 yzimin
 
01.07.17
02:07
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший