Имя: Пароль:
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
Конец как кол

ПО
Общие,
Отдел
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn