Имя: Пароль:
1C
 
Округление в проценте
,
0 Syhov21rus
 
15.03.17
09:35
Здравствуйте, возник такой вопрос, в запросе определяется доля количества запчастей на подразделение в процентах и записывается в регистр сведений в формате длина 5, точность 2. Появляются записи например на два подразделения, на первое 78.125%, на второе 21.875%. При записи автоматически округляется до 78.13 и 21.88 соответственно, в итоге имеем 100.01%. Сами понимате в отчете будет погрешность. Как можно правильо организовать округление. Есть такое правило, если перед 5 стоит четное, то округляется в большую сторону, если нечетное то в меньшую. Модно вручную, но обработка и так долгая.
1 Fragster
 
гуру
15.03.17
09:37
считать проценты не запросом, а выражением ресурса СКД, тогда при правильном выражении итогов будет 78.13% и 21.88%, но в общих итогах будет 100%
2 Syhov21rus
 
15.03.17
09:46
Изначально в регистр сведений заносится обработкой, а отчет формируется через ПостроительОтчета, СКД не подходит для этого отчета
3 patria0muerte
 
15.03.17
10:09
(2) Почему решил что не подходит?
4 Naf2017
 
15.03.17
10:19
а если на три и поровну?

33.33%
33.33%
33.33%

еще сложнее
5 Syhov21rus
 
15.03.17
10:30
(3) Очень много нюансов
6 Jokero
 
15.03.17
10:31
(0) показывай пользователю итог округленный до целых.
7 Syhov21rus
 
15.03.17
10:32
(4) Вероятность такого случая очень мала, думую даже не будет ее
8 Jokero
 
15.03.17
10:35
(6) + имхо, в регистрах лучше хранить конкретные цифры, а проценты высчитывать при формировании отчета.
9 Aleksey
 
15.03.17
10:36
Хранить с избыточной точностью
Т.е. если нужно 2 знака после запятой, то хранить с точностью 3 знака после запятой
10 Fragster
 
гуру
15.03.17
10:51
(2) если принципиально на построителе, то выгружай в ТЗ, считай показатель "процент" руками пропорциональным распределением суммы показателя "100" по уменьшающейся базе распределения (или как там оно по научному называется), как-то так:

БазаРаспределения = ТЗ.Итог(Сумма);
СуммаРаспределения = 100;
Для каждого Стр Из ТЗ Цикл
  Стр.Процент = Окр(СуммаРаспределения * Стр.Сумма/БазаРаспределения , 2);
  СуммаРаспределения = СуммаРаспределения - Стр.Процент;
  БазаРаспределения = БазаРаспределения - Стр.Сумма;
КонецЦикла;
11 Fragster
 
гуру
15.03.17
10:51
а потом запихивай в качестве источника в построитель обратно
12 тарам пам пам
 
15.03.17
11:00
(0) ну и добавь там, где у тебя записи в регистре формируются,   отнесение этих 0,01% на какую-либо строку (обычно относят на бОльшую строку для уменьшения погрешности).
13 Syhov21rus
 
15.03.17
11:57
(8) (9) хорошие предложения надо обсудить с руководством
(10) быстродействие скорей всего пострадает, не совсем понятно как это будет работать, несколько тысяч позиций, для каждой номенклатуры пересчитывать отдельно?

Номенклатура1 Подразделение1 45,55%
Номенклатура1 Подразделение2 20%
Номенклатура1 Подразделение3 34,45%
Номенклатура2 ........
14 Fragster
 
гуру
15.03.17
13:29
(13) несколько тысяч итераций цикла из (10) будет выполняться незаметно для глаза. А по другому ты не решишь проблему.
15 Fragster
 
гуру
15.03.17
13:30
(13)
>для каждой номенклатуры пересчитывать отдельно?
если такой отчет - то да. тут итоги по номенклатуре и обход по группировкам помогут
16 2dolist
 
15.03.17
14:11
% -> o|o -> (|) -> O
17 Naf2017
 
15.03.17
15:35
запросом:


ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.КоличествоОстаток
ПОМЕСТИТЬ ТЗ
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ГДЕ
    ТоварыНаСкладахОстатки.КоличествоОстаток > 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЗ.Номенклатура,
    СУММА(ТЗ.КоличествоОстаток) КАК КоличествоОстаток
ПОМЕСТИТЬ Сводная
ИЗ
    ТЗ КАК ТЗ

СГРУППИРОВАТЬ ПО
    ТЗ.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЗ.Номенклатура КАК Номенклатура,
    ТЗ.Склад,
    ТЗ.КоличествоОстаток / Сводная.КоличествоОстаток * 100 КАК Процент
ПОМЕСТИТЬ Проценты
ИЗ
    ТЗ КАК ТЗ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сводная КАК Сводная
        ПО ТЗ.Номенклатура = Сводная.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Проценты.Номенклатура КАК Номенклатура,
    Проценты.Склад КАК Склад,
    ВЫРАЗИТЬ(СУММА(Проценты1.Процент) КАК ЧИСЛО(10, 2)) КАК Процент1
ПОМЕСТИТЬ Накопительно
ИЗ
    Проценты КАК Проценты
        ЛЕВОЕ СОЕДИНЕНИЕ Проценты КАК Проценты1
        ПО Проценты.Номенклатура = Проценты1.Номенклатура
            И Проценты.Склад >= Проценты1.Склад

СГРУППИРОВАТЬ ПО
    Проценты.Номенклатура,
    Проценты.Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Накопительно.Номенклатура КАК Номенклатура,
    Накопительно.Склад КАК Склад,
    Накопительно.Процент1 - ЕСТЬNULL(МАКСИМУМ(Накопительно1.Процент1), 0) КАК Процент,
    ТЗ.КоличествоОстаток / Сводная.КоличествоОстаток * 100 КАК ПроцентТочно
ИЗ
    Накопительно КАК Накопительно
        ЛЕВОЕ СОЕДИНЕНИЕ Накопительно КАК Накопительно1
        ПО Накопительно.Номенклатура = Накопительно1.Номенклатура
            И Накопительно.Склад > Накопительно1.Склад
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ
        ПО Накопительно.Номенклатура = ТЗ.Номенклатура
            И Накопительно.Склад = ТЗ.Склад
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сводная КАК Сводная
        ПО Накопительно.Номенклатура = Сводная.Номенклатура

СГРУППИРОВАТЬ ПО
    Накопительно.Номенклатура,
    Накопительно.Склад,
    Накопительно.Процент1,
    ТЗ.КоличествоОстаток / Сводная.КоличествоОстаток * 100

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Склад
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой