Сортировка строк формы, с сохранением второго порядка

23.04.12

Разработка - Механизмы платформы 1С

Более удобная чем стандартная сортировка строк табличной части формы обычного приложения 8.х

Идея очень простая: пользователю удобно что если таблицу обработки отсортировать по галочке, сортировка по Номенлатуре / контрагенту внутри одниаковых галочек осталось прежней.

При стандартной сортировке при нажатии на кнопку сортировать, сортировка по одинаковым реквизитам изменяется произвольным образом. В 1С сделали наверно это для скорости - если надо можно указать несколько полей сортировке, но для интерфейса пользователя проще сделать чтобы при сортировке по одинаковым значениям из колонки сортировки старый порядок строк сохранялся. (таким образом мы получаем удобную сортировку по нескольким колонкам.)

Еще одно достоинство преопределения кнопки сортировать можно делать сортировку по галочкам -где заполнено свойство данные флажка. Можно добавить сортировку по артикулу и коду табличной части Товары.

Метод расчитан на то что имя колонки формы и колонки Таблицы/Дерева/ТабЧасти совпадают

Наврено 1С в скоре сделает разные методы сортировки по кнопке формы и метода .Сортировать(..) или добавит параметр -сохранять порядок. У меня сейчас стоит 8.2.14.540 и второй порядок нарушается.

(? -кто-ни-будь пользовался объектом сортировки ? -на что он влияет?)

Пока 1С это не поправила можно из  обработчика кнопки сортировать вызывать процедуру:

СортироватьЭкраннуюТаблицу(..)

//Сортирует Таблицу в соотвествии с порядком строк
//Параметры:
//ЭлементФормы -- Таблица на форме, тип значения данных: Табличная часть, ТаблицаЗначений, ДеревоЗначений
//Направление -- Направление сортировки ={ "Возр"/"Убыв" }
//ВходИмяКолонкиПорядокСтрок -- Если у таблицы есть клонка для скорости можно ее указать, иначе она будет создаваться и удаляться после сортировки
Процедура СортироватьЭкраннуюТаблицу(ЭлементФормы,Направление="Возр",ВходИмяКолонкиПорядокСтрок="") // Сортирует Таблицу в соотвествии с порядком строк //+Илья 130412
   
Перем КолонкаПорядка;

   
ИмяТекКолонки = ЭлементФормы.ТекущаяКолонка.Имя;
   
ТекТаблица = ЭлементФормы.Значение;
   
ЭтоТЗ = (ТипЗНЧ(ТекТаблица)=Тип("ТаблицаЗначений"));
   
ЭтоДерево = ?(ЭтоТЗ,Ложь,ТипЗНЧ(ТекТаблица)=Тип("ДеревоЗначений"));

    Если Не (
ЭтоТЗ или ЭтоДерево) Тогда //Может быть Таб чать?
       
МДТабчасти = Метаданные.НайтиПоТипу(Тип(ТекТаблица));
        Если
МДТабчасти = Неопределено или НЕ МДТабчасти.Родитель().ТабличныеЧасти.Найти(МДТабчасти.Имя)=МДТабчасти Тогда  //Это не табЧасть?
           
ТекТаблица.Сортировать(ИмяТекКолонки+" "+Направление);
            Возврат;
        КонецЕслИ;

        Если
МДТабчасти.Реквизиты.Найти(ИмяТекКолонки)=Неопределено Тогда
            Если Не
МДТабчасти.Реквизиты.Найти(ЭлементФормы.ТекущаяКолонка.Данные)=Неопределено Тогда
               
ИмяТекКолонки = ЭлементФормы.ТекущаяКолонка.Данные;
            ИначеЕсли Не
МДТабчасти.Реквизиты.Найти(ЭлементФормы.ТекущаяКолонка.ДанныеФлажка)=Неопределено Тогда
               
ИмяТекКолонки = ЭлементФормы.ТекущаяКолонка.ДанныеФлажка;
            Иначе
                Возврат;
//Нет реквизита сортировки
           
КонецЕсли;
        Конецесли;
       
ЭтоТабЧасть = Истина;

       
ВходИмяКолонкиПорядокСтрок = "НомерСтроки";
       
ТекТаблица = ТекТаблица.Выгрузить();
    КонецЕсли;

    Если
ТекТаблица.КОлонки.Найти(ИмяТекКолонки)=Неопределено Тогда //нет связи с таблицей
       
Если Не ТекТаблица.КОлонки.Найти(ЭлементФормы.ТекущаяКолонка.Данные)=Неопределено Тогда
           
