v8: Простой способ дать пользователю настраиваемый список полей для сортировки | Иногда в простых отчетах без построителей нужно дать пользователю возможность настраивать порядок сортировки выводимой в отчет таблицу значений. Делюсь опытом. |  | Автор статьи: Гений 1С Последняя редакция №1 от 15.02.08 URL: http://kb.mista.ru/article.php?id=640 |  |  
  Ключевые слова: сортировка,интерфейс,настройка порядка сортировки
 
  Размещаем на поле элемент управления "ПолеСписка", со свойствами: "Только просмотр" = ложь и "Отображать пометки" = истина.
 Далее размещаем в кнопочной панели две кнопки, с картинками со стрелочками вверх и вниз, назначаем им обработчики:
 
 Процедура КоманднаяПанель2КнопкаВверх(Кнопка)
    ___обСместитьСтрокуСпискаФормы(ЭлементыФормы.СписокСортировки, -1);
КонецПроцедуры
Процедура КоманднаяПанель2КнопкаВниз(Кнопка)
    // Вставить содержимое обработчика.
    ___обСместитьСтрокуСпискаФормы(ЭлементыФормы.СписокСортировки, 1)
КонецПроцедуры
 
 Таким образом пользователь может расставлять пометки и управлять порядком сортировки.
 
 Теперь нужно заполнить список, но так, чтобы можно было сохранять настройку списка и обновлять при необходимости список полей (вдруг чего-нибудь новое добавится).
 
 В процедуре "При открытии" формы добавляем поля:
 
     ___обДобавитьВСписокУникально(СписокСортировки, "ДокументКонтрагентПредставление", "Контрагент документа", истина);
    ___обДобавитьВСписокУникально(СписокСортировки, "ДокументВид", "Вид документа", истина);
    ___обДобавитьВСписокУникально(СписокСортировки, "ДокументДата", "Дата документа", ложь);
    ___обДобавитьВСписокУникально(СписокСортировки, "ДатаПередачиВБухгалтерию", "Дата передачи в бухгалтерию", ложь);
    ___обДобавитьВСписокУникально(СписокСортировки, "СФДата", "Дата счет-фактуры", ложь);
    ___обДобавитьВСписокУникально(СписокСортировки, "ДопДата", "Дата вх/исх", ложь);
    ___обДобавитьВСписокУникально(СписокСортировки, "МножественныйСостав", "Множественный состав", ложь);
 
 Далее, устанавливаем в списке сохраняемых значений формы наш список, чтобы его значения сохранялись. С этим разобрались.
 
 Теперь нужно сортировать таблицу значений ТЗ по выбранным полям.
 Можно это сделать так:
     Состояние("Сортировка");
    
    МассивСортировкиПом=___обИзвлечьПомеченныеЭлементыСписка(СписокСортировки).ВыгрузитьЗначения();
    ___обСортироватьТЗПоМассивуПолей(ТЗ, МассивСортировкиПом);
 
 
 Использованные в примере функции (из библиотеки функций Гения 1С):
 //20080215 fixin
//Сортирует таблицу ТЗ по массиву полей, имена полей указаны в значениях списка
//Сортирует безопасно, т.е. если какого-то поля нет, оно пропускается.
Функция ___обСортироватьТЗПоМассивуПолей(ТЗ, МассивПолей)
    //Сортируем таблицу значений
    М=Новый Массив();
    Для Каждого Эл ИЗ МассивПолей Цикл
        Если ТЗ.Колонки.Найти(Эл)<>Неопределено Тогда
            М.Добавить(Эл);
        КонецЕсли;
    КонецЦикла;
    Если М.Количество()<>0 Тогда
        ТЗ.Сортировать(обМассивВСтроку(М, ","));
    КонецЕсли;
КонецФункции
//20071204 fixin 
//Добавляет в список значение только если его нет в списке. 
//Представление - представление значения, если не задано, не указывается.
//Возвращает элемент списка существующего/найденного элемента
//Проверить, что было добавление можно путем контроля размера списка до и после (если надо)
//=протестировано
//Тест: (выдает 1,2)
//    Список=Новый СписокЗначений();
//    обДобавитьВСписокУникально(Список, 1);
//    обДобавитьВСписокУникально(Список, 2, "Вася");
//    обДобавитьВСписокУникально(Список, 1);
//    Сообщить(обСписокВСтроку(Список));
Функция ___обДобавитьВСписокУникально(Список, Значение, Представление="", Пометка=Ложь, _Картинка=Неопределено) Экспорт
    Эл=Список.НайтиПоЗначению(Значение);
    Если Эл=Неопределено Тогда
        Если _Картинка=Неопределено Тогда
            Картинка=Новый Картинка();    
        Иначе
            Картинка=_Картинка;    
        КонецЕсли;
        Эл=Список.Добавить(Значение, Представление, Пометка, Картинка);
    КонецЕсли;
    Возврат Эл;
КонецФункции
//20080215
//Копирует список значений, в копии остаются только те элементы, которые были помечены в соответствии с Пометка
//=отлажена
Функция ___обИзвлечьПомеченныеЭлементыСписка(Зн, Пометка=истина)
    Перем Р;
    Р=Новый СписокЗначений();
    Для Каждого Эл ИЗ Зн Цикл
        Если Эл.Пометка=Пометка Тогда
            Р.Добавить(Эл.Значение, Эл.Представление, Эл.Пометка, Эл.Картинка);
        КонецЕсли;
    КонецЦикла;
    Возврат Р;
КонецФункции
  |