Имя: Пароль:
1C
1С v8
Тупо арифметика пропорции
, ,
0 арах
 
21.11.14
10:09
Народ поможите плиз.. что мозг не соображает:)
задача: есть 3 группы в них значения 129,  1130,  700
как пропорционально значениям в этих группах распределить количество например  700.
1 Chum
 
21.11.14
10:11
х = 129+1130+700

700*129/х
700*1130/х
700*700/х
2 Трик
 
21.11.14
10:11
700*129/(129+1130+700)
700*1130/(129+1130+700)
700*700(129+1130+700)
3 pessok
 
21.11.14
10:13
129+1130+700 = 100%
->

1959 - 100
129 - x

1959x = 12900

x = 6%
4 Гёдза
 
21.11.14
10:13
Вот это одноэсники пошли (((
5 pessok
 
21.11.14
10:13
слоупочу :)
6 арах
 
21.11.14
10:18
питница)  спс всем)
7 oyeah
 
21.11.14
10:19
(0) шутник
8 Лефмихалыч
 
21.11.14
10:19
ёпт... и правда - сегодня ж пятница! от это новость
9 Ненавижу 1С
 
гуру
21.11.14
10:19
Думаю у тебя будет проблема с округлениями
10 mehfk
 
21.11.14
10:20
(0) Воспользуйся типовой функцией
// Функция выполняет пропорциональное распределение суммы в соответствии
// с заданными коэффициентами распределения
//
// Параметры:
//        ИсхСумма - распределяемая сумма
//        МассивКоэф - массив коэффициентов распределения
//        Точность - точность округления при распределении. Необязателен.
//
//    Возврат:
//        МассивСумм - массив размерностью равный массиву коэффициентов, содержит
//            суммы в соответствии с весом коэффициента (из массива коэффициентов)
//          В случае если распределить не удалось (сумма = 0, кол-во коэф. = 0,
//          или суммарный вес коэф. = 0), тогда возвращается значение Неопределено
//
Функция РаспределитьПропорционально(Знач ИсхСумма, МассивКоэф, Знач Точность = 2, ПроверкаНулевыхЗначений=Истина) Экспорт

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

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

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

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

КонецФункции // РаспределитьПропорционально()
11 арах
 
21.11.14
10:26
тода сразу тут еще вопрос  как в запросе выразить число кратно 10 ?
12 Ненавижу 1С
 
гуру
21.11.14
10:28
(11) чего?
13 арах
 
21.11.14
10:31
число 46 должно получится 40
число 8 получиться  0
есть каканить типовая функция? или высчитывать?
14 Chum
 
21.11.14
10:33
Цел(ТвоеЧисло/10)*10
15 арах
 
21.11.14
10:34
(14) в запросе
16 pessok
 
21.11.14
10:34
(11) ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,0)
17 Ненавижу 1С
 
гуру
21.11.14
10:35
ВЫРАЗИТЬ(ТвоеЗначение/10-0.5 КАК ЧИСЛО(15,0))*10
18 pessok
 
21.11.14
10:36
(17) а, ну да, не 4,6 как 5, а 46 как 40