ИмяТекКолонки = ЭлементФормы.ТекущаяКолонка.Данные;
        ИначеЕсли Не
ТекТаблица.КОлонки.Найти(ЭлементФормы.ТекущаяКолонка.ДанныеФлажка)=Неопределено Тогда
           
ИмяТекКолонки = ЭлементФормы.ТекущаяКолонка.ДанныеФлажка;
        Иначе
            Возврат;
        КонецЕсли;
    КонецЕсли;

   
ИмяКолонкиПорядокСтрок = ВходИмяКолонкиПорядокСтрок//"" => удалять колонку порядок
   
КолонкаПорядка = ВернутьСоздатьКОлонкуСтарогоПорядка(ТекТаблица,ИмяКолонкиПорядокСтрок);

   
ТхтСортировки = ИмяТекКолонки+" "+Направление+","+КолонкаПорядка.Имя;
    Если
ЭтоТЗ Тогда
       
МассивПрежнегоПорядка = ТекТаблица.ВыгрузитьКолонку(КолонкаПорядка);
       
ТекТаблица.Сортировать(ТхтСортировки);
        Если
ВходИмяКолонкиПорядокСтрок="" Тогда
           
ТекТаблица.Колонки.Удалить(КолонкаПорядка);
        Иначе
           
ТекТаблица.ЗагрузитьКолонку(МассивПрежнегоПорядка,КолонкаПорядка); //Количество строк не изменилось!
       
КонецЕслИ;
    ИначеЕсли
ЭтоДерево Тогда //Дерево
       
СтрокиДерева = ТекТаблица.Строки;
       
СтрокиДерева.Сортировать(ТхтСортировки,Истина);
        Если
ВходИмяКолонкиПорядокСтрок="" Тогда
           
ТекТаблица.Колонки.Удалить(КолонкаПорядка);
        Иначе
           
ПронумероватьСТрокиДерева(СтрокиДерева,КолонкаПорядка.Имя);
        КонецЕслИ;
    Иначе
//ТабЧасть
       
ТекТаблица.Сортировать(ТхтСортировки);
       
ЭлементФормы.Значение.Загрузить(ТекТаблица);
    КонецЕсли;
КонецПроцедуры
//----------------------------------------------
Функция ВернутьСоздатьКОлонкуСтарогоПорядка(ТекТаблица,ИмяКолонкиПорядокСтрок)
    Если
ПустаяСтрока(ИмяКолонкиПорядокСтрок) Тогда
       
ИмяКолонкиПорядокСтрок=СтрЗаменить("_"+(Новый УникальныйИдентификатор()),"-","");
    КонецЕслИ;

   
КолонкаПорядка = ТекТаблица.Колонки.Найти(ИмяКолонкиПорядокСтрок);
    Если
КолонкаПорядка = Неопределено Тогда
       
КолонкаПорядка = ТекТаблица.Колонки.Добавить(ИмяКолонкиПорядокСтрок,Новый ОписаниеТипов("Число"));
        Если
ТипЗНч(ТекТаблица)=Тип("ТаблицаЗначений") Тогда;
           
МассивИндексов = Новый Массив;     //Так быстрее: http://forum.infostart.ru/forum24/topic53488/message604616/
           
Для й=1 по ТекТаблица.Количество() Цикл
               
МассивИндексов.Добавить(й);
            КонецЦикла;
           
ТекТаблица.ЗагрузитьКолонку(МассивИндексов,КолонкаПорядка);
        Иначе
//Дерево значений
           
ПронумероватьСТрокиДерева(ТекТаблица.Строки,ИмяКолонкиПорядокСтрок);
        КонецЕсли;
    КонецЕсли;
    Возврат
КолонкаПорядка;
КонецФункции
//----------------------------------------------
Процедура ПронумероватьСТрокиДерева(СтрокиДерева,ИмяКолонкиПорядокСтрок,й=1)
    Для Каждого
СтрокаДерева из СтрокиДерева Цикл
       
СтрокаДерева[ИмяКолонкиПорядокСтрок]=й;
       
й=й+1;
        Если
СтрокаДерева.Строки.Количество()>0 тогда
           
ПронумероватьСТрокиДерева(СтрокаДерева.Строки,ИмяКолонкиПорядокСтрок,й);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Пример реализации: //infostart.ru/public/116645/

Пример неудобной сортировки (для 7.7): //infostart.ru/public/20464/

pls: подскажите как отловить нажатие на заголовок колонки таб части?

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4465    dsdred    53    

70

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5278    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6396    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18464    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12077    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8802    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6273    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15971    SeiOkami    31    

103
Оставьте свое сообщение