Имя: Пароль:
1C
 
Гуру-тест: как отсортировать набор записей?
🠗 (Волшебник 10.09.2020 20:29)
,
0 Гений 1С
 
гуру
04.09.20
18:06
Отсчет пошел, досрочные ответы приветствуются! ;-)
НЗ = РегистрыСведений.ХХХ.СоздатьНаборЗаписей();
...
1 Полован
 
04.09.20
18:11
(0) Товарисч форумный клоун, ты какие вещества принимаешь, что тебя так штырит?
2 H A D G E H O G s
 
04.09.20
18:12
(0) Это все грибы, Сережа.
3 Гений 1С
 
гуру
04.09.20
18:14
(2) ответ "грибы" не засчитывается.
4 Ненавижу 1С
 
гуру
04.09.20
18:18
В данный момент набор записей пустой
5 Гений 1С
 
гуру
04.09.20
18:19
(4) к черту детали.
6 Гений 1С
 
гуру
04.09.20
18:19
есть НЗ, как его отсортировать. Можно без кода, просто идея.
7 Полован
 
04.09.20
18:20
(6) Зачем его сортировать, болезный?
8 Ненавижу 1С
 
гуру
04.09.20
18:21
Зачем? Сама по себе сортировка набора записей не имеет ценности
9 H A D G E H O G s
 
04.09.20
18:22
Единственный вариант - это отсортировать по номеру строки, если у тебя РС подчиненный регистратору. Но, Сергей, скорее всего ты даже этого и не поймешь.
10 H A D G E H O G s
 
04.09.20
18:23
(9) Единственный вариант -> Единственный практический смысл
11 Гений 1С
 
гуру
04.09.20
18:23
(8) надо. в некоторых прикладных задачах, например, чтобы вывести его на дерево в форму.
12 VladZ
 
04.09.20
18:23
(0) Ткнуться на нужную колонку в режиме предприятия. Готово!
13 Гений 1С
 
гуру
04.09.20
18:24
(12) программно, бро, программно.
(10) мы тут не о смыслах говорим. А о технике. Не ломайся, скажи уже как.
14 VladZ
 
04.09.20
18:24
(11) Выполни запрос, выгрузи в дерево.
К чему вопрос в сабже - не понятно.
15 Гений 1С
 
гуру
04.09.20
18:26
(14) сложно, есть метод проще. Вопрос на знание ассортимента методик.
16 Конструктор1С
 
04.09.20
18:28
(0) накуа?
17 Гений 1С
 
гуру
04.09.20
18:29
(16) вопрос в (0) как а не зачем.
18 Полован
 
04.09.20
18:30
(17) Один дурак может задать столько вопросов, что и 1000 мудрецов не ответят.
19 Конструктор1С
 
04.09.20
18:31
(17) ну ладно. Тогда по каким полям отсортировать?
20 Ненавижу 1С
 
гуру
04.09.20
18:31
(11) для этого набор записей не нужен. Запрос
21 Гений 1С
 
гуру
04.09.20
18:45
(19) по полю Номенклатура.
22 Гений 1С
 
гуру
04.09.20
18:45
(20) Надеюсь, не твои товарищи сидят во Фреше, ггг, иначе заставят меня этот код переписать.
23 Гений 1С
 
гуру
04.09.20
18:46
а уаще подход мне нравится. Задан конкретный вопрос на смекалку, на который нужно дать конкретный ответ. Но вместо смекалки демонстрируется отрицание задачи.
24 ДенисЧ
 
04.09.20
18:47
Выгрузи в ТЗ, отсортируй, загрузи обратно.

А потом съезди в Одесу, на привоз. И купи там гУся.
25 Гений 1С
 
гуру
04.09.20
18:57
(24) ну наконец-то, 24 поста понадобилося. ;-) молодец
26 ДенисЧ
 
04.09.20
19:00
(25) Ну я же не гений... Мне можно.
27 ДенисЧ
 
04.09.20
19:00
Да, а на Привоз таки съезди
28 Полован
 
04.09.20
19:04
(23) Задан идиотский вопрос в надежде что все подорвутся его решать. Агащазблин.
29 rphosts
 
04.09.20
19:05
если (11) то вместо создатьНабор должно быть.... Прочитать();
И тогда уж через ТЗ - не торт
30 Мимохожий Однако
 
04.09.20
19:07
Когда коту делать не х...
31 2S
 
04.09.20
19:07
Гифка с хлопанием по лбу
32 Ненавижу 1С
 
гуру
04.09.20
19:09
(25) да уж... Это первое что пришло в голову. Надеялся на какой-то этакий трюк
33 Ёпрст
 
04.09.20
19:14
(0) на вот тебе еще.."гениального г-кода"

    НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ССылка);
    НаборЗаписей.Прочитать();
    ПостроительЗапроса = Новый ПостроительЗапроса();
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(НаборЗаписей);
    ПостроительЗапроса.Порядок.Добавить("Цена",,,НаправлениеСортировки.Возр);
    ПостроительЗапроса.Выполнить();
    НаборЗаписей.Загрузить(ПостроительЗапроса.Результат.Выгрузить());
