Как в обычном приложении 1С установить отбор в табличном поле со списком документов?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке рабочих мест и специализированных обработок в обычном приложении 1С:Предприятие 8 часто требуется отображать не все документы подряд, а только те, которые удовлетворяют определенным условиям (например, имеют флаг Истина в реквизите или находятся в определенном статусе). Рассмотрим, как правильно настроить программный фильтр для элемента управления ТабличноеПоле, связанного с типом ДокументСписок.

Принцип работы отборов в объекте ДокументСписок

Когда на форму обработки или отчета помещается элемент ТабличноеПоле с типом значения ДокументСписок.ИмяДокумента, этот объект предоставляет интерфейс динамического списка обычных форм. У него есть встроенная коллекция Отбор, поля которой соответствуют реквизитам документа.

Каждый элемент отбора управляется тремя ключевыми свойствами:

  1. ВидСравнения — определяет оператор проверки (ВидСравнения.Равно, ВидСравнения.НеРавно, ВидСравнения.ВСписке и др.).
  2. Значение — значение, с которым сравнивается реквизит (число, строка, ссылка на перечисление или булево Истина / Ложь).
  3. Использование — флаг включения отбора (Истина — фильтр активен, Ложь — фильтр отключен).

Программная установка фильтра по реквизиту Булево или Перечисление

Разберем по шагам типовой код настройки фильтрации. Настройку рекомендуется выполнять в процедуре-обработчике события формы ПриОткрытии.

Посмотрим на пример установки отбора по булеву реквизиту:


Процедура ПриОткрытии()
    
    // Включаем фильтрацию по булеву реквизиту
    ЭлементыФормы.ТабличноеПоле1.Отбор.НужныйРеквизит.ВидСравнения = ВидСравнения.Равно;
    ЭлементыФормы.ТабличноеПоле1.Отбор.НужныйРеквизит.Значение = Истина;
    ЭлементыФормы.ТабличноеПоле1.Отбор.НужныйРеквизит.Использование = Истина;
    
КонецПроцедуры

Если требуется фильтровать документы по статусу (например, ссылке на элемент перечисления), обращение к свойству строится аналогично:


// Фильтрация по статусу документа
ЭлементыФормы.ТабличноеПоле1.Отбор.СтатусЗаказа.ВидСравнения = ВидСравнения.Равно;
ЭлементыФормы.ТабличноеПоле1.Отбор.СтатусЗаказа.Значение = Перечисления.СтатусыЗаказов.Принят;
ЭлементыФормы.ТабличноеПоле1.Отбор.СтатусЗаказа.Использование = Истина;

Организация нескольких табличных полей на одной форме

Проанализируем частую архитектурную задачу: разместить на одной форме несколько табличных полей с разными условиями отбора (например, «Новые заказы», «В работе» и «Закрытые»).

Для корректной работы такой структуры необходимо соблюдать правила:

  1. Создать отдельные реквизиты формы: для каждого табличного поля необходимо объявить свой собственный реквизит формы с типом ДокументСписок.ИмяДокумента (например, СписокНовые, СписокВРаботе, СписокЗакрытые). Если привязать разные визуальные таблицы к одному общему реквизиту, отбор применится одновременно ко всем полям.
  2. Связать данные: в свойствах каждого элемента ТабличноеПоле указать соответствующий реквизит в свойстве Данные.
  3. Инициализировать отборы: при открытии формы задать нужные условия для каждой таблицы отдельно.

Пример раздельной настройки отборов для нескольких списков:


Процедура ПриОткрытии()

    // Настройка первого списка (Новые)
    ЭлементыФормы.ТабличноеПолеНовые.Отбор.СтатусЗаказа.ВидСравнения = ВидСравнения.Равно;
    ЭлементыФормы.ТабличноеПолеНовые.Отбор.СтатусЗаказа.Значение = Перечисления.СтатусыЗаказов.Новый;
    ЭлементыФормы.ТабличноеПолеНовые.Отбор.СтатусЗаказа.Использование = Истина;

    // Настройка второго списка (В обработке)
    ЭлементыФормы.ТабличноеПолеВРаботе.Отбор.СтатусЗаказа.ВидСравнения = ВидСравнения.Равно;
    ЭлементыФормы.ТабличноеПолеВРаботе.Отбор.СтатусЗаказа.Значение = Перечисления.СтатусыЗаказов.ВОбработке;
    ЭлементыФормы.ТабличноеПолеВРаботе.Отбор.СтатусЗаказа.Использование = Истина;

    // Настройка третьего списка (Закрытые)
    ЭлементыФормы.ТабличноеПолеЗакрытые.Отбор.СтатусЗаказа.ВидСравнения = ВидСравнения.Равно;
    ЭлементыФормы.ТабличноеПолеЗакрытые.Отбор.СтатусЗаказа.Значение = Перечисления.СтатусыЗаказов.Закрыт;
    ЭлементыФормы.ТабличноеПолеЗакрытые.Отбор.СтатусЗаказа.Использование = Истина;

КонецПроцедуры

Защита отбора от изменения пользователем

По умолчанию пользователь может открыть стандартное окно настройки отбора списка и сбросить заданные разработчиком фильтры. Чтобы запретить отключение или изменение конкретного условия, отключим его доступность в настройке:


// Блокируем возможность пользователю изменить или снять отбор
ЭлементыФормы.ТабличноеПоле1.НастройкаОтбора.СтатусЗаказа.Доступность = Ложь;

Рекомендации по производительности и сохранению настроек

При работе со списками документов важно учитывать два нюанса:

  1. Индексирование реквизита в метаданных: чтобы динамический список с отбором открывался и прокручивался мгновенно даже в базах с миллионами документов, у реквизита в конфигураторе необходимо установить свойство «Индексировать» в значение Индексировать или Индексировать с дополнительным упорядочиванием. При отсутствии индекса СУБД будет выполнять полное сканирование таблицы.
  2. Сохранение настроек формы: если у формы включен флаг СохранятьЗначения, пользовательские настройки могут перезаписать программные установки. В таком случае установку отборов следует вызывать непосредственно в процедуре ПриОткрытии или исключить реквизиты списков из списка автоматически сохраняемых данных.
← На главную