Имя: Пароль:
1C
 
Алгоритм размазывания суммы ХХХХ по ТЧ документа
0 lamme
 
24.08.16
10:52
Вот такой вот алгоритм есть.
На больших ТЧ и больших суммах - разница очень хорошая получается.
Например, при сумме ТЧ = 1 000 000 и сумме ХХХ = 34000. Разница после размазывания получаается в 500р. Это много.

Есть другие алгоритмы ?


для каждого ЭлТ из Товары цикл
        Доля = ЭлТ.Сумма/Товары.Итог("Сумма");
        ЭлТ.Сумма=ЭлТ.Сумма +  Доля*СуммаДопРасходов;
        ЭлТ.Цена =ЭлТ.Сумма/ЭлТ.Количество;
конеццикла;
1 lamme
 
24.08.16
10:52
ХХХ  = СуммаДопРасходов
2 DailyLookingOnA Sunse
 
24.08.16
10:55
Что, так в каждой строке цикла и считается Товары.Итог("Сумма") ?
;-)))))
3 lamme
 
24.08.16
10:56
djn ,kz !
4 lamme
 
24.08.16
10:56
вот блин!
точно ...
5 Масянька
 
24.08.16
10:56
(0) У меня так:
        гТабВыборка.ВыбратьСтроки();
        Пока гТабВыборка.ПолучитьСтроку() = 1 Цикл
            мРасчет = (СуммаТР * гТабВыборка.СуммаОбщая) / ЧислоИтог;
            гТабВыборка.СуммаДоставки = мРасчет;
        КонецЦикла;
Семерка.
6 patria0muerte
 
24.08.16
10:57
В типовых есть метод:

Функция РаспределитьПропорционально(Знач ИсхСумма, МассивКоэф, Знач Точность = 2, ПроверкаНулевыхЗначений=Истина) Экспорт

    Если МассивКоэф.Количество() = 0 Или (ПроверкаНулевыхЗначений И ИсхСумма = 0) Или ИсхСумма = Null Тогда
        Возврат Неопределено;
    КонецЕсли;

    // Массив коэффициентов необходимо упорядочить, поэтому создадим таблицу для распределения
    УпорядоченнаяТаблица = Новый ТаблицаЗначений;
    УпорядоченнаяТаблица.Колонки.Добавить("Коэф", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(17,4)));
    УпорядоченнаяТаблица.Колонки.Добавить("ИсходныйИндекс", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,0)));
    
    СуммаКоэф  = 0;

    Для К = 0 По МассивКоэф.Количество() - 1 Цикл
        СуммаКоэф = СуммаКоэф + МассивКоэф[К];
        
        СтрокаТаблицы = УпорядоченнаяТаблица.Добавить();
        СтрокаТаблицы.Коэф = МассивКоэф[К];
        СтрокаТаблицы.ИсходныйИндекс = К;
    КонецЦикла;

    Если СуммаКоэф = 0 Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    УпорядоченнаяТаблица.Сортировать("Коэф Убыв");
    
    МассивСумм = Новый Массив(УпорядоченнаяТаблица.Количество());
    
    Для каждого СтрокаТаблицы Из УпорядоченнаяТаблица Цикл
        // Возвращаемый результат должен быть в том же порядке
        МассивСумм[СтрокаТаблицы.ИсходныйИндекс] = ?(СуммаКоэф <> 0, Окр(ИсхСумма * МассивКоэф[СтрокаТаблицы.ИсходныйИндекс] / СуммаКоэф, Точность, 1), 0);
        
        ИсхСумма = ИсхСумма - МассивСумм[СтрокаТаблицы.ИсходныйИндекс];
        СуммаКоэф = СуммаКоэф - МассивКоэф[СтрокаТаблицы.ИсходныйИндекс];
    КонецЦикла;

    Возврат МассивСумм;

КонецФункции // РаспределитьПропорционально()
7 Это_mike
 
24.08.16
10:58
[:||||:]
8 Ёпрст
 
24.08.16
11:08
Вообще то, правильнее распределять рандомом.
9 Fragster
 
гуру
24.08.16
11:11
База = Товары.Итог("Сумма");
для каждого ЭлТ из Товары цикл

        Доля = ЭлТ.Сумма/База;
        База = База - ЭлТ.Сумма;
        ПредСумма = ЭлТ.Сумма;
        ЭлТ.Сумма=ЭлТ.Сумма +  Доля*СуммаДопРасходов;
        СуммаДопРасходов = СуммаДопРасходов - ЭлТ.Сумма + ПредСумма;
        ЭлТ.Цена =ЭлТ.Сумма/ЭлТ.Количество;
конеццикла;
10 RomanYS
 
24.08.16
11:15
(9) у такого способа есть один минус: он вылетит на базе, например, {1, -1, 1}.
Хотя для допрасходов пойдет, там такого обычно не бывает.
11 hitodom
 
24.08.16
11:19
лучше после каждой строки уменьшать базу, тогда не будет ошибок округления
12 RomanYS
 
24.08.16
11:41
(11) Если есть округление - есть и ошибки округления. А не будет - остатка, который мог образоваться из-за накопления ошибок округления. Наверное, я к терминологии придираюсь.
Но это не отменяет ошибку деления на 0 из (10).
13 hitodom
 
24.08.16
11:42
(12) а как ты по отрицательной базе собрался распределеять?
14 AlexTim03
 
24.08.16
11:48
Уже 100500 раз решалась эта задача.
На каждом проходе уменьшаешь базу распределения и количество. Ошибок округления не будет.
На i...одном известном ресурсе приводились примеры решения такой задачи. Даже есть решение через запрос.
15 RomanYS
 
24.08.16
12:01
(13) распределить 100 по базе {1, -1, 1}. Ответ {100, -100, 100}, совершенно однозначный с точки зрения математики.
16 RomanYS
 
24.08.16
12:08
(14) прочитай (12)
http://dic.academic.ru/dic.nsf/bse/117736
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.