|
v7: Распределение скидки по чеку V2 | ☑ | ||
---|---|---|---|---|
0
san4ez1008
23.08.17
✎
09:32
|
В продолжение темы Распределение скидки по чеку
Ребят, такая проблема, в теме Некорректный подсчет сумм в fr_elves Решил сделать по-другому, вручную пересчитывал сумму в документе и сравнивал с суммой , которая получилась за минусом скидки. Код: //******************************************* Процедура Сформировать() Перем minPoints,maxPoints,СПАСИБО1; minpoints=0; maxpoints=1000; Док = СоздатьОбъект("Документ.ЧекККМ"); Док=ВыбДок; Предупреждение("Минимальная сумма скидки:"+minPoints/100+РазделительСтрок+"Максимальная сумма скидки:"+maxPoints/100,0); ОбщСкидка1=ВвестиЧисло(СПАСИБО1,"Введите количество списываемых бонусов",6,2,0); Если СПАСИБО1*100 > maxPoints тогда Предупреждение("Сумма списания больше допустимой!",0); Возврат; ИначеЕсли СПАСИБО1*100<minpoints тогда Предупреждение("Сумма списания меньше допустимой!",0); Возврат; иначе //проверка на списание //ТЗ1=СоздатьОбъект("ТаблицаЗначений"); //Спасибо1=Спасибо; ТЗ1.Очистить(); Док.ВыгрузитьТабличнуюЧасть(ТЗ1); ТЗ1.УдалитьКолонку("Единица"); ТЗ1.УдалитьКолонку("Коэффициент"); ТЗ1.УдалитьКолонку("Акция"); ТЗ1.УдалитьКолонку("СкидкаПоСтроке"); ТЗ1.УдалитьКолонку("СкидкаСпасибо"); ТЗ1.УдалитьКолонку("Штрихкод"); ТЗ1.УдалитьКолонку("НомерСтроки"); ТЗ1.НоваяКолонка("МаксСкидка","Число",8,2,"МаксСкидка"); ТЗ1.НоваяКолонка("СкидкаОст","Число",8,2,"СкидкаОст"); ТЗ1.НоваяКолонка("МаксСкидкаОст","Число",8,2,"МаксСкидкаОст"); ТЗ1.НоваяКолонка("Скидка","Число",8,2,"Скидка"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл ТЗ1.МаксСкидка=ТЗ1.Сумма; КонецЦикла; СпрНовНоменклатураБезСкидок = СоздатьОбъект("Справочник.НовНоменклатураБезСкидок"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл Если СпрНовНоменклатураБезСкидок.НайтиПоРеквизиту("Номенклатура",ТЗ1.Номенклатура,1)=1 Тогда ТЗ1.УдалитьСтроку(); ТЗ1.ВыбратьСтроки(); КонецЕсли; КонецЦикла; ТЗ1.ВЫбратьСтроки(); // //ОбщСкидка1=СПАСИБО1; Остаток1=ТЗ1.Итог("МаксСкидка"); СуммаСтрок1=0; Разница=0; ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл МаксСкидкаОст1=Остаток1-СуммаСтрок1; СуммаСтрок1=СуммаСтрок1+ТЗ1.МаксСкидка; ТЗ1.МаксСкидкаОст=МаксСкидкаОст1; ТЗ1.Скидка=((Спасибо1*ТЗ1.МаксСкидка)/ТЗ1.МаксСкидкаОст); Цена1=окр((ТЗ1.Сумма-ТЗ1.Скидка)/ТЗ1.Количество,2); Если Цена1*ТЗ1.Количество<>ТЗ1.Сумма-ТЗ1.Скидка тогда Разница=Разница+ТЗ1.Скидка-((Цена1*ТЗ1.Количество)-(ТЗ1.Сумма-ТЗ1.Скидка)); СпасибоНужно=СпасибоНужно+Разница; Предупреждение("Для корректной скидки на чек нужно списать "+(окр(Разница+Спасибо1-ТЗ1.Скидка,2))+" СПАСИБО!"); Возврат; иначе СпасибоНужно=СпасибоНужно+ТЗ1.Скидка; КонецЕсли; Разница=Разница+ТЗ1.Скидка-((Цена1*ТЗ1.Количество)-(ТЗ1.Сумма-ТЗ1.Скидка)); ТЗ1.СкидкаОст=Спасибо1; Спасибо1=Спасибо1-ТЗ1.Скидка; КонецЦикла; Предупреждение("Для корректной скидки на чек нужно списать "+Разница+" СПАСИБО!"); КонецЕсли; //проверка на списание КонецПроцедуры Появилась проблема, при каждом случае, когда суммы не равны, 1С будет выдавать сообщение, что нужно списать другую сумму бонусов. Мне бы сделать так, чтобы программа выводила только конечное количество бонусов, которое нужно списать. Подправил код: //******************************************* Процедура Сформировать() Перем minPoints,maxPoints,СПАСИБО1; minpoints=0; maxpoints=1000; Док = СоздатьОбъект("Документ.ЧекККМ"); Док=ВыбДок; Предупреждение("Минимальная сумма скидки:"+minPoints/100+РазделительСтрок+"Максимальная сумма скидки:"+maxPoints/100,0); ОбщСкидка1=ВвестиЧисло(СПАСИБО1,"Введите количество списываемых бонусов",6,2,0); Если СПАСИБО1*100 > maxPoints тогда Предупреждение("Сумма списания больше допустимой!",0); Возврат; ИначеЕсли СПАСИБО1*100<minpoints тогда Предупреждение("Сумма списания меньше допустимой!",0); Возврат; иначе //проверка на списание //ТЗ1=СоздатьОбъект("ТаблицаЗначений"); //Спасибо1=Спасибо; ТЗ1.Очистить(); Док.ВыгрузитьТабличнуюЧасть(ТЗ1); ТЗ1.УдалитьКолонку("Единица"); ТЗ1.УдалитьКолонку("Коэффициент"); ТЗ1.УдалитьКолонку("Акция"); ТЗ1.УдалитьКолонку("СкидкаПоСтроке"); ТЗ1.УдалитьКолонку("СкидкаСпасибо"); ТЗ1.УдалитьКолонку("Штрихкод"); ТЗ1.УдалитьКолонку("НомерСтроки"); ТЗ1.НоваяКолонка("МаксСкидка","Число",8,2,"МаксСкидка"); ТЗ1.НоваяКолонка("СкидкаОст","Число",8,2,"СкидкаОст"); ТЗ1.НоваяКолонка("МаксСкидкаОст","Число",8,2,"МаксСкидкаОст"); ТЗ1.НоваяКолонка("Скидка","Число",8,2,"Скидка"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл ТЗ1.МаксСкидка=ТЗ1.Сумма; КонецЦикла; СпрНовНоменклатураБезСкидок = СоздатьОбъект("Справочник.НовНоменклатураБезСкидок"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл Если СпрНовНоменклатураБезСкидок.НайтиПоРеквизиту("Номенклатура",ТЗ1.Номенклатура,1)=1 Тогда ТЗ1.УдалитьСтроку(); ТЗ1.ВыбратьСтроки(); КонецЕсли; КонецЦикла; ТЗ1.ВЫбратьСтроки(); // //ОбщСкидка1=СПАСИБО1; Остаток1=ТЗ1.Итог("МаксСкидка"); СуммаСтрок1=0; Разница=0; ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл МаксСкидкаОст1=Остаток1-СуммаСтрок1; СуммаСтрок1=СуммаСтрок1+ТЗ1.МаксСкидка; ТЗ1.МаксСкидкаОст=МаксСкидкаОст1; ТЗ1.Скидка=((Спасибо1*ТЗ1.МаксСкидка)/ТЗ1.МаксСкидкаОст); Цена1=окр((ТЗ1.Сумма-ТЗ1.Скидка)/ТЗ1.Количество,2); Пока Цена1*ТЗ1.Количество<>ТЗ1.Сумма-ТЗ1.Скидка цикл Если Цена1*ТЗ1.Количество=ТЗ1.Сумма-ТЗ1.Скидка тогда Разница=Разница+ТЗ1.Скидка-((Цена1*ТЗ1.Количество)-(ТЗ1.Сумма-ТЗ1.Скидка)); СпасибоНужно=СпасибоНужно+Разница; Предупреждение("Для корректной скидки на чек нужно списать "+(окр(Разница+Спасибо1-ТЗ1.Скидка,2))+" СПАСИБО!"); Возврат; иначе СпасибоНужно=СпасибоНужно+ТЗ1.Скидка; КонецЕсли; Разница=Разница+ТЗ1.Скидка-((Цена1*ТЗ1.Количество)-(ТЗ1.Сумма-ТЗ1.Скидка)); ТЗ1.СкидкаОст=Спасибо1; Спасибо1=Спасибо1-ТЗ1.Скидка; КОнецЦикла; КонецЦикла; Предупреждение("Для корректной скидки на чек нужно списать "+Разница+" СПАСИБО!"); КонецЕсли; //проверка на списание КонецПроцедуры ушел в бесконечный цикл... Подскажите, что я не так делаю? |
|||
1
Автор
23.08.17
✎
09:35
|
ТЗ1.ВыбратьСтроки(); - слишком много раз повторяется
|
|||
2
san4ez1008
23.08.17
✎
09:53
|
(1) да это то ладно...как проблему решить?
|
|||
3
Ёпрст
23.08.17
✎
10:04
|
(2) всё в топку. Ну, можешь оставить и подождать, когда тебе дверкой яйки будут щемить за предупреждение в коде, тот кто этим будет пользоваться
|
|||
4
Ёпрст
23.08.17
✎
10:04
|
а код, ужасен. Полное незнание применяемых методов и куча лишнего
|
|||
5
monsterZE
23.08.17
✎
10:09
|
Пока Цена1*ТЗ1.Количество<>ТЗ1.Сумма-ТЗ1.Скидка цикл
|
|||
6
monsterZE
23.08.17
✎
10:09
|
ну и так - шляпа какая-то =)
|
|||
7
san4ez1008
23.08.17
✎
10:49
|
(3) предупреждение-необходимая вещь в данной ситуации,тут поделать ничего не могу. ну да,ужасен,по-другому не умею..
|
|||
8
Ёпрст
23.08.17
✎
10:51
|
(7) Правда ? В накладной, к примеру, 50 строк.. получить даже 30 предупреждений и тыркать мышой/клавой 30 раз, я на месте оператора тебя бы в первый же день споймал
|
|||
9
san4ez1008
23.08.17
✎
10:54
|
(8) не не, это не в накладной будет, а в чеке, первое предупреждение "Минимальная сумма скидки:"+minPoints/100+РазделительСтрок+"Максимальная сумма скидки:"+maxPoints/100,0); выведется только один раз. Собственно и проблема, мне нужно от предупреждений в цикле избавиться, то есть: в чеке будет применяться скидка на сумму 50 бонусов, я высчитываю, правильно ли распределится скидка или нет. И если цена*количество<>сумма-скидка , то тогда должно появиться предупреждение о ближайшей корректной сумме списания. Вот собственно и прошу у Вас помощи, как к такому виду прийти.
|
|||
10
пипец
23.08.17
✎
10:55
|
(8) ненуачо ))) нормально так ))) помнится ради искусства для того чтобы не скучно было пока формируется отчет, загнали стихи (поэму) показывать , по четверостишиям )))))
|
|||
11
Ёпрст
23.08.17
✎
11:16
|
(9) в коде мусор + нет изначальных значений переменных, типа Спасибонужно
|
|||
12
Ёпрст
23.08.17
✎
11:21
|
Ну и бесконечный цикл у тебя вот этот :
Пока Цена1*ТЗ1.Количество<>ТЗ1.Сумма-ТЗ1.Скидка цикл ибо дальше, ты нигде в коде не меняешь значения этих переменных. |
|||
13
san4ez1008
24.08.17
✎
02:12
|
(12) ну а как они будут меняться,если у меня сначала выборка ТЗ идет,а потом только этот цикл? еще одну выборку ТЗ открывать?
|
|||
14
san4ez1008
24.08.17
✎
09:00
|
ап
|
|||
15
Ёпрст
24.08.17
✎
09:50
|
(13)Еще раз. Ты сделал бесконечный цикл. Что тебя в нём не устраивает ?
|
|||
16
Ёпрст
24.08.17
✎
09:52
|
Если че, ты написал следующее:
Вася="Лошпед"; Пока Вася = "Лошпед" Цикл КонецЦикла; Так понятнее ? В цикле, у тебя Вася никак не меняется. |
|||
17
пипец
24.08.17
✎
10:07
|
да уж и ТЗ для удаления строк нада обходить снизу
|
|||
18
пипец
24.08.17
✎
10:09
|
из серии
Для А=-ТЗТЧ.Количествострок() по -1 Цикл ТЗТЧ.Получитьстрокупономеру(А*(-1)); Если СписокНомен.Принадлежит(ТЗТЧ.Номенклатура)>0 тогда Иначе ТЗТЧ.Удалитьстроку(); КонецЕсли; КонецЦикла; |
|||
19
san4ez1008
11.09.17
✎
03:14
|
Короче,не понимаю, что получилось, но то, чего я хотел добиться,у меня не вышло.
Процедура Сформировать() Перем minPoints,maxPoints,СПАСИБО1; minpoints=0; maxpoints=100000; Док = СоздатьОбъект("Документ.ЧекККМ"); Док=ВыбДок; Предупреждение("Минимальная сумма скидки:"+minPoints/100+РазделительСтрок+"Максимальная сумма скидки:"+maxPoints/100,0); ОбщСкидка1=ВвестиЧисло(СПАСИБО1,"Введите количество списываемых бонусов",6,1,0); Если СПАСИБО1*100 > maxPoints тогда Предупреждение("Сумма списания больше допустимой!",0); Возврат; ИначеЕсли СПАСИБО1*100<minpoints тогда Предупреждение("Сумма списания меньше допустимой!",0); Возврат; иначе //проверка на списание //ТЗ1=СоздатьОбъект("ТаблицаЗначений"); //Спасибо1=Спасибо; ТЗ1.Очистить(); Док.ВыгрузитьТабличнуюЧасть(ТЗ1); ТЗ1.УдалитьКолонку("Единица"); ТЗ1.УдалитьКолонку("Коэффициент"); ТЗ1.УдалитьКолонку("Акция"); ТЗ1.УдалитьКолонку("СкидкаПоСтроке"); ТЗ1.УдалитьКолонку("СкидкаСпасибо"); ТЗ1.УдалитьКолонку("Штрихкод"); ТЗ1.УдалитьКолонку("НомерСтроки"); ТЗ1.НоваяКолонка("МаксСкидка","Число",8,1,"МаксСкидка"); ТЗ1.НоваяКолонка("СкидкаОст","Число",8,1,"СкидкаОст"); ТЗ1.НоваяКолонка("МаксСкидкаОст","Число",8,1,"МаксСкидкаОст"); ТЗ1.НоваяКолонка("Скидка","Число",8,1,"Скидка"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл ТЗ1.МаксСкидка=ТЗ1.Сумма; КонецЦикла; СпрНовНоменклатураБезСкидок = СоздатьОбъект("Справочник.НовНоменклатураБезСкидок"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл Если СпрНовНоменклатураБезСкидок.НайтиПоРеквизиту("Номенклатура",ТЗ1.Номенклатура,1)=1 Тогда ТЗ1.УдалитьСтроку(); ТЗ1.ВыбратьСтроки(); КонецЕсли; КонецЦикла; Спасибо=Спасибо1; //ОбщСкидка1=СПАСИБО1; Остаток1=ТЗ1.Итог("МаксСкидка"); СуммаСтрок1=0; Разница=0; СпасибоНужно=0; НеобходимаяСуммаСписания=0; ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл СпасибоНужно=0; МаксСкидкаОст1=Остаток1-СуммаСтрок1; СуммаСтрок1=СуммаСтрок1+ТЗ1.МаксСкидка; ТЗ1.МаксСкидкаОст=МаксСкидкаОст1; ТЗ1.Скидка=((Спасибо1*ТЗ1.МаксСкидка)/ТЗ1.МаксСкидкаОст); Цена1=окр((ТЗ1.Сумма-ТЗ1.Скидка)/ТЗ1.Количество,1); СуммаПоЦене=Цена1*ТЗ1.Количество; СуммаПоСкидке=ТЗ1.Сумма-ТЗ1.Скидка; Пока СуммаПоЦене<>СуммаПоСкидке цикл Если СуммаПоЦене>СуммаПоСкидке тогда СуммаПоСкидке=СУммаПоСкидке+0.1; СпасибоНужно=СпасибоНужно+0.1; иначеЕсли СУммаПоЦене<СуммаПоСкидке тогда СуммаПоСкидке=СуммаПоСкидке-0.1; СпасибоНужно=СпасибоНужно-0.1; КонецЕсли; КОнецЦикла; НеобходимаяСуммаСписания=НеобходимаяСуммаСписания+СпасибоНужно; ТЗ1.СкидкаОст=Спасибо1; Спасибо1=Спасибо1-ТЗ1.Скидка; КонецЦикла; КонецЕсли; Если НеобходимаяСуммаСписания<>0 тогда Предупреждение("Для корректной скидки нужно списать "+(окр(НеобходимаяСуммаСписания+Спасибо,1))+" СПАСИБО!"); КонецЕсли; //проверка на списание КонецПроцедуры |
|||
20
san4ez1008
11.09.17
✎
08:45
|
+(19) хрен с ним с обходом ТЗ снизу. Суть то в чем, нужно найти ближайшее число, которое беспрепятственно даст нормальную корректную скидку. И вроде бы как и все хорошо, но что-то не так...уже и округлил до целых чисел,выполняется код и предупреждение выдает число,но потом это же число уже не подходит. ЧЯДНТ?
|
|||
21
Ёпрст
11.09.17
✎
09:36
|
(20) в одном месте округляешь до десятых и сравниваешь с числом, в котором нет округления. Это так, не глядя в твой код.
|
|||
22
bolder
11.09.17
✎
09:56
|
(20) Нельзя так сравнивать нецелые числа!За это в большом программировании по пальцам бьют)
|
|||
23
san4ez1008
11.09.17
✎
10:47
|
Да,косяк понял,у меня разница цены со скидкой и цены которая будет подсчитываться в fr_elves 1 копейка, поэтому бонусы нужно будет списывать с учетом копеек...
//******************************************* Процедура Сформировать() Перем minPoints,maxPoints,СПАСИБО1; minpoints=0; maxpoints=100000; Док = СоздатьОбъект("Документ.ЧекККМ"); Док=ВыбДок; Предупреждение("Минимальная сумма скидки:"+minPoints/100+РазделительСтрок+"Максимальная сумма скидки:"+maxPoints/100,0); ОбщСкидка1=ВвестиЧисло(СПАСИБО1,"Введите количество списываемых бонусов",6,2,0); Если СПАСИБО1*100 > maxPoints тогда Предупреждение("Сумма списания больше допустимой!",0); Возврат; ИначеЕсли СПАСИБО1*100<minpoints тогда Предупреждение("Сумма списания меньше допустимой!",0); Возврат; иначе //проверка на списание //ТЗ1=СоздатьОбъект("ТаблицаЗначений"); //Спасибо1=Спасибо; ТЗ1.Очистить(); Док.ВыгрузитьТабличнуюЧасть(ТЗ1); ТЗ1.УдалитьКолонку("Единица"); ТЗ1.УдалитьКолонку("Коэффициент"); ТЗ1.УдалитьКолонку("Акция"); ТЗ1.УдалитьКолонку("СкидкаПоСтроке"); ТЗ1.УдалитьКолонку("СкидкаСпасибо"); ТЗ1.УдалитьКолонку("Штрихкод"); ТЗ1.УдалитьКолонку("НомерСтроки"); ТЗ1.НоваяКолонка("МаксСкидка","Число",8,2,"МаксСкидка"); ТЗ1.НоваяКолонка("СкидкаОст","Число",8,2,"СкидкаОст"); ТЗ1.НоваяКолонка("МаксСкидкаОст","Число",8,2,"МаксСкидкаОст"); ТЗ1.НоваяКолонка("Скидка","Число",8,2,"Скидка"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл ТЗ1.МаксСкидка=ТЗ1.Сумма; КонецЦикла; СпрНовНоменклатураБезСкидок = СоздатьОбъект("Справочник.НовНоменклатураБезСкидок"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл Если СпрНовНоменклатураБезСкидок.НайтиПоРеквизиту("Номенклатура",ТЗ1.Номенклатура,1)=1 Тогда ТЗ1.УдалитьСтроку(); ТЗ1.ВыбратьСтроки(); КонецЕсли; КонецЦикла; Спасибо=Спасибо1; //ОбщСкидка1=СПАСИБО1; Остаток1=ТЗ1.Итог("МаксСкидка"); СуммаСтрок1=0; Разница=0; СпасибоНужно=0; НеобходимаяСуммаСписания=0; ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл СпасибоНужно=0; МаксСкидкаОст1=Остаток1-СуммаСтрок1; СуммаСтрок1=СуммаСтрок1+ТЗ1.МаксСкидка; ТЗ1.МаксСкидкаОст=МаксСкидкаОст1; ТЗ1.Скидка=((Спасибо1*ТЗ1.МаксСкидка)/ТЗ1.МаксСкидкаОст); Цена1=окр((ТЗ1.Сумма-ТЗ1.Скидка)/ТЗ1.Количество,2); СуммаПоЦене=Цена1*ТЗ1.Количество; СуммаПоСкидке=ТЗ1.Сумма-ТЗ1.Скидка; Пока СуммаПоЦене<>СуммаПоСкидке цикл Если СуммаПоЦене>СуммаПоСкидке тогда СуммаПоСкидке=СУммаПоСкидке+0.01; СпасибоНужно=СпасибоНужно+0.01; иначеЕсли СУммаПоЦене<СуммаПоСкидке тогда СуммаПоСкидке=СуммаПоСкидке-0.01; СпасибоНужно=СпасибоНужно-0.01; КонецЕсли; КОнецЦикла; НеобходимаяСуммаСписания=НеобходимаяСуммаСписания+СпасибоНужно; ТЗ1.СкидкаОст=Спасибо1; Спасибо1=Спасибо1-ТЗ1.Скидка; КонецЦикла; КонецЕсли; Если НеобходимаяСуммаСписания<>0 тогда Предупреждение("Для корректной скидки нужно списать "+(окр(НеобходимаяСуммаСписания+Спасибо,2))+" СПАСИБО!"); КонецЕсли; //проверка на списание КонецПроцедуры но проблема до сих пор в том, что число, которое должно по идее подходить, не подходит, и приходится по нескольку раз вводить числа с разницей в 1-3 копейки |
|||
24
san4ez1008
14.09.17
✎
09:42
|
ап
|
|||
25
Ёпрст
14.09.17
✎
09:45
|
(23) Твоя проблема в том, что пока тут никто не понимает что ты вообще делаешь и зачем всё это нужно.
Разбираться в г-коде всем тоже лень. И.. ты всё еще сравниваешь числа с разной разрядностью. |
|||
26
Ёпрст
14.09.17
✎
09:46
|
Вот это , для начала, выкинь из кода
ТЗ1.УдалитьКолонку("Единица"); ТЗ1.УдалитьКолонку("Коэффициент"); ТЗ1.УдалитьКолонку("Акция"); ТЗ1.УдалитьКолонку("СкидкаПоСтроке"); ТЗ1.УдалитьКолонку("СкидкаСпасибо"); ТЗ1.УдалитьКолонку("Штрихкод"); ТЗ1.УдалитьКолонку("НомерСтроки"); и прочти, наконец, описание метода ВыгрузитьТабличнуюЧасть и его параметры. |
|||
27
Ёпрст
14.09.17
✎
09:47
|
вот это, тоже выкинь из кода
Пока ТЗ1.ПолучитьСтроку()=1 цикл ТЗ1.МаксСкидка=ТЗ1.Сумма; КонецЦикла; и прочти, про метод Заполнить() |
|||
28
san4ez1008
14.09.17
✎
10:10
|
(25) мне это нужно для того,чтобы после применения скидки не получилось ситуации, когда сумма оплаты меньше или больше итога чека. Поэтому я для каждой строки чека считаю цену на товар,которая получится в результате применения скидки.
Цена1=окр((ТЗ1.Сумма-ТЗ1.Скидка)/ТЗ1.Количество,2);//цена, которая считается в fr_elves СуммаПоЦене=Цена1*ТЗ1.Количество;//сумма в fr_elves СуммаПоСкидке=ТЗ1.Сумма-ТЗ1.Скидка;//сумма в рез-те прим.скидки и если суммы эти не равны (вероятнее всего, разница 1 копейка, то тогда к сумме примененной скидки нужно прибавить 1 копейку. Затем следующая строка,и так далее.. В итоге если необходимая сумма списания (то есть сумма этих копеек не равна 0), тогда нужно вывести предупреждение что к сумме скидки нужно добавить столько-то копеек, и все. Проверь на любом чеке, и поймешь,о чем я. |
|||
29
Ёпрст
14.09.17
✎
10:22
|
(28) у нас нет розницы, ну и чтобы "победить" копейку. Есть гораздо проще алгоритмы.
|
|||
30
san4ez1008
14.09.17
✎
10:23
|
(29) например?
|
|||
31
Ёпрст
14.09.17
✎
10:27
|
(30) Рассчитывать всё всегда от суммы, а не от цены.
|
|||
32
san4ez1008
14.09.17
✎
10:36
|
(31) Цена1=окр((ТЗ1.Сумма-ТЗ1.Скидка)/ТЗ1.Количество,2);
эту проверку я делаю,чтобы потом fr_elves не выдал ошибку Cумма всех типов оплаты меньше итога чека... |
|||
33
san4ez1008
14.09.17
✎
10:36
|
поэтому и приходится от цены считать
|
|||
34
san4ez1008
27.09.17
✎
15:43
|
(33) всем привет. Короче я так и не победил эту копейку(( помогите пожалуйста. всю голову изломал но так ничего больше и не придумал( помогите довести до ума(
//******************************************* Процедура Сформировать() Перем minPoints,maxPoints,СПАСИБО1; minpoints=0; maxpoints=100000; Док = СоздатьОбъект("Документ.ЧекККМ"); Док=ВыбДок; Предупреждение("Минимальная сумма скидки:"+minPoints/100+РазделительСтрок+"Максимальная сумма скидки:"+maxPoints/100,0); ОбщСкидка1=ВвестиЧисло(СПАСИБО1,"Введите количество списываемых бонусов",6,2,0); Если СПАСИБО1*100 > maxPoints тогда Предупреждение("Сумма списания больше допустимой!",0); Возврат; ИначеЕсли СПАСИБО1*100<minpoints тогда Предупреждение("Сумма списания меньше допустимой!",0); Возврат; иначе //проверка на списание //ТЗ1=СоздатьОбъект("ТаблицаЗначений"); //Спасибо1=Спасибо; ТЗ1.Очистить(); Док.ВыгрузитьТабличнуюЧасть(ТЗ1,"Номенклатура,Количество,Цена,Сумма"); ТЗ1.НоваяКолонка("МаксСкидка","Число",8,2,"МаксСкидка"); ТЗ1.НоваяКолонка("СкидкаОст","Число",8,2,"СкидкаОст"); ТЗ1.НоваяКолонка("МаксСкидкаОст","Число",8,2,"МаксСкидкаОст"); ТЗ1.НоваяКолонка("Скидка","Число",8,2,"Скидка"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл ТЗ1.МаксСкидка=ТЗ1.Сумма; КонецЦикла; СпрНовНоменклатураБезСкидок = СоздатьОбъект("Справочник.НовНоменклатураБезСкидок"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл Если СпрНовНоменклатураБезСкидок.НайтиПоРеквизиту("Номенклатура",ТЗ1.Номенклатура,1)=1 Тогда ТЗ1.УдалитьСтроку(); ТЗ1.ВыбратьСтроки(); КонецЕсли; КонецЦикла; Спасибо=Спасибо1; //ОбщСкидка1=СПАСИБО1; Остаток1=ТЗ1.Итог("МаксСкидка"); СуммаСтрок1=0; Разница=0; СпасибоНужно=0; НеобходимаяСуммаСписания=0; ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 цикл СпасибоНужно=0; МаксСкидкаОст1=Остаток1-СуммаСтрок1; СуммаСтрок1=СуммаСтрок1+ТЗ1.МаксСкидка; ТЗ1.МаксСкидкаОст=МаксСкидкаОст1; ТЗ1.Скидка=((Спасибо1*ТЗ1.МаксСкидка)/ТЗ1.МаксСкидкаОст); Цена1=окр((ТЗ1.Сумма-ТЗ1.Скидка)/ТЗ1.Количество,2); СуммаПоЦене=Цена1*ТЗ1.Количество; СуммаПоСкидке=ТЗ1.Сумма-ТЗ1.Скидка; Пока СуммаПоЦене<>СуммаПоСкидке цикл Если СуммаПоЦене>СуммаПоСкидке тогда СуммаПоСкидке=СУммаПоСкидке+0.01; СпасибоНужно=СпасибоНужно+0.01; иначеЕсли СУммаПоЦене<СуммаПоСкидке тогда СуммаПоСкидке=СуммаПоСкидке-0.01; СпасибоНужно=СпасибоНужно-0.01; КонецЕсли; КОнецЦикла; НеобходимаяСуммаСписания=НеобходимаяСуммаСписания+СпасибоНужно; ТЗ1.СкидкаОст=Спасибо1; Спасибо1=Спасибо1-ТЗ1.Скидка; КонецЦикла; Если НеобходимаяСуммаСписания<>0 тогда Предупреждение("Для корректной скидки нужно списать "+(окр(НеобходимаяСуммаСписания+Спасибо,2))+" СПАСИБО!"); КонецЕсли; КонецЕсли; //проверка на списание КонецПроцедуры |
|||
35
san4ez1008
27.09.17
✎
16:11
|
ну ребят,помогите пожалуйста((
|
|||
36
Ёпрст
27.09.17
✎
16:15
|
(35) думай над этим:
10/3 = 3.333333333333(3) |
|||
37
san4ez1008
27.09.17
✎
16:22
|
(36) ну если только 10/3=3.33*2+3.34, но мне такой вариант не подходит.
|
|||
38
Ёпрст
27.09.17
✎
16:26
|
(37) еще раз: сравнивай числа с одной точностью.
|
|||
39
Ёпрст
27.09.17
✎
16:26
|
в коде.
|
|||
40
Ёпрст
27.09.17
✎
16:26
|
всегда.
|
|||
41
san4ez1008
27.09.17
✎
16:34
|
(38) (39) (40) так..ладно,пойдем по порядку..
ОбщСкидка1=ВвестиЧисло(СПАСИБО1,"Введите количество списываемых бонусов",6,2,0);//число с 2 разрядами ТЗ1.НоваяКолонка("МаксСкидка","Число",8,2,"МаксСкидка");//2 разряда ТЗ1.НоваяКолонка("СкидкаОст","Число",8,2,"СкидкаОст");//2 разряда ТЗ1.НоваяКолонка("МаксСкидкаОст","Число",8,2,"МаксСкидкаОст");//2 разряда ТЗ1.НоваяКолонка("Скидка","Число",8,2,"Скидка");//2 разряда Цена1=окр((ТЗ1.Сумма-ТЗ1.Скидка)/ТЗ1.Количество,2);//округлено до 2 разрядов СуммаПоЦене=Цена1*ТЗ1.Количество;//2 разряда СуммаПоСкидке=ТЗ1.Сумма-ТЗ1.Скидка;//2 разряда что я пропустил? |
|||
42
san4ez1008
27.09.17
✎
16:50
|
все числа,которые я сравниваю,имеют 2 знака после запятой,где ошибка,я не понимаю?
|
|||
43
Ёпрст
27.09.17
✎
17:11
|
ТЗ1.Скидка=((Спасибо1*ТЗ1.МаксСкидка)/ТЗ1.МаксСкидкаОст);
|
|||
44
Ёпрст
27.09.17
✎
17:12
|
СуммаПоСкидке=ТЗ1.Сумма-ТЗ1.Скидка;
|
|||
45
Ёпрст
27.09.17
✎
17:12
|
дальше много думать
|
|||
46
san4ez1008
27.09.17
✎
17:16
|
(43) погоди
ТЗ1.НоваяКолонка("Скидка","Число",8,2,"Скидка")//2 разряда ТЗ1.НоваяКолонка("МаксСкидка","Число",8,2,"МаксСкидка")//2 разряда ТЗ1.НоваяКолонка("МаксСкидкаОст","Число",8,2,"МаксСкидкаОст")//2 разряда везде по 2 разряда, Спасибо1 вводится оператором.. из-за него вся петрушка? |
|||
47
san4ez1008
27.09.17
✎
17:17
|
(45) сарказм?
|
|||
48
san4ez1008
27.09.17
✎
17:38
|
(47) ну и че мне с ним сделать?
|
|||
49
Ёпрст
27.09.17
✎
17:41
|
(48) жуколов то включи, он покажет, где ошибка и почему.
|
|||
50
Ёпрст
27.09.17
✎
17:42
|
а так, весьма странный алгоритм
|
|||
51
san4ez1008
27.09.17
✎
22:07
|
(50) так он ошибок мне и не выдавал,в том то и проблема,я ж не просто так пишу сюда..
|
|||
52
Ёпрст
28.09.17
✎
10:31
|
(51) он покажет ошибку в твоих вычислениях.
А так, мне к примеру, лень разбираться зачем вообще всё это и что и на что ты делишь и отнимаешь и зачем какие-то копейуи кому-то прибавляешь. |
|||
53
san4ez1008
28.09.17
✎
15:35
|
(52) я проверил в отладчике, ошибок нет в вычислениях, в том то и проблема.. я не прошу разобраться,зачем я это все делаю, а прошу помочь разобраться, чего не хватает в моем коде, чтобы работало все нормально,с первого раза получал число нормал ное...
|
|||
54
Харлампий Дымба
28.09.17
✎
15:51
|
Много букв и не понятно, что в итоге надо получить. Но если тебе нужно раскидать сумму скидки по всем товарам, пропорционально сумме, то скопирую себе из типовой бухии процедуру глРаспределитьПропорционально и всё.
То есть, у тебя будет - выгрузить табличную часть документа в ТЗ, а дальше ТЗ.НоваяКолонка("СуммаСкидкиПоТовару","Число"); глРаспределитьПропорционально(СуммаСкидки,ТЗ,"Сумма","СуммаСкидкиПоТовару"); теперь в колонке "СуммаСкидкиПоТовару" правильная и пропорционально раскиданная сумма скидки. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |