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
//Копирует список значений, в копии остаются только те элементы, которые были помечены в соответствии с Пометка
//=отлажена
Функция ___обИзвлечьПомеченныеЭлементыСписка(Зн, Пометка=истина)
Перем Р;
Р=Новый СписокЗначений();
Для Каждого Эл ИЗ Зн Цикл
Если Эл.Пометка=Пометка Тогда
Р.Добавить(Эл.Значение, Эл.Представление, Эл.Пометка, Эл.Картинка);
КонецЕсли;
КонецЦикла;
Возврат Р;
КонецФункции
|