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

Они мне предлагают алгоритм сортировки вспомнить?

Они мне предлагают алгоритм сортировки вспомнить?
Я
   RomaH
 
14.02.20 - 11:39
Описание:
Сортирует коллекцию в соответствии с указанными правилами сортировки.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер).
Вызов метода выполняет обращение к серверу.

Надо получить последние измененные 10 файлов

Пишу список файлов в ТЗ
СОРТИРУЮ по дате изменения
получаю первые 10
казалось бы все просто ... но


Описание:
Сортирует коллекцию в соответствии с указанными правилами сортировки.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер).
Вызов метода выполняет обращение к серверу.

а вот сервер тут мне совсем не нужен...
как отсортировать на клиенте?
   vicof
 
1 - 14.02.20 - 11:41
Ручками
   RomanYS
 
2 - 14.02.20 - 11:43
Пишу список файлов в ТЗ ... как отсортировать на клиенте?
Вроде первое с последним несовместимо
   Галахад
 
3 - 14.02.20 - 11:44
Пузырьком? ;-)
   ДенисЧ
 
4 - 14.02.20 - 11:44
(0)
"вот сервер тут мне совсем не нужен"

Понимаешь ли, в чём тут дело, Пятачок... (с)

1с абсолютно пофигу, нужен ли тебе сервер или нет...
   ДенисЧ
 
5 - 14.02.20 - 11:44
(3) Ага. Как раз пятница...
   ptiz
 
6 - 14.02.20 - 11:46
(2) Что за поток букв? Какая ТЗ на клиенте в управляемом приложении?
   mTema32
 
7 - 14.02.20 - 11:48
(6) Реквизит формы.
   ptiz
 
8 - 14.02.20 - 11:50
(7) Тогда на клиенте - это уже не ТЗ.
   pechkin
 
9 - 14.02.20 - 11:50
юзай список.
   Garykom
 
10 - 14.02.20 - 12:02
(0) Юзай массивы
   Garykom
 
11 - 14.02.20 - 12:03
(0) И уточни задание, если у 20 файлов одна дата/время то какие первые 10 тебе нужны?
   НЕА123
 
12 - 14.02.20 - 13:02
(0)
ну, не более 10 проходов
(11)+1
   fisher
 
13 - 14.02.20 - 13:43
А нафига ты их пихаешь в ТЗ на форме, чтобы отсортировать? Тебе же только последние 10 надо?
1. Создай список значений (переменную, не реквизит формы) и пихай туда ГГГГММДД в представление, а остальные данные в виде структур - в значение.
2. Сортируй по представлению
3. Первые 10 запихиваешь уже в ТЗ на форме.
   fisher
 
14 - 14.02.20 - 13:49
А если тебе все данные нужны в ТЗ на форме а сортировка - какая-то промежуточная опция, тогда не парься и делай штатную сортировку с серверным вызовом. На суммарном трафике между клиентом и сервером ты почти ничего не потеряешь, получишь только лишний серверный вызов. Что в худшем случае даст небольшое подтормаживание. Но если сортировка выполняется по какой-то операции пользователя, то пользователь этого подсознательно ожидает и в юзабилити ты не потеряешь.
   novichok79
 