34 H A D G E H O G s
 
04.09.20
19:18
Я не сомневался в Сереже.
35 H A D G E H O G s
 
04.09.20
19:19
Посмотрел список тем Сергея. Такое ощущение, что к нему присовокупился ЛивингСтар.
36 Гений 1С
 
гуру
04.09.20
19:31
(35) Не знаю такого
37 fyn
 
04.09.20
19:58
(36) Дед, иди к себе в бложек. Не отвлекай нормальных людей
38 Новиков
 
04.09.20
20:40
(23) >> Задан конкретный вопрос на смекалку, на который нужно дать конкретный ответ. Но вместо смекалки демонстрируется отрицание задачи.

Так сказали же - сделай запросом, нарисуй какое-хочешь там дерево и уже его отображай на форме. В чем проблема с этим?
39 Сияющий в темноте
 
05.09.20
00:04
когда мы читаем записи из базы данных,то они должны быть уже отсортированы в силу того,что для таблицы регистра используется кластерный индекс.
если же мы в этот набор что-то записали сами,то сортировать нужно до момента записи в регистр.
40 Ненавижу 1С
 
гуру
05.09.20
00:18
(39) >>когда мы читаем записи из базы данных,то они должны быть уже отсортированы в силу того,что для таблицы регистра используется кластерный индекс

Я бы не стал полагаться на это

А вообще сортировать в наборе записей бессмысленно. Не для этого оно
41 Гений 1С
 
гуру
05.09.20
09:03
(38) это сложный вариант, правильный ответ дали в (24)
42 Гений 1С
 
гуру
05.09.20
09:04
(40) да ладно? Я из набора записей отрисоываю в дерево формы. МНе важен порядок, ибо само дерево сортировать сложнее, чем НЗ
43 Волшебник
 
05.09.20
09:08
Мой Гений дарит вам сортировку набора записей регистра сведений....
44 Ненавижу 1С
 
гуру
05.09.20
10:21
(42) ну вот хорошо. Передал в ТЗ. Отсортировал. Зачем обратно в НЗ загонять то?
45 Гений 1С
 
гуру
05.09.20
11:06
(44) Потому что код написан под НЗ и менять его под ТЗ дороже, чем выгрузить обратно в НЗ?
46 Волшебник
 
05.09.20
11:29
Интересно, что Гений 1С хранит в регистре с именем ХХХ? ;)
47 Гений 1С
 
гуру
05.09.20
11:33
(46) Строки документа маркировки, как ни странно.
48 dangerouscoder
 
05.09.20
20:17
(42) а что мешает дерево преобразовать в ТЗ и в запросе отсортировать что нужно?
Я просто уже за таким "гением" переписываю вторую конфигурацию - юзеры рады что работать стало быстрее..
49 palsergeich
 
05.09.20
23:12
(48) Он получает 1800 в час, а ты нет.
Ты просто завидуешь
50 acht
 
05.09.20
23:28
(48) > а что мешает дерево преобразовать
28 баксов на бирже сами себя не заработают
51 trdm
 
06.09.20
10:25
(3) >  ответ "грибы" не засчитывается.

это аворит народного голососования :)
52 Гений 1С
 
гуру
07.09.20
09:38
(48) ну наверное сложнее дерево в ТЗ преобразовать, чем НЗ в ТЗ, тебе не думается? Бракоделы всегда гению завидуют, не удивительно.
(49) не за красивые глаза и громкое имя, кстати. ;-)
53 s111
 
07.09.20
09:58
(49) и я завидую!
54 Tatitutu
 
07.09.20
11:01
а запросы уже не в моде ?
55 Asmody
 
09.09.20
14:47
(0) Гений, ты лучше расскажи нам, как минимальными усилиями проверить - отсортированы записи в наборе / строки в таблице или нет?
56 Вафель
 
09.09.20
15:14
(55) так циклом пройтись и а[i] > a[i-1]
57 Ёпрст
 
09.09.20
15:30
(56) а если сортировка в другом направлении?
%)
58 Волшебник
 
09.09.20
15:32
(56) лучше запросом в цикле
59 МихаилМ
 
09.09.20
15:51
(55) медиана ?
60 Asmody
 
09.09.20
15:55
(59) А что медиана? Если там ссылочное значение, какая у него медиана?
61 vit-alx
 
09.09.20
16:27
(55) в запрос, сджойнить саму с собой по номеру строки+1 и условию сортировки, нулл последний отбрасываем и смотрим количество в результате запроса
62 Волшебник
 
09.09.20
17:02
(61) Слабенько... Нет изящества. Это же гуру-тест
63 vit-alx
 
09.09.20
17:05
Зато быстро и понятно
64 polosov
 
09.09.20
17:29
(21) За сортировку по ссылочному полю вообще бить принято.
65 Вафель
 
09.09.20
17:30
(64) почему бы и нет? не обязательно же по представлению
66 polosov
 
