Имя: Пароль:
1C
1С v8
Как свернуть таблицу значений в коде, но получить не сумму, а максимум?
0 Ildarovich
 
24.02.16
14:40
Тема Как свернуть таблицу значений в коде, но получить не сумму, а максимум? b Метод таблицы значений Свернуть() вычисляет Суммы, а нужно вычислить и Максимум оказалось заархивированной, а я нашел решение. Оно в том, чтобы выполнить небольшую предварительную обработку таблицы значений, после которой обычная свертка даст нужный результат.
Дано.Сортировать("Поле1, Поле2");
Для ё = 1 По Дано.Количество() - 1 Цикл
    Если Дано[ё].Поле1 = Дано[ё - 1].Поле1 И Дано[ё].Поле2 = Дано[ё - 1].Поле2 Тогда
        Дано[ё].Поле3 = Макс(Дано[ё].Поле3, Дано[ё - 1].Поле3);
        Дано[ё - 1].Поле3 = 0
    КонецЕсли
КонецЦикла;
Дано.Свернуть("Поле1, Поле2", "Поле3");
Здесь Поле1, Поле2 - поля группировки, а Поле3 - поле поиска максимума.
Решение опубликовано здесь: http://catalog.mista.ru/public/460935/ . Там есть и другие варианты решения той же задачи.
1 Провинциальный 1сник
 
24.02.16
14:41
Продолжайте наблюдение
2 HawkEye
 
24.02.16
14:44
(0) вариант отсортировать по полю и взять первое (или последнее) значение, я так понимаю не подходит?
3 Aleksandr N
 
24.02.16
14:45
(0) Как по мне, я бы сделал запросом.
4 Fragster
 
гуру
24.02.16
14:45
а теперь среднее!
5 Garykom
 
гуру
24.02.16
14:47
(0) чем то это напоминает обмен значений в двух переменных не использую 3-ю переменную

ЗЫ это плохой метод, медленный, другие быстрее
6 Записьдампа
 
24.02.16
14:48
И нафига эти выкрутасы, если все равно перебирать все строки?
7 Garykom
 
гуру
24.02.16
14:53
(5)+ к примеру можно было просто по 3-м колонкам отсортировать и никаких вычислений и свернуть уже не нужно, максимум готовый в 1-й строчке при смене Поле1+Поле2 и лежит он в Поле3

ЗЫ но для некоторых случаев подобный метод после напильника может пригодиться и кстати часто подобное делал, но не называл это так громко ))
8 Fragster
 
гуру
24.02.16
14:54
а нафига для каждых двух строк выбирать максимум, если достаточно отсортировать по "Поле1, Поле2, Поле3 Убыв" и при изменении поля1 и 2 либо добавлять эту строку в новую таблицу, либо выставлять флаг и обнулять все Поле3 в последующих строках с теми же значениями Поле1 и Поле2?
9 Garykom
 
гуру
24.02.16
14:55
(8) опоздал см (7)
10 hhhh
 
24.02.16
15:03
(7) сортировка на порядок медленнее перебора. Для ускорения  ТЗ нужно будет проиндексировать по этому полю. Лучше перебрать.
11 Garykom
 
гуру
24.02.16
15:13
(10) а теперь внимание на строчку 1 в (0) !
12 Ildarovich
 
24.02.16
15:17
(7) это не универсальное решение. В отличие от него приведенное решение позволяет по схожей схеме находить минимум, первые, последние значения в группировках и делать это вместе с обычной сверткой оставшихся полей.
(4) если очень нужно, сделаю, но там букв больше будет - на минимализм не потянет.
(10) в статье "Минимализмы2" по ссылке есть вариант с соответствием, ему сортировка не нужна. Там, правда, вариант для одного поля, но и несколько можно - еще две строчки.
13 Ildarovich
 
24.02.16
22:33
(7)(8) Да, этот вариант еще короче, спасибо.Дано.Сортировать("Поле1, Поле2, Поле3 Убыв");
Для ё = 1 По Дано.Количество() - 1 Цикл
    Если Дано[ё].Поле1 = Дано[ё - 1].Поле1 И Дано[ё].Поле2 = Дано[ё - 1].Поле2 Тогда
        Дано[ё].Поле3 = 0
    КонецЕсли
КонецЦикла;
Дано.Свернуть("Поле1, Поле2", "Поле3");
Основная теорема систематики: Новые системы плодят новые проблемы.