Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как свернуть таблицу значений в коде, но получить не сумму, а максимум?

Как свернуть таблицу значений в коде, но получить не сумму, а максимум?
Я
   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
Продолжайте наблюдение
   HawkEye
 
2 - 24.02.16 - 14:44
(0) вариант отсортировать по полю и взять первое (или последнее) значение, я так понимаю не подходит?
   Aleksandr N
 
3 - 24.02.16 - 14:45
(0) Как по мне, я бы сделал запросом.
   Fragster
 
4 - 24.02.16 - 14:45
а теперь среднее!
   Garykom
 
5 - 24.02.16 - 14:47
(0) чем то это напоминает обмен значений в двух переменных не использую 3-ю переменную

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.