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