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

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

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


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

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

КонецПроцедуры
16 novichok79
 
14.02.20
13:52
дарю
17 Cthulhu
 
14.02.20
13:52
(2),(6),(8):

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