Вход | Регистрация



Уменьшение цены на 1 в заказе покупателя.

Уменьшение цены на 1 в заказе покупателя.
Я
   progaoff
 
12.01.18 - 16:06
Загружаю из Экселя заказ покупателя, есть товар с 0 ценой, его нужно сделать с ценой 1 и уменьшить сумму документа на 1 или уменьшить цену любого товара на 1. Подскажите, как победить?
Пока ВыборкаНоменклатуры.Следующий() Цикл
            Номенклатура = ВыборкаНоменклатуры.Ссылка;
        КонецЦикла;
            
        НовСтрока = Заказ.Товары.Добавить();
        
        НовСтрока.Номенклатура = Номенклатура;
        НовСтрока.Количество   = КоличествоЗаказ;
        НовСтрока.КоличествоУпаковок = КоличествоЗаказ;
        НовСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
    Если Цена = 0 Тогда
        НовСтрока.Цена = Цена+1;        
    Иначе
        НовСтрока.Цена = Цена;
        НовСтрока.СуммаРучнойСкидки = СуммаСкидки;
        НовСтрока.Сумма  = ТоталSumma;

    КонецЕсли;
    
    КонецЦикла;
 
 
   Lexey_
 
1 - 12.01.18 - 16:09
(0) ну и где вот это " и уменьшить сумму документа на 1 или уменьшить цену любого товара на 1"?
   progaoff
 
2 - 12.01.18 - 16:32
(1) да вот это я тут и спросил собственно)
   Ненавижу 1С
 
3 - 12.01.18 - 16:35
(0) а если нет другого товара с ценой больше 1?
   grigo
 
4 - 12.01.18 - 16:41
Запомни, сколько раз добавил, и вычти сумму из первых попавшихся  строк
   3achem
 
5 - 12.01.18 - 16:46
(0) в два прохода, в первом счаитаешь сколько нулевых, во втором последовательно отнимаешь и скалдываешь.
   progaoff
 
6 - 12.01.18 - 16:53
(4) пример можно, приблизительно понимаю о чем речь, но в коде не представляю
   dezss
 
7 - 12.01.18 - 17:01
сч = 0;
для каждого стр из Заказ.Товары цикл
   если стр.Цена = 0 Тогда
      сч = сч + 1;
      стр.Цена = 1;
   конецесли
конеццикла

для каждого стр из Заказ.Товары цикл
   если Цел(стр.Цена) > 1 Тогда
      если Цел(стр.Цена - сч) > 1 Тогда
        стр.Цена  = стр.Цена - сч;
        сч = 0;
      иначе
        сч = сч - стр.Цена + 1;
        стр.Цена = 1;
      конецесли;
      если сч = 0 Тогда
         прервать;
      конецесли
   конецесли;
конеццикла;
   azernot
 
8 - 12.01.18 - 17:08
(0) Судя по тому, что есть количество, рекомендую всё же запоминать не цены, а суммы. И далее уменьшать все суммы в каждой строке документа пропорционально отношению "СуммаКоррекции/СуммаДокументаДоПравки", а если возникает погрешность из-за округления относить её на строку с самой большой суммой.
   Buster007
 
9 - 12.01.18 - 17:10
+(8) после каждого уменьшения суммы на 1 в строке, надо заново осуществлять поиск строки с максимальной ценой
   azernot
 
10 - 12.01.18 - 17:13
(9) Нет смысла, достаточно сравнивать и запоминать строку при добавлении :) Если все суммы уменьшаются на одинаковую пропорцию, то строка с самой большой суммой не изменится.
 
 Рекламное место пустует
   Buster007
 
11 - 12.01.18 - 17:15
(10) строка с максимальной суммой может стать равна другим строкам
   Buster007
 
12 - 12.01.18 - 17:17
(11) либо высчитать долю каждой строки в общей сумме документа, и пропорционально этой доле распределить новые позиции с нулевой ценой, но это может привести к тому, что где-то что-то не так округлится и начнутся танцы с бубном )
   azernot
 
