Имя: Пароль:
IT
 
Как пропорционально распределить сумму ?
0 Ткачев
 
27.05.11
07:34
Подскажите формулу.
Есть 3 суммы 150, 100 и 50, как 100 разделить пропорционально между 150 и 50.
1 VladZ
 
27.05.11
07:35
(0) Пропорционально.
2 VladZ
 
27.05.11
07:36
75 и 25
3 Ткачев
 
27.05.11
07:37
А формулой ?
4 VladZ
 
27.05.11
07:38
1. Вычисляем, во сколько раз отличается 100 от суммы 150 и 50.
100/(150+50) = 0,5

2. Умножаем наши суммы на полученный к-т.
150 * 0,5 = 75
50 * 0,5 = 25
5 Rie
 
27.05.11
07:38
(3) 100/(150+50)
6 Нуф-Нуф
 
27.05.11
07:44
100 * 50 / (50+100+150)
100 * 100 / (50+100+150)
100 * 150 / (50+100+150)
7 Нуф-Нуф
 
27.05.11
07:44
блин (50+100+150) заменить на (50+150)
8 Ткачев
 
27.05.11
07:53
(3)Формулой это типа:
Ч1 = 150
Ч2 = 100
Ч3 = 50
Сумма = Ч2 / (Ч1 + Ч3)
Ч1 = Ч1 + Ч1 * Сумма
Ч3 = Ч3 + Ч3 * Сумма

Все понятно, всем спасибо.
9 VladZ
 
27.05.11
08:06
(8) Чтобы не путаться в понятиях:
Коэффициент = Ч2 / (Ч1 + Ч3)
Ч1 = Ч1 + Ч1 * Коэффициент
Ч3 = Ч3 + Ч3 * Коэффициент
10 VladZ
 
27.05.11
08:07
(8) А зачем так:
Ч1 = Ч1 + Ч1 * Коэффициент ?
11 Рэйв
 
27.05.11
08:13
Функция РассчитатьДельту(СуммаВходящая,ВсегоСуммаВходящая,СуммаРаспределения)
   ПроцентОтОбщей=СуммаВходящая /(ВсегоСуммаВходящая/100);
   Дельта=Окр(СуммаРаспределения/100*ПроцентОтОбщей,2,РежимОкругления.Окр15как20);
   Возврат Дельта;
КонецФункции
12 Рэйв
 
27.05.11
08:13
+ потом если последняя сумма надо не функцию вызывать а тупо прибавлять оставшийся хвост.  а то копейки остаются
13 andrewks
 
27.05.11
08:19
мдэ... а что, в Советское время тоже образование хромало?
14 Humandra
 
27.05.11
09:33
(12) хвост в виде лишней копейки, если коэффициент вида 0,3333333333333, лучше не к последней сумме прибавлять, а к максимальной. Аккуратнее получается. :)
15 rs_trade
 
27.05.11
09:35
(0) "программист"-гуманитарий?
16 DES
 
27.05.11
09:36
(0) это шутка ?
17 Рэйв
 
27.05.11
09:39
(14)Можно и так :-)
18 DES
 
27.05.11
09:43
есть 2 (два) осажденных города.
в одном 150 защитников. в другом 50 защитников.
им на подмогу идет обоз с мукой.
везут 100 кг.
Задача: сколько муки нужно завезти в каждый город через подземный ход чтобы всем защитникам досталось поровну?
Решение:
Складываем всех защитников города, делим всю муку на кол-во всех защитников, находим сколько муки приходится на 1 защитника по норме.
Умножаем норму на кол-во защитников в каждом городе.
разделяем всю муку на 2 части ПРОПОРЦИОНАЛЬНО полученной норме для каждого города.
19 DES
 
27.05.11
09:44
(14) В социальном государстве лучше прибавлять к минимальной сумме.
20 Fragster
 
гуру
27.05.11
09:46
а теперь в запросе и так, чтобы копейки не терялись :)))
21 Fragster
 
гуру
27.05.11
09:46
лично у меня - УГ получилось :)
22 rs_trade
 
27.05.11
10:14
(20)
declare t table (id int, b decimal)
declare @sum as decimal

insert t values (1, 100), (2, 50)

set @sum = 200

select
   cast(@sum / (SUM(b) OVER()) * b as decimal(15,2)) AS t
from
   t
23 Ткачев
 
27.05.11
10:39
Усложним задачу:
Есть главный документ.
Сумма документа = 150
Нал = 50
БезНал = 100

Он делится на 2 документа.

Первый Документ
Сумма = 80
Нал = ?
БезНал = ?

Второй Документ
Сумма = 70
Нал = ?
БезНал = ?

Вот как тут рассчитать оплату из главного документа ?
24 Fragster
 
гуру
27.05.11
10:44
(22) распредели сумму в 100 пропорционально между 3 одинаковимы значениями, чтобы копейки не потерялись
25 Fragster
 
гуру
27.05.11
10:44
*одинаковыми
26 Fragster
 
гуру
27.05.11
10:45
типа
100 + 100 + 100 + 100 => 133,34 + 133,33 + 133,33
27 VladZ
 
27.05.11
10:49
(14) В исходной задаче две суммы... В случае, если у одной суммы будет 0,3333333333333 - значит у другой 0,6666666666666. В общем, при округлении все будет хорошо. Вот если было три суммы (и более)... Возникла бы ситуёвина, когда одному 0,3333333333333,   другому  0,3333333333333 и третьему столько же. В результате копеечки могут и не бить.
28 Fragster
 