15 - 14.02.20 - 13:52
Процедура СортироватьМассивСтруктур(МассивСтруктур, Знач ИмяКлюча, ОбратнаяСортировка = Ложь) Экспорт 
    
    //пресловутая сортировка пузырьком

    
    Перем ЛевоеЗначение, ПравоеЗначение;
    
    ИмяКлюча = СокрЛП(ИмяКлюча);
    ДлинаМассива = МассивСтруктур.Количество();
    ПорядокИзменен = Ложь;
    
    Для ПервыйСчетчик = 0 По ДлинаМассива - 1 Цикл
        
        ПорядокИзменен = Ложь;
        
        Для ВторойСчетчик = 0 По ДлинаМассива - ПервыйСчетчик - 2 Цикл 
            
            ЛеваяСтруктура = МассивСтруктур.Получить(ВторойСчетчик);
            ПраваяСтруктура = МассивСтруктур.Получить(ВторойСчетчик + 1);
            
            Если ЛеваяСтруктура.Свойство(ИмяКлюча, ЛевоеЗначение) 
                И ПраваяСтруктура.Свойство(ИмяКлюча, ПравоеЗначение) Тогда 
                
                НадоПереставить = ?(ОбратнаяСортировка, ЛевоеЗначение < ПравоеЗначение, ЛевоеЗначение > ПравоеЗначение);
                
                Если НадоПереставить Тогда
                    
                    МассивСтруктур[ВторойСчетчик] = ПраваяСтруктура;
                    МассивСтруктур[ВторойСчетчик + 1] = ЛеваяСтруктура;
                    
                    ПорядокИзменен = Истина;
                    
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЦикла;
        
        Если Не ПорядокИзменен Тогда Прервать;
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры
   novichok79
 
16 - 14.02.20 - 13:52
дарю
   Cthulhu
 
17 - 14.02.20 - 13:52
(2),(6),(8):
// а попробуй на клиенте:

ТЗ = Новый(ОписаниеТипа.Типы()[0]);
// и потом Shift+F9 например

   RomanYS
 
18 - 14.02.20 - 13:58
(17) Да, обсуждали здесь когда-то. Баг это или фича не известно. Когда оно сломается тоже не угадаешь.
   fisher
 
19 - 14.02.20 - 14:02
(15) Тогда уж лучше сортировка вставками. Она не сложнее, зато быстрее на частично отсортированных массивах. Ее часто используют как оптимизационную на рекурсивных сортировках, когда неотсортированными небольшие кусочки остаются элементов по десять. Или сортировку Шелла. Она еще эффективнее и не сильно сложнее. Хотя если так заморачиваться, то уже несложно будет написать и полноценную сортировку слиянием с оптимизациями. Только смысла нет никакого :)
(17) Нужно быть Чипом, чтобы юзать это в продакшене.
   olegves
 
20 - 14.02.20 - 14:04
(0) засунь в список значений и сортируй хот по значению, хоть по представлению
   acht
 
21 - 14.02.20 - 14:07
(17) На вебклиенте упадет с "Индекс находится за границами массива".
Так чта...
   RomanYS
 
22 - 14.02.20 - 14:08
(21) Ты пустой тип взял, а надо с типом ТЗ.
(17) Кстати где его предлагается брать?
   cViper
 
23 - 14.02.20 - 14:08
(0)just google MergeSort and QuickSort
   acht
 
24 - 14.02.20 - 14:09
(22) Ты попробуй-попробуй
   acht
 
25 - 14.02.20 - 14:12
(22) ОписаниеТипа = Новый ОписаниеТипов("ТаблицаЗначений");
   novichok79
 
26 - 14.02.20 - 14:14
(19) я не заморачивался особо, мне нужна была на клиенте сортировка. взял первое, что пришло в голову, и самое простое. а так конечно как написано в (23).
   RomaH
 
27 - 14.02.20 - 14:15
в общем - список последних файлов сильно не мешающий работе

