|
Уменьшение цены на 1 в заказе покупателя. | ☑ | ||
---|---|---|---|---|
0
progaoff
12.01.18
✎
16:06
|
Загружаю из Экселя заказ покупателя, есть товар с 0 ценой, его нужно сделать с ценой 1 и уменьшить сумму документа на 1 или уменьшить цену любого товара на 1. Подскажите, как победить?
Пока ВыборкаНоменклатуры.Следующий() Цикл Номенклатура = ВыборкаНоменклатуры.Ссылка; КонецЦикла; НовСтрока = Заказ.Товары.Добавить(); НовСтрока.Номенклатура = Номенклатура; НовСтрока.Количество = КоличествоЗаказ; НовСтрока.КоличествоУпаковок = КоличествоЗаказ; НовСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС; Если Цена = 0 Тогда НовСтрока.Цена = Цена+1; Иначе НовСтрока.Цена = Цена; НовСтрока.СуммаРучнойСкидки = СуммаСкидки; НовСтрока.Сумма = ТоталSumma; КонецЕсли; КонецЦикла; |
|||
1
Lexey_
12.01.18
✎
16:09
|
(0) ну и где вот это " и уменьшить сумму документа на 1 или уменьшить цену любого товара на 1"?
|
|||
2
progaoff
12.01.18
✎
16:32
|
(1) да вот это я тут и спросил собственно)
|
|||
3
Ненавижу 1С
гуру
12.01.18
✎
16:35
|
(0) а если нет другого товара с ценой больше 1?
|
|||
4
grigo
12.01.18
✎
16:41
|
Запомни, сколько раз добавил, и вычти сумму из первых попавшихся строк
|
|||
5
3achem
12.01.18
✎
16:46
|
(0) в два прохода, в первом счаитаешь сколько нулевых, во втором последовательно отнимаешь и скалдываешь.
|
|||
6
progaoff
12.01.18
✎
16:53
|
(4) пример можно, приблизительно понимаю о чем речь, но в коде не представляю
|
|||
7
dezss
12.01.18
✎
17:01
|
сч = 0;
для каждого стр из Заказ.Товары цикл если стр.Цена = 0 Тогда сч = сч + 1; стр.Цена = 1; конецесли конеццикла для каждого стр из Заказ.Товары цикл если Цел(стр.Цена) > 1 Тогда если Цел(стр.Цена - сч) > 1 Тогда стр.Цена = стр.Цена - сч; сч = 0; иначе сч = сч - стр.Цена + 1; стр.Цена = 1; конецесли; если сч = 0 Тогда прервать; конецесли конецесли; конеццикла; |
|||
8
azernot
12.01.18
✎
17:08
|
(0) Судя по тому, что есть количество, рекомендую всё же запоминать не цены, а суммы. И далее уменьшать все суммы в каждой строке документа пропорционально отношению "СуммаКоррекции/СуммаДокументаДоПравки", а если возникает погрешность из-за округления относить её на строку с самой большой суммой.
|
|||
9
Buster007
12.01.18
✎
17:10
|
+(8) после каждого уменьшения суммы на 1 в строке, надо заново осуществлять поиск строки с максимальной ценой
|
|||
10
azernot
12.01.18
✎
17:13
|
(9) Нет смысла, достаточно сравнивать и запоминать строку при добавлении :) Если все суммы уменьшаются на одинаковую пропорцию, то строка с самой большой суммой не изменится.
|
|||
11
Buster007
12.01.18
✎
17:15
|
(10) строка с максимальной суммой может стать равна другим строкам
|
|||
12
Buster007
12.01.18
✎
17:17
|
(11) либо высчитать долю каждой строки в общей сумме документа, и пропорционально этой доле распределить новые позиции с нулевой ценой, но это может привести к тому, что где-то что-то не так округлится и начнутся танцы с бубном )
|
|||
13
azernot
12.01.18
✎
17:18
|
(11) Только если она и до уменьшения была равна. Но даже если она будет равна другим строкам, что с того? Округление мы корректируем в любой, первой попавшейся из этих "максимальных".
|
|||
14
azernot
12.01.18
✎
17:19
|
(12) "Новые" строки (в смысле те, по которым цена была равна 0) - это точно такие же строки, как все остальные. И сумма по ним уменьшаются точно так же как и по остальным.
|
|||
15
azernot
12.01.18
✎
17:29
|
В общем, примерно такой код получается:
До цикла СуммаКоррекции = 0; ....Цикл Если Цена = 0 Тогда НовСтрока.Цена = Цена+1; НовСтрока.Сумма = НовСтрока.Цена * НовСтрока.Количество; СуммаКоррекции = СуммаКоррекции + НовСтрока.Сумма; Иначе НовСтрока.Цена = Цена; НовСтрока.СуммаРучнойСкидки = СуммаСкидки; НовСтрока.Сумма = ТоталSumma; КонецЕсли; //Пересчёт всяких скидок, НДС, Всего и т.п. КонецЦикла; Если СуммаКоррекции>0 Тогда КоэффициентКорректировки = (ИтоговаяСуммаДокумента - СуммаКоррекции)/ИтоговаяСуммаДокумента; СтрокаСМаксимальнойСуммой = Неопределено; Для каждого СтрокаЗаказа из Заказ.Товары Цикл СтрокаЗаказа.Сумма = СтрокаЗаказа.Сумма * КоэффициентКорректировки; //Пересчёт всяких скидок, НДС, Всего и т.п. Если СтрокаСМаксимальнойСуммой = Неопределено ИЛИ НовСтрока.Сумма > СтрокаСМаксимальнойСуммой.Сумма Тогда СтрокаСМаксимальнойСуммой = НовСтрока; КонецЕсли; КонецЦикла; РазницаИзЗаОкруглений = ИтоговаяСуммаДокумента - Заказ.Товары.Итог("Сумма"); СтрокаСМаксимальнойСуммой.Сумма = СтрокаСМаксимальнойСуммой.Сумма - РазницаИзЗаОкруглений; //Пересчёт всяких скидок, НДС, Всего и т.п. КонецЕсли; |
|||
16
azernot
12.01.18
✎
17:32
|
Правильнее наверное всё же так:
КоэффициентКорректировки = ИтоговаяСуммаДокумента/Заказ.Товары.Итог("Сумма"); |
|||
17
breezee
12.01.18
✎
19:14
|
(0) А зачем? Это же бред
|
|||
18
mistеr
13.01.18
✎
10:12
|
Загрузить, отсортировать по цене.
Идти циклом с двух сторон, сверху прибавлять (пока цена нулевая), снизу отнимать. Если снизу встретили нулевую цену, возвращаемся в самый низ. |
|||
19
mistеr
13.01.18
✎
10:13
|
(18) ...если снизу встретили нулевую *или единичную* цену...
|
|||
20
Смотрящий
13.01.18
✎
11:17
|
(17) Бесплатное что то в заказ пихают. Календарик какой нить, а в 1С по 0 цене не внести - не проводит документ вот и мучаются
|
|||
21
Михаил Козлов
13.01.18
✎
11:26
|
(20) Иногда бывает опция (настройка пользователя) разрешить нулевые цены в оптовой/розничной торговле.
|
|||
22
Смотрящий
13.01.18
✎
11:28
|
(21) не указал тс конфу, может и есть там опция да не знают о ней
|
|||
23
breezee
13.01.18
✎
13:19
|
(20) Разве это правильное решение? Можно как-то 100% скидкой обойтись. Да и сумму в документе не надо ни как отнимать, если уж решили так делать. Я бы сделал так:
(15) Зачем так сложно? КоэффициентКорректировки = (ИтоговаяСуммаДокумента - СуммаКоррекции)/ИтоговаяСуммаДокумента; Можно же просто обойти все строки ТЧ(запросом или циклом не важно) накопить сумму по строкам где сумма <>1. Я вообще не вижу смысл ветки. Объясните, может есть какой-то глубинный смысл? Это же очень простой алгоритм.. |
|||
24
breezee
13.01.18
✎
13:20
|
(23) Извините, мысль поплыла. В общем, можно просто просуммировать все строки где сумма <> 1 после обработки ТЧ и результат поместить в сумму документа.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |