Вход | Регистрация
 

Гуру-тест: как отсортировать набор записей?

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

А потом съезди в Одесу, на привоз. И купи там гУся.
   Гений 1С
 
25 - 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) Задан идиотский вопрос в надежде что все подорвутся его решать. Агащазблин.
   rphosts
 
29 - 04.09.20 - 19:05
если (11) то вместо создатьНабор должно быть.... Прочитать();
И тогда уж через ТЗ - не торт
   МимохожийОднако
 
30 - 04.09.20 - 19:07
Когда коту делать не х...
 
 Рекламное место пустует
   2S
 
31 - 04.09.20 - 19:07
Гифка с хлопанием по лбу
   Ненавижу 1С
 
32 - 04.09.20 - 19:09
(25) да уж... Это первое что пришло в голову. Надеялся на какой-то этакий трюк
   Ёпрст
 
33 - 04.09.20 - 19:14
(0) на вот тебе еще.."гениального г-кода"
    НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ССылка);
    НаборЗаписей.Прочитать();
    ПостроительЗапроса = Новый ПостроительЗапроса();
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(НаборЗаписей);
    ПостроительЗапроса.Порядок.Добавить("Цена",,,НаправлениеСортировки.Возр);
    ПостроительЗапроса.Выполнить();
    НаборЗаписей.Загрузить(ПостроительЗапроса.Результат.Выгрузить());

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

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

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

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

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

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

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

дайте решение Вашей задачи из (55).


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