Примечание
Пример можно посмотреть в демонстрационной базе «Оформление списков», форма списка документа Накладная, команда Отбор. Это локальная команда этой формы.
Любое оформление динамических списков возможно на клиенте. Поэтому для программной установки отбора в списке накладных мы будем использовать локальную команду формы списка.
Обработчик этой команды выглядит следующим образом (листинг 3.75).
Листинг 3.75. Установка отбора динамического списка
&НаКлиенте
Процедура Отбор(Команда)
Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
Если Отбор.Количество() > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Отбор уже задан. Команда не выполнена.";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
УсловиеОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаКонтроле");
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = Истина;
Список.КомпоновщикНастроек.ЗагрузитьНастройки(Список.КомпоновщикНастроек.Настройки);
КонецПроцедуры
Список – это реквизит формы, содержащий динамический список. Его свойство Отбор может содержать произвольное количество элементов, описывающих условия отбора в этом списке. Эти условия могут быть заданы разработчиком в конфигураторе либо пользователем в режиме 1С:Предприятие или программно из встроенного языка.
Мы будем получать доступ к настройкам списка, заданным в конфигураторе. Они содержатся в коллекции настроек компоновки данных, к которой мы получаем доступ с помощью свойства динамического списка КомпоновщикНастроек (Список.КомпоновщикНастроек.Настройки).
Прежде чем ставить собственные условия отбора в списке, мы должны каким-то образом обработать ситуацию, когда в списке уже имеются условия отбора.
В реальной жизни возможны различные алгоритмы, но, поскольку у нас всего лишь демонстрационный пример, мы поступим просто. Если для динамического списка уже заданы какие-то условия отбора, мы не будем предпринимать никаких действий и предложим пользователю самостоятельно удалить имеющиеся условия отбора (листинг 3.76).
Листинг 3.76. Анализ имеющихся условий отбора
Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
Если Отбор.Количество() > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Отбор уже задан. Команда не выполнена.";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
Если же никаких условий отбора еще не задано, мы зададим одно условие. Для этого в коллекцию элементов отбора добавим новый элемент (листинг 3.77).
Листинг 3.77. Добавление нового условия отбора
УсловиеОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
В простом случае отбора может быть перечислено несколько элементов, которые объединяются по условию И. В более сложных случаях отборов несколько элементов могут объединяться в группы, и для каждой группы можно задать собственное условие объединения элементов: И, ИЛИ, НЕ.
Таким образом, в коллекции условий отбора могут находиться как элементы, так и группы. В нашем простом примере мы добавляем один элемент, но если вы захотите формировать сложные условия, то нужно будет добавлять группы (Тип("ГруппаЭлементовОтбораКомпоновкиДанных")), устанавливать их свойство ТипГруппы и уже в эти группы добавлять отдельные элементы.
Итак, после того как элемент добавлен, нужно задать условие отбора.
У нашей накладной есть булев реквизит НаКонтроле, который проставляется для накладных, требующих «особого внимания» (рис. 3.101).

Рис. 3.101. Реквизит «НаКонтроле»
Мы хотим, чтобы в результате наших действий в списке отображались только те накладные, которые на контроле.
Условие отбора задается с помощью свойств ЛевоеЗначение, ВидСравнения и ПравоеЗначение.
В нашем случае левое значение – это поле НаКонтроле (листинг 3.78).
Листинг 3.78. Установка левого значения
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаКонтроле");
Это поле мы создаем конструктором Новый, указывая имя поля.
Условие сравнения – равенство. Оно задается с помощью системного перечисления (листинг 3.79).
Листинг 3.79. Установка вида сравнения
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Правое значение – Истина (листинг 3.80).
Листинг 3.80. Установка правого значения
УсловиеОтбора.ПравоеЗначение = Истина;
Таким образом должны быть отобраны только те накладные, у которых поле НаКонтроле содержит значение Истина.
И в заключение мы должны загрузить измененные настройки обратно в компоновщик настроек динамического списка (листинг 3.81).
Листинг 3.81. Загрузка настроек в компоновщик настроек
Список.КомпоновщикНастроек.ЗагрузитьНастройки(Список.КомпоновщикНастроек.Настройки);
Запустим конфигурацию в режиме 1С:Предприятие. Откроется полный список накладных (рис. 3.102).

Рис. 3.102. Полный список накладных
После того как мы выполним команду Отбор, в списке останутся только накладные на контроле (рис. 3.103).

Рис. 3.103. Накладные на контроле
Если мы откроем настройку списка (Еще – Настроить список…), то увидим, что появилось условие отбора (рис. 3.104).

Рис. 3.104. Отбор в настройках динамического списка
Это то самое условие, которое мы добавили из встроенного языка. Пользователь может его изменить, отключить, удалить. Кроме того, у элемента отбора (и у других настроек) существует свойство РежимОтображения, с помощью которого он может сделать настройку невидимой и недоступной для изменения в пользовательском режиме (листинг 3.82).
Листинг 3.82. Загрузка настроек в компоновщик настроек
УсловиеОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;