Книга знаний

1С:Предприятие / v8

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




Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2024 | Mista.ru

Яндекс.Метрика