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