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