гуру
27.05.11
10:50
(27) решение таки должно быть универсальным
29 zak555
 
27.05.11
10:51
(0) размазывать нужно как в (6) но с одной оговоркой
отсортировать суммы по убыванию и последней сумме добавить остаток
30 Ткачев
 
27.05.11
10:55
Суть этого гемора такова:
Определенный товар продается на ИП, остальной на ООО (одна касса работает с двумя фискальниками), до того пока не подключили банк все было нормально, вчера подключили...
31 Ткачев
 
27.05.11
10:56
т.е.
Один Чек ККМ делится на два в зависимости от товара.
32 Warlock
 
27.05.11
11:10
(Fragster
Отклонение = 0;

Для Каждого Строка Из ТЗ Цикл
   Результат = НужныйРезультат * Строка.Основание / База + Отклонение;
   Отклонение = (Результат - Окр(Результат, 2));
   Строка.Результат = Окр(Результат, 2);
КонецЦикла;
33 Ткачев
 
27.05.11
11:14
Это 1с розница, программно деление чека выглядит так:

   Если Константы.ДваФР.Получить() Тогда
       Запрос = Новый Запрос("
       |ВЫБРАТЬ * ПОМЕСТИТЬ ТабТов ИЗ &ТабТов КАК ТТ;
       |ВЫБРАТЬ *
       |ИЗ
       |    ТабТов КАК Товары
       |ГДЕ
       |    Товары.Номенклатура.ТоварОрганизации = &Организация");
       Запрос.УстановитьПараметр("ТабТов", Товары.Выгрузить());
       ВремКассаККМ = КассаККМ;
       Оплаты = Оплата.Выгрузить();
       Организации = Справочники.Организации.Выбрать();
       Пока Организации.Следующий() Цикл
           Если Организации.Ссылка = Магазин.ОсновнойСклад.Организация Тогда;
               Организация = Справочники.Организации.ПустаяСсылка();
           Иначе
               Организация = Организации.Ссылка;
           КонецЕсли;
           Запрос.УстановитьПараметр("Организация", Организация);
           Результат = Запрос.Выполнить();
           Если Не Результат.Пустой() Тогда
               ЭтотОбъект.Товары.Загрузить(Результат.Выгрузить());
               ФР = ПолучитьСерверТО().ПолучитьИдентификаторПоИдКассы(Организация);
               Если ЗначениеЗаполнено(Организация) И Не ПустаяСтрока(ФР) Тогда
                   КассаККМ = ПолучитьСерверТО().ПолучитьКассуККМ(ФР);
               Иначе
                   КассаККМ = ВремКассаККМ;
               КонецЕсли;
               ИтогСуммы = Товары.Итог("Сумма");
               ИтогОплат = Оплаты.Итог("Сумма");
               Если ИтогСуммы <> ИтогОплат Тогда
                   ЭтотОбъект.Оплата.Загрузить(Оплаты);
                   Для Каждого ФормаОплат Из Оплата Цикл
                       
                       //???????????????????????????????
                       
                   КонецЦикла;
               КонецЕсли;
               ЗавершитьЗакрытиеЧека2(Печать, РучнойРежим, ВыбратьДокументПечати, ФР);
           КонецЕсли;
       КонецЦикла;
   Иначе
       ЗавершитьЗакрытиеЧека2(Печать, РучнойРежим, ВыбратьДокументПечати);    
   КонецЕсли;
34 Fragster
 
гуру
27.05.11
11:16
(32) запросом же
35 Warlock
 
27.05.11
12:33
(34)Если использовать временные таблицы, то можно распределить результат, а остаток оставить на максимальной/минимальной строке
36 Ткачев
 
27.05.11
15:03
Получилось как то так:
...
                       Для Каждого ФормаОплат Из Оплата Цикл
                           Если ПервыйПроход Тогда
                               СуммаОплаты = ИтогСуммы * Окр(ФормаОплат.Сумма / ИтогОплат, 2);
                               СписокОплат.Добавить(ФормаОплат.Сумма - СуммаОплаты);
                               ФормаОплат.Сумма = СуммаОплаты;
                           Иначе
                               ФормаОплат.Сумма = СписокОплат.Получить(ФормаОплат.НомерСтроки - 1).Значение;
                           КонецЕсли;
                       КонецЦикла;
                       ПервыйПроход = 0;
...
37 rs_trade
 
27.05.11
16:18
(36) В УТ или УПП глянь документ доп. расходы. Там есть алгоритм распределения суммы по кол-ву или объему
38 Ненавижу 1С
 
гуру
27.05.11
16:19
тупые 1с ники
39 Ткачев
 
27.05.11
20:32
(37)Нормально работает, на разных суммах проверял.
(38)Так скажите как тупому 1с-нику сделать все правильно в (33) и (36)
40 Господин ПЖ
 
27.05.11
20:36
возьмите хоть из УПП типовой что ли... там и то адекватнее написано
41 МегаБум
 
27.05.11
20:36
а куда цветовыделение кода 1С делось?
42 Эмбеддер
 
27.05.11
20:41
(36) Ошибки округления будут при таком расчете
43 Reaper_1c
 
27.05.11
20:41
Трандец, модуль "ОбщегоНазначения" отобрали у автора?
44 Ткачев
 
03.06.11
11:26
(40)Если бы у них все было адекватно и работало, не было бы этого форума.
(42)Нормально все работает, копейки нигде "не провисают", в отличии от типовых процедур +- 0.01 руб.