Имя: Пароль:
1C
1С v8
Кто-нибудь знает, как в запросе рассчитать процент по группировкам? #2
,
0 Unkas
 
04.03.14
12:19
Вот первая часть данного вопроса, вразумительного ответа на который так никто и не дал: v8: Кто-нибудь знает, как в запросе расчитать процент по группировкам?

Есть примитивный запрос, скажем, к виртуальной таблице Хозрасчетный.Обороты. Получаем Сумму оборота в разрезе периода (месяц) и, скажем, пары субконто: контрагент и договор.
Выводим итоги по группировкам.
Вопрос - как посчитать процент внутри нужной группировки в самом запросе, не прибегая к средствам СКД или программной обработке вывода?
1 МихаилМ
 
04.03.14
12:22
запрос для получения данных, а не для представления.
2 Unkas
 
04.03.14
12:23
Забыл добавить повторное предупреждение для первонахов:
1. СКД не предлагать
2. Посмотреть <ОтчетName> не предлагать
3. Предлагать решение, про которое вы точно знаете, что работает.
3 piter3
 
04.03.14
12:24
разрешите исполнять
4 Unkas
 
04.03.14
12:25
(1) Спасибо, капитан Очевидность.
Вы нарушили третью директиву и будете аннигилированы)
(3) Вот зачем люди спамят в такие темы... потом же черта с два найдешь нужную информацию.
5 piter3
 
04.03.14
12:26
(4)я все нахожу ЧЯДТ
6 Unkas
 
04.03.14
13:22
(5) Возьми с полки пирожок.
А я апну тему и подожду пока найдется тот, кто сможет ответить.
Этот вопрос был задан на собеседовании во франче и поставил меня в тупик. Но я верю, что ответ на него должен существовать. Если только они не избавляются таким образом от нежелательных кандидатов, конечно)))
7 IKSparrow
 
04.03.14
13:26
(6) Это же франч. Им бы лишь кандидатов понагибать.
8 vicof
 
04.03.14
13:27
(6) Это франч тупость проверял. ПРоверил...
9 DS
 
04.03.14
13:28
Посчитать то можно, но как минимум постобработку по округлению и погрешностям надо делать.
10 Ненавижу 1С
 
гуру
04.03.14
13:29
держи вариант

ВЫБРАТЬ
    ПродажиОбороты.СтоимостьОборот
ПОМЕСТИТЬ ОбщийИтог
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, , ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиОбороты.Период КАК Период,
    ПродажиОбороты.Контрагент КАК Контрагент,
    ПродажиОбороты.Организация КАК Организация,
    ПродажиОбороты.СтоимостьОборот КАК Стоимость,
    ПродажиОбороты.СтоимостьОборот / ОбщийИтог.СтоимостьОборот * 100 КАК Процент,
    ОбщийИтог.СтоимостьОборот КАК СтоимостьОбщая
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, Месяц, ) КАК ПродажиОбороты,
    ОбщийИтог КАК ОбщийИтог
ИТОГИ
    СУММА(Стоимость),
    СУММА(Стоимость) / МАКСИМУМ(СтоимостьОбщая) * 100 КАК Процент
ПО
    ОБЩИЕ,
    Период,
    Организация,
    Контрагент
11 Ненавижу 1С
 
гуру
04.03.14
13:31
(10) не то
12 Леша1с
 
04.03.14
13:32
(0) без постобработки в 1с - никак.
Окон-то нет в запросе.
(10) и как же получить по иерархии проценты?
13 Starhan
 
04.03.14
13:37
В подзапросе или запросом раньше две таблицы соединяешь
с группировкой и с общим итогом (группировка только суммы) (тут 1 строчка)
и делишь сумму группировки на общую сумму
14 Unkas
 
04.03.14
13:42
(10) Гениально! Работает. Именно то, что надо.
Сначала берем общие итоге по нужному уровню группировки (по месяцами, например), затем уже получаем основную таблицу и присоединяем к каждой строчке соответствующее значение итоговой суммы по текущему периоду (или нужной группировке). И для каждой строки можем получать процент - делением текущей суммы на итоговую по группировке.
Спасибо тебе, добрый человек.
Вот за что люблю интернет - можно быстро найти интересующую идею/информацию.
Видимо, во франче действительно не нужны такие тугодумы как я - а нужны ребята, которые в интернет пишут, а не читают его в случаях, когда возникает потребность в извращениях.

ВЫБРАТЬ
    ХозрасчетныйОбороты.СуммаОборот КАК СуммаОборот,
    ХозрасчетныйОбороты.Период
ПОМЕСТИТЬ ВТ_ОбщийИтог
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНач, &ДатаКон, Месяц, Счет В ИЕРАРХИИ (&Счет), , , , ) КАК ХозрасчетныйОбороты

СГРУППИРОВАТЬ ПО
    ХозрасчетныйОбороты.СуммаОборот,
    ХозрасчетныйОбороты.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ХозрасчетныйОбороты.Период КАК Период,
    ХозрасчетныйОбороты.Субконто1 КАК Субконто1,
    ХозрасчетныйОбороты.Субконто2,
    ХозрасчетныйОбороты.СуммаОборот КАК СуммаОборот,
    ВТ_ОбщийИтог.СуммаОборот КАК ОборотЗаВесьМесяц,
    ХозрасчетныйОбороты.СуммаОборот / ВТ_ОбщийИтог.СуммаОборот * 100 КАК Процент
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНач, &ДатаКон, Месяц, Счет В ИЕРАРХИИ (&Счет), , , , ) КАК ХозрасчетныйОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОбщийИтог КАК ВТ_ОбщийИтог
        ПО ХозрасчетныйОбороты.Период = ВТ_ОбщийИтог.Период

СГРУППИРОВАТЬ ПО
    ХозрасчетныйОбороты.Период,
    ХозрасчетныйОбороты.Субконто1,
    ХозрасчетныйОбороты.СуммаОборот,
    ХозрасчетныйОбороты.Субконто2,
    ВТ_ОбщийИтог.СуммаОборот
ИТОГИ
    СУММА(СуммаОборот),
    МАКСИМУМ(ОборотЗаВесьМесяц),
    СУММА(Процент)
ПО
    Период,
    Субконто1

Там еще округлять надо, красивость наводить, но общая идея ясна.
15 ptiz
 
04.03.14
13:52
(14) Ну если только % от общего итога - это слишком просто.
Ты еще посчитай по договорам внутри контрагентов, а потом отсортируй по убыванию и добавь нарастающий итог :)
16 Unkas
 
04.03.14
14:01
(15) Ну, по договорам оно и так считается - т.к. договоры, это Субконто2, то бишь считается процент на всех уровнях, которые ниже выбранного за 100% (месяц в нашем случае).
Сортировка по убыванию легко ставится в Порядке по полю Процент.
А вот с нарастающим... геморройно, конечно, но путь решения все равно виден: присоеденить таблицу с оборотами по месяцам к каждой строчке. И через ВЫБОР КОГДА ТОГДА плюсовать в оборот нужные итоги по месяцам, в зависимости от текущего месяца в строчке.
Писать код не буду =)
17 Леша1с
 
05.03.14
14:55
(16) попробуй, напиши с нарастающим, там кода раз в десять больше будет, да еще и работать будет только на строго определенных данных ))