13 - 12.01.18 - 17:18
(11) Только если она и до уменьшения была равна. Но даже если она будет равна другим строкам, что с того? Округление мы корректируем в любой, первой попавшейся из этих "максимальных".
   azernot
 
14 - 12.01.18 - 17:19
(12) "Новые" строки (в смысле те, по которым цена была равна 0) - это точно такие же строки, как все остальные. И сумма по ним уменьшаются точно так же как и по остальным.
   azernot
 
15 - 12.01.18 - 17:29
В общем, примерно такой код получается:

До цикла
СуммаКоррекции = 0;

....Цикл

    Если Цена = 0 Тогда
        НовСтрока.Цена = Цена+1;
        НовСтрока.Сумма = НовСтрока.Цена * НовСтрока.Количество;
        СуммаКоррекции = СуммаКоррекции + НовСтрока.Сумма; 
    Иначе
        НовСтрока.Цена = Цена;
        НовСтрока.СуммаРучнойСкидки = СуммаСкидки;
        НовСтрока.Сумма  = ТоталSumma;
    КонецЕсли;

    //Пересчёт всяких скидок, НДС, Всего и т.п.


КонецЦикла;

Если СуммаКоррекции>0 Тогда 
    КоэффициентКорректировки = (ИтоговаяСуммаДокумента - СуммаКоррекции)/ИтоговаяСуммаДокумента;
    СтрокаСМаксимальнойСуммой = Неопределено;
    Для каждого СтрокаЗаказа из Заказ.Товары Цикл
        СтрокаЗаказа.Сумма = СтрокаЗаказа.Сумма * КоэффициентКорректировки;    
        //Пересчёт всяких скидок, НДС, Всего и т.п.

        
        Если СтрокаСМаксимальнойСуммой = Неопределено ИЛИ НовСтрока.Сумма > СтрокаСМаксимальнойСуммой.Сумма Тогда 
            СтрокаСМаксимальнойСуммой = НовСтрока;
        КонецЕсли;
    КонецЦикла;
    
    РазницаИзЗаОкруглений =  ИтоговаяСуммаДокумента - Заказ.Товары.Итог("Сумма");
        
    СтрокаСМаксимальнойСуммой.Сумма = СтрокаСМаксимальнойСуммой.Сумма - РазницаИзЗаОкруглений;
    //Пересчёт всяких скидок, НДС, Всего и т.п.

КонецЕсли;
   azernot
 
16 - 12.01.18 - 17:32
Правильнее наверное всё же так:

  КоэффициентКорректировки = ИтоговаяСуммаДокумента/Заказ.Товары.Итог("Сумма");
   breezee
 
17 - 12.01.18 - 19:14
(0) А зачем? Это же бред
   mistеr
 
18 - 13.01.18 - 10:12
Загрузить, отсортировать по цене.
Идти циклом с двух сторон, сверху прибавлять (пока цена нулевая), снизу отнимать. Если снизу встретили нулевую цену, возвращаемся в самый низ.
   mistеr
 
19 - 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) не указал тс конфу, может и есть там опция да не знают о ней
   breezee
 
23 - 13.01.18 - 13:19
(20) Разве это правильное решение? Можно как-то 100% скидкой обойтись. Да и сумму в документе не надо ни как отнимать, если уж решили так делать. Я бы сделал так:
(15) Зачем так сложно?  КоэффициентКорректировки = (ИтоговаяСуммаДокумента - СуммаКоррекции)/ИтоговаяСуммаДокумента;
Можно же просто обойти все строки ТЧ(запросом или циклом не важно) накопить сумму по строкам где сумма <>1. Я вообще не вижу смысл ветки. Объясните, может есть какой-то глубинный смысл? Это же очень простой алгоритм..
   breezee
 
24 - 13.01.18 - 13:20
(23) Извините, мысль поплыла. В общем, можно просто просуммировать все строки где сумма <> 1 после обработки ТЧ и результат поместить в сумму документа.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует