Имя: Пароль:
1C
1С v8
Как получить КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...) с наименьшим расходом памяти?
0 ptiz
 
29.10.13
16:23
Возьмем простой отчет: кол-во различных позиций номенклатуры.
С разными итогами (общие итоги, отдел, покупатель).

Упрощенно:

ВЫБРАТЬ
    Продажи.Отдел КАК Отдел,
    Продажи.Покупатель КАК Покупатель,
    Продажи.Номенклатура КАК Номенклатура
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &Дата1 И &Дата2
ИТОГИ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура)
ПО
    ОБЩИЕ,
    Отдел,
    Покупатель


Цифры получаются правильные, но в случае больших таблиц всё это требует жуткого количества памяти, т.к. в детальных записях присутствуют все сочетания "Отдел/Покупатель/Номенклатура".
Мне же надо в результате только 1 цифру напротив каждого отдела/покупателя.

Даже если всё это посчитается на сервере (отожрав много гигов памяти), то в момент передачи клиенту результата такого запроса 1С вываливается с криком "Мало памяти".

Поскольку меня совсем не интересуют детальные записи, то как бы от них избавиться и получить результат только с итоговыми записями?

Или может есть другой способ получить КОЛИЧЕСТВО(РАЗЛИЧНЫЕ..) ?
1 Wobland
 
29.10.13
16:24
группировка это называется
2 Ёпрст
 
29.10.13
16:24
сверни табличку до того как
3 Wobland
 
29.10.13
16:25
а ещё я верю в то, что в виртуальной таблице уже будет лежать всё как надо
4 Bober
 
29.10.13
16:26
(3) хорошая мысль
5 ptiz
 
29.10.13
16:27
(2) Как? Пример плиз.
6 ptiz
 
29.10.13
16:29
(3) Источник данных не принципиален, просто текст проще было так набрать :)
7 vicof
 
29.10.13
16:31
(6) Сгруппировать, Поместить
8 H A D G E H O G s
 
29.10.13
16:31
ВЫБРАТЬ
    ПродажиОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
    ПродажиОбороты.Организация КАК Организация,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Номенклатура) КАК КоличествоНоменклатур
ИЗ
    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.ЗаказПокупателя,
    ПродажиОбороты.Организация
ИТОГИ
    СУММА(КоличествоНоменклатур)
ПО
    Организация,
    ЗаказПокупателя
9 H A D G E H O G s
 
29.10.13
16:32
Ну и в параметры - отбор по периоду
10 ptiz
 
29.10.13
16:36
(8) А вот и фиг. Если два покупателя продали одинаковый товар, то твой запрос выдаст 2. А надо - 1.
11 H A D G E H O G s
 
29.10.13
16:40
(10) Ниче не понял
12 Drac0
 
29.10.13
16:45
(11) Хм, а ведь он прав.
13 vicof
 
29.10.13
16:45
(10) Покупатели обычно покупают)
14 ptiz
 
29.10.13
16:46
(11) Если покупатели купили один и тот же товар, то во всех итогах (в т.ч. ОБЩИХ) должно стоять: "1".
В  случае использования "СУММА()", эти "единички" по покупателям будут просуммированы и общий итог будет > 1.
15 Drac0
 
29.10.13
16:46
А если сначала берем все различные товары, их помещаем в ВТ и птом уже соединением и группируем? Т.е. получается от общего к частному.
16 ptiz
 
29.10.13
16:46
(13) Ну да , купили они :)
17 ptiz
 
29.10.13
16:47
(15) Самый последний запрос чем будет отличаться от (0)?
18 vicof
 
29.10.13
16:48
(14) МАКСУИМУМ(КоличествоНоменклатур) не?
19 Drac0
 
29.10.13
16:52
(17) Ну, да ничем. А 3 ВТ с группровками быстрее будет? Сначала соберем тупо различные Товары, потом различные в группировке по Отделу, потом в группировке по Отделу+Покупатель. Но, чую, это будет воспроизведние итогов вручную, но может отработать стабильнее и без пробелм с памятью точно.
20 ptiz
 
29.10.13
16:56
(18) Не подойдет, товары разных покупателей могут пересекаться.
(19) "воспроизведние итогов вручную" - этого не хочется, т.к. всё засунуто в построитель.
21 Drac0
 
29.10.13
17:03
По этим ВТ можно будет построить уже нормальное дерево, если нужно оно. ИТОГИ в этом случае будут уже чистой формальностью по затратам.
22 H A D G E H O G s
 
29.10.13
17:04
(14) У меня так и есть
23 H A D G E H O G s
 
29.10.13
17:06
А, все поняд
24 ptiz
 
29.10.13
17:09
(21) Чтобы верно сработали ИТОГИ ПО, нам приходится принимать от сервера лишние, ненужные в нашем случае детальные записи: Отдел/Покупатель/Номенклатура - что и жрет ресурсы :(
25 Drac0
 
29.10.13
17:47
(24) В моем варианте этого не будет. Данные в итоги пойдут уже сгруппированные.
26 mistеr
 
29.10.13
17:52
(0) К сожалению, чтобы посчитать количество(различные), действительно нужно много памяти. И тоги заранее не рассчитаешь.

Рассчитать все на сервере можно так

ВЫБРАТЬ
    Продажи.Отдел КАК Отдел,
    Продажи.Покупатель КАК Покупатель,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Номенклатура) КАК НоменклатураКоличество
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &Дата1 И &Дата2
СГРУППИРОВАТЬ ПО
    Отдел,
    Покупатель

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Продажи.Отдел КАК Отдел,
    NULL КАК КАК Покупатель,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Номенклатура) КАК НоменклатураКоличество
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &Дата1 И &Дата2
СГРУППИРОВАТЬ ПО
    Отдел

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    NULL КАК Отдел,
    NULL КАК КАК Покупатель,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Номенклатура) КАК НоменклатураКоличество
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &Дата1 И &Дата2


Ну и если брать из оборотов (за несколько месяцев), можно еще немного сэкономить.
27 mistеr
 
29.10.13
17:54
fix^: *И итоги* заранее не рассчитаешь.
28 Drac0
 
29.10.13
18:15
Как-то так. Писал с планшета.
ВЫБРАТЬ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура) как Кол
ПОМЕСТИТЬ ВТ_Общие
ИЗ
РегистрНакопления.Продажи

;

ВЫБРАТ
Продажи.Отдел как отдел,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Номенклатура) как Кол
ПОМЕСТИТЬ ВТ_Отделы
ИЗ
РегистрНакопления.Продажи как Продажи

СГРУППИРОВАТЬ ПО
Продажи.Отдел

;

ВЫБРАТ
Продажи.Отдел как отдел,
Продажи.покупатель как покупатель,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Номенклатура) как Кол
ПОМЕСТИТЬ ВТ_Покупатели
ИЗ
РегистрНакопления.Продажи как Продажи

СГРУППИРОВАТЬ ПО
Продажи.Отдел,
Продажи.покупатель

;

ВЫБРАТЬ
покупатели.Отдел,
покупатели.покупатель,
покупатели.кол как кол,
Отделы.кол как кол1,
Общие.кол как кол2
ИЗ
ВТ_Покупатель как покупатели
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Вт_Отдел как Отделы
  ПО Отделы.Отдел = покупатели.отдел
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Общие Как Общие
  ПО Истина

ИТОГИ
Выбор
  Когда отдел есть null
   Тогда кол2
  Иначе кол1
Конец как кол

ПО
Общие,
Отдел
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой