Имя: Пароль:
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