Имя: Пароль:
1C
 
Уменьшение цены на 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 после обработки ТЧ и результат поместить в сумму документа.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.