&НаКлиенте
Процедура ПриОткрытии(Отказ)

    ПодключитьОбработчикОжидания("ПолучитьСписокПоследнихФайлов",1,ложь);
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПолучитьСписокПоследнихФайловНаСервере(Знач МассивФайлов,СписокФайлов)
    
    ПоследниеОткрытыеФайлы = Новый ТаблицаЗначений;
    ПоследниеОткрытыеФайлы.Колонки.Добавить("ИмяЯрлыка");
    ПоследниеОткрытыеФайлы.Колонки.Добавить("ПолноеИмяЯрлыка");
    ПоследниеОткрытыеФайлы.Колонки.Добавить("ДатаЯрлыка");
    ПоследниеОткрытыеФайлы.Колонки.Добавить("ПутьДоОбъекта");
    
    Для Каждого Ярлык Из МассивФайлов Цикл
            
        СтрокаТЗ = ПоследниеОткрытыеФайлы.Добавить();    
        
        СтрокаТЗ.ИмяЯрлыка = Ярлык.ИмяЯрлыка;
        СтрокаТЗ.ПолноеИмяЯрлыка = Ярлык.ПолноеИмяЯрлыка;
        СтрокаТЗ.ДатаЯрлыка = Ярлык.ДатаЯрлыка;
        СтрокаТЗ.ПутьДоОбъекта = Ярлык.ПутьДоОбъекта;
                
    КонецЦикла;
    
    ПоследниеОткрытыеФайлы.Сортировать("ДатаЯрлыка УБЫВ");
    
    //СписокФайлов = Новый Массив;

    
    Для КоличествоФайловОфис = 0 По ПоследниеОткрытыеФайлы.Количество() - 1 Цикл
        
        Если КоличествоФайловОфис > 10 Тогда
            Прервать;    
        КонецЕсли;
        
        СтрокаТЗ = ПоследниеОткрытыеФайлы[КоличествоФайловОфис];
        
        Структура = Новый Структура("ПутьДоОбъекта,ИмяЯрлыка",СтрокаТЗ.ПутьДоОбъекта,СтрокаТЗ.ИмяЯрлыка);
        
        СписокФайлов.Добавить(Структура);
        
    КонецЦикла;
    
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьСписокПоследнихФайлов()
    
    Shell = Новый COMОбъект("WScript.Shell");
    ПутьДоЯрлыков = Shell.ExpandEnvironmentStrings("%AppData%\Microsoft\Office\Последние файлы");
    
    ПоследниеФайлы = НайтиФайлы(ПутьДоЯрлыков,"*.lnk");
    
    МассивФайлов = Новый Массив;
    
    Для Каждого Ярлык Из ПоследниеФайлы Цикл
        
        
        ЯрлыкОбъект = Shell.CreateShortcut(Ярлык.ПолноеИмя);
        ПутьДоОбъекта = ЯрлыкОбъект.TargetPath;
        
        РасширениеФайла = Сред(ПутьДоОбъекта,СтрНайти(ПутьДоОбъекта,".",НаправлениеПоиска.СКонца)+1);
        
        Если Не (РасширениеФайла = "doc" ИЛИ РасширениеФайла = "docx" ИЛИ РасширениеФайла = "rtf") Тогда
            Продолжить;    
        КонецЕсли;
        
        Структура = 
        Новый Структура("ИмяЯрлыка,ПолноеИмяЯрлыка,ДатаЯрлыка,ПутьДоОбъекта"
        ,Ярлык.ИмяБезРасширения,Ярлык.ПолноеИмя,Ярлык.ПолучитьВремяИзменения(),ПутьДоОбъекта);
        
        МассивФайлов.Добавить(Структура);
    КонецЦикла;
    
    МассивСпискаФайлов = Новый Массив;
    
    ПолучитьСписокПоследнихФайловНаСервере(МассивФайлов,МассивСпискаФайлов);
    
    Для КоличествоФайловОфис = 0 По МассивСпискаФайлов.ВГраница() Цикл
        
        Если КоличествоФайловОфис > 10 Тогда
            Прервать;    
        КонецЕсли;
        
        СтрокаТЗ = МассивСпискаФайлов[КоличествоФайловОфис];
        
        СтрокаСписка = СписокФайлов.НайтиПоЗначению(СтрокаТЗ.ПутьДоОбъекта);
        
        Если СтрокаСписка = Неопределено Тогда
            СписокФайлов.Вставить(КоличествоФайловОфис,СтрокаТЗ.ПутьДоОбъекта,СтрокаТЗ.ИмяЯрлыка,,БиблиотекаКартинок.ФорматWord);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры


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