09.09.20
17:33
(65) Практического смысла мало. В (9) было уже разъяснено.
67 lodger
 
09.09.20
17:40
(65) а надо шоб Арбузы шли перед Дынями!
68 Ёпрст
 
09.09.20
17:41
(66) почему мало ? Хотя бы с одним ид будут рядом
69 ДедМорроз
 
09.09.20
18:40
Дерево в таблицу преобразуется с хвоста и без всякой рекурсии,только со стеклом,где хранится предыдущее,но для него можно массив
70 vit-alx
 
09.09.20
18:44
(62) можно запросом в вт, во вторую вт отсортировать первую, сджойнить их внутренним по номеру строки и не условию сортировки. если запрос пустой значит отсортирована
71 vit-alx
 
09.09.20
18:46
+(70) забыл во второй вт добавить автонумерацию
72 vit-alx
 
09.09.20
20:11
Можно еще вывалить тз в xml, отсортировать тз и вывалить во второй xml и тупо сравнить два текста
73 vit-alx
 
09.09.20
20:20
Либо через СравнениеЗначений попробовать сравнить тз и отсортированную копию тз, но не уверен что сработает

Будет уже озвучено гениальное решение?
74 Web00001
 
10.09.20
04:11
(17)В данном конкретном случаем вопрос "как" имеет смысл только, когда известен ответ на вопрос "зачем". Потому, что если важен порядок значит тебе в результате нужен не набор записей(то есть ты не собираешься писать в регистр именно в таком порядке), а набор записей это просто источник данных. Вопрос зачем тебе задали верный, потому, что от него зависит ответ. Все ответы которые могут быть это выгрузка этого набора в какую либо коллекцию, либо в объект который может сортировку(не надо так) и загрузка обратно.
75 Злопчинский
 
10.09.20
04:26
(64) А почему-это?
вот например два разных договора. с одинаковым наименованием.
сортировка по наименованию/представлению даст в алгоритме жопу. приходится сортировать по внутреннему представлению/ссылке.
76 ASU_Diamond
 
10.09.20
07:37
(25) я такую схему ещё в году 2008 ил 2009 использовал. Только я это использовал, чтобы находу решить задачу, не было времени придумывать правильный подход.
77 Повелитель
 
10.09.20
08:04
(33) Пока флудили нормального ответа не заметили.
Мне нравится.
78 lodger
 
10.09.20
09:48
еще один рецепт придумал.

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ССылка);
НаборЗаписей.Прочитать();

Для каждого ЗаписьРС из НаборЗаписей Цикл
ПроцедураНайтиМестоИвставить(ЗаписьРС,КоллекцияПриёмник);
КонецЦикла;

Процедура ПроцедураНайтиМестоИвставить(ЗаписьРС,КоллекцияПриёмник)
Если КоллекцияПриёмник.Количество() > 0 Тогда

СравнениеЗначений = новый СравнениеЗначений();
МестоВставки = -1;
Для каждого ЭлементКоллекции из КоллекцияПриёмник Цикл
Если СравнениеЗначений.Сравнить(ЗаписьРС.Номенклатура,ЭлементКоллекции.Номенклатура) < 0 Тогда
МестоВставки = КоллекцияПриёмник.Индекс(ЭлементКоллекции);
Прервать;
конецесли;
конеццикла;
Если МестоВставки >=0 Тогда
заполнитьзначениясвойств(КоллекцияПриёмник.Вставить(МестоВставки),ЗаписьРС);
Иначе
заполнитьзначениясвойств(КоллекцияПриёмник.Добавить(),ЗаписьРС);
КонецЕсли
Иначе
заполнитьзначениясвойств(КоллекцияПриёмник.Добавить(),ЗаписьРС);
конецЕсли;
конецпроцедуры

тюнинх полнейший, кастомность 146%.
79 Повелитель
 
10.09.20
12:01
(78) Проще уж запросом
80 ДедМорроз
 
10.09.20
18:32
Алгоритмов сортировки много и у каждого есть свои области применения.
Опять же,О(N*N) нужно бояться,когда у вас уж очень много строк,так как всякие переносы и т.п.съедят время.

И перестановка отсортированного-это отдельная интересная задача.
81 lodger
 
10.09.20
19:55
(80) в силу специфики, у 1с с alloc'ом памяти у коллекций значений по мере роста всегда было туго. а у операции простой сортировки всегда известен выходящий размер.
поэтому разумно сразу выделять ТЗ\массив\назови сам\ целевого размера. а дальше не добавлением\вставкой оперировать, а заполнением\очищением значений в элементах коллекции.
82 Волшебник
 
10.09.20
20:30
Хватит разврата
83 МихаилМ
 
10.09.20
20:46
(55) (Asmody)
поделитесь идеей.
84 etc
 
11.09.20
09:37
(0) любым из 3-х методов сортировки. 1-курс МИЭМ.
85 МихаилМ
 
12.09.20
12:57
Asmody
дайте решение Вашей задачи из (55).