Приветствую Вас ГостьСуббота, 18.05.2024, 13:00

Каталог статей


Отбор в динамическом списке по фиксированному набору параметров

Если список параметр для отбора строго определен, то реализовать отбор можно двумя способами:

1. Добавляем в запрос динамического списка параметры и устанавливаем их при изменении значений отбора на форме. Используем метод Список.Параметры.УстановитьЗначениеПараметра(<Параметр>, <Значение>).

2. Использовать стандартный механизм отбора динамического списка.

Приведу подсмотренный пример реализации второго способа. В конфигурации было 2 варианта:

1) Вызов клиентского метода. Пример ДобавитьОтборВДинамическомСписке(Список,ИмяПоля,ВидСравненияКомпоновкиДанных.БольшеИлиРавно,НачалоДня(ДатаОтбора),Истина);

&НаКлиенте
Функция ДобавитьОтборВДинамическомСписке(ДинамическийСписок, ИмяПоля, ВидСравнения, Значение, Использование = Истина, РежимОтображения= Неопределено,Представление = Неопределено) Экспорт


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

    Возврат ЭлементОтбора;
    
КонецФункции

&НаКлиенте
Функция ДобавитьОтбор(ОтборСписка, ИмяПоля, ВидСравнения, Значение, Использование = Истина, РежимОтображения= Неопределено,Представление = Неопределено) Экспорт


    ЭлементОтбора = ОтборСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ЭлементОтбора.ВидСравнения = ВидСравнения;
    ЭлементОтбора.ПравоеЗначение = Значение;
    ЭлементОтбора.Использование = Использование;
    
    Если  РежимОтображения <> Неопределено Тогда
        ЭлементОтбора.РежимОтображения = РежимОтображения;
    КонецЕсли;
    
    Если  Представление <> Неопределено Тогда
        ЭлементОтбора.Представление = Представление;
    КонецЕсли;
    
    Возврат ЭлементОтбора;
    
КонецФункции

Общий модуль ОбщегоНазначенияКлиентСервер

// В "1С:Предприятии 8.3" для работы с отборами, условным оформлением, группировками и порядком в 
// динамических списках используются механизмы системы компоновки данных.
// Для 8.2 использовались механизмы дин. списка.
// Параметры:
//     ДинамическийСписок (ДинамическийСписок) Реквизит формы, для которого требуется установить отбор.
//  РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения
Функция ОтборСпискаСУчетомВерсииПлатформы(ДинамическийСписок,РежимОтображения=Неопределено) Экспорт


    Если РежимОтображения = Неопределено Тогда
        РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    КонецЕсли;

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

    Возврат(ОтборДинамическогоСписка);
    
КонецФункции

// Возвращает Истина если конфигурация запущена под управлением платформы 8.3 без использования режима совместимости.
Функция ЭтоПлатформа83БезРежимаСовместимости() Экспорт
    
    Возврат Истина;
    
КонецФункции

Чтобы не наложить 2 одинаковых отбора имеет смысл предыдущий отбор по этому полю удалить:

ЭлементОтбора = УправлениеДиалогами.НайтиОтборВДинамическомСписке(Список, ИмяПоля);
    Пока ЭлементОтбора <> Неопределено Цикл                                                
        Список.Отбор.Элементы.Удалить(ЭлементОтбора);
        ЭлементОтбора = НайтиОтборВДинамическомСписке(Список, ИмяПоля);
    КонецЦикла;


&НаКлиенте
Функция НайтиОтборВДинамическомСписке(ОбъектСодержащийОтбор, ИмяПоля) Экспорт


    // Может быть передан: динамический список, НастройкиКомпоновкиДанных, Так же может быть передан  ЭлементОтбора(группа) т.к. функция рекурсивная.
    Если ТипЗнч(ОбъектСодержащийОтбор) = Тип("ДинамическийСписок") Тогда
        ОтборСписка=ОбщегоНазначенияКлиентСервер.ОтборСпискаСУчетомВерсииПлатформы(ОбъектСодержащийОтбор);    
    ИначеЕсли ТипЗнч(ОбъектСодержащийОтбор)=Тип("НастройкиКомпоновкиДанных") Тогда 
        ОтборСписка = ОбъектСодержащийОтбор.Отбор
    Иначе    
        ОтборСписка = ОбъектСодержащийОтбор
    КонецЕсли; 
    
    
    Результат = Неопределено;
    Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
     Для Каждого ЭлементОтбора Из ОтборСписка.Элементы Цикл
        Если ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
            Результат = НайтиОтборВДинамическомСписке(ЭлементОтбора, ИмяПоля);
            Если Результат <> Неопределено Тогда
                Прервать;
            КонецЕсли;
        Иначе
            Если ЭлементОтбора.ЛевоеЗначение = Поле Тогда
                Результат = ЭлементОтбора;
                Прервать;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

 

2) Вызов серверного метода. Пример вызова:

    ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, ИмяПоля, ЗначениеОтбора, ВидСравненияКомпоновкиДанных.Равно,,ЗначениеЗаполнено(ЗначениеОтбора));    
    Элементы.Отбор.ОбновитьТекстРедактирования();

Здесь Элементы.Отбор - это вытянуты на форму отбор динамического списка в виде поля, чтобы можно было отредактировать итоговый отбор.

Добавление отбора идет с учетом наличия ранее выставленного отбора по данному полю. Есть недостаток - нельзя сделать двойной отбор, т.е. поставить 2 условия по одному полю.

Модуль скомпилирован на сервере.

// Добавляет / заменяет существующий элемент отбора динамического списка.
//   Работает для платформы версии 8.3.
//
// Параметры:
//   ДинамическийСписок (ДинамическийСписок) Реквизит формы, для которого требуется установить отбор.
//
Процедура УстановитьЭлементОтбораДинамическогоСписка(ДинамическийСписок, ИмяПоля,
    ПравоеЗначение = Неопределено,
    ВидСравнения = Неопределено,
    Представление = Неопределено,
    Использование = Неопределено,
    РежимОтображения = Неопределено) Экспорт
    
    Если РежимОтображения = Неопределено Тогда
        РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    КонецЕсли;
    
    ОтборДинамическогоСписка = ОтборСпискаСУчетомВерсииПлатформы(ДинамическийСписок,РежимОтображения);
    
    УстановитьЭлементОтбора(
        ОтборДинамическогоСписка,
        ИмяПоля,
        ПравоеЗначение,
        ВидСравнения,
        Представление,
        Использование,
        РежимОтображения);
    
КонецПроцедуры

 

// В "1С:Предприятии 8.3" для работы с отборами, условным оформлением, группировками и порядком в 
// динамических списках используются механизмы системы компоновки данных.
// Для 8.2 использовались механизмы дин. списка.
// Параметры:
//     ДинамическийСписок (ДинамическийСписок) Реквизит формы, для которого требуется установить отбор.
//  РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения
Функция ОтборСпискаСУчетомВерсииПлатформы(ДинамическийСписок,РежимОтображения=Неопределено) Экспорт


    Если РежимОтображения = Неопределено Тогда
        РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    КонецЕсли;

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

    Возврат(ОтборДинамическогоСписка);
    
КонецФункции


// Используется для создания элемента отбора или, если таковой не найден,
// установления существующим элементам свойств
// Параметры
//  ОбластьПоискаДобавления - контейнер с элементами и группами отбора, например
//                  Список.Отбор или группа в отборе
//  ИмяПоля - строка - имя для поля компоновки данных (заполняется всегда)
// Устанавливаемые поля:
//  ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения
//  ПравоеЗначение - произвольный
//  Представление - представление элемента компоновки данных
//  Использование - булево - использование элемента
//  РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения
//
Процедура УстановитьЭлементОтбора(ОбластьПоискаДобавления,
                                знач ИмяПоля,
                                знач ПравоеЗначение = Неопределено,
                                знач ВидСравнения = Неопределено,
                                знач Представление = Неопределено,
                                знач Использование = Неопределено,
                                знач РежимОтображения = Неопределено) Экспорт
    
    ЧислоИзмененных = ИзменитьЭлементыОтбора(ОбластьПоискаДобавления, ИмяПоля, Представление,
                            ПравоеЗначение, ВидСравнения, Использование, РежимОтображения);
    
    Если ЧислоИзмененных = 0 Тогда
        Если ВидСравнения = Неопределено Тогда
            ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        КонецЕсли;
        Если РежимОтображения = Неопределено Тогда
            РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
        КонецЕсли;
        ДобавитьЭлементКомпоновки(ОбластьПоискаДобавления, ИмяПоля, ВидСравнения,
                                ПравоеЗначение, Представление, Использование, РежимОтображения);
    КонецЕсли;
    
КонецПроцедуры

 

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

 

Категория: Формы | Добавил: leshic (27.06.2022)
Просмотров: 348 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0