Как полностью скрыть строки в таблице на управляемой форме 1С

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

В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с задачей динамического управления отображением данных в таблицах — для этого подойдёт обработка настройки видимости элементов списков и форм. Одной из наиболее востребованных, но при этом вызывающих вопросы задач, является полное скрытие строк в таблице значений (или табличной части), которые не соответствуют заданному условию. В этой статье мы подробно разберем, почему стандартные методы иногда оставляют "пустые дыры" вместо скрытия, и проанализируем три эффективных способа решения этой проблемы.

Метод 1. Условное оформление: Видимость против Отображения

Чаще всего разработчики пытаются использовать механизм УсловноеОформление формы. Однако здесь кроется главная ловушка: использование параметра Отображать. Рассмотрим типичную ситуацию: если установить для строки свойство Отображать = Ложь, платформа просто очистит содержимое ячеек, но сама строка останется на месте, превратившись в пустую белую полосу. Это происходит потому, что Отображать управляет только отрисовкой данных внутри контейнера строки.

Чтобы строка действительно "исчезла", необходимо использовать параметр Видимость. Но и здесь есть нюанс: это свойство нужно применить ко всем колонкам таблицы без исключения. Если хотя бы одна колонка (например, служебная или номер строки) останется видимой, высота всей строки сохранится.

Рассмотрим пример кода (используя программное изменение форм), который настраивает условное оформление для скрытия строк, где номенклатура не входит в определенный список:


&НаСервере
Процедура СкрытьСтрокиЧерезУО(СписокДляСкрытия)
    
    // Очищаем старые настройки, чтобы избежать дублирования
    ЭтаФорма.УсловноеОформление.Элементы.Очистить();
    
    // Создаем новый элемент оформления
    ЭлементУО = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
    
    // 1. Устанавливаем условие отбора
    // В данном примере скрываем строки, которые НЕ входят в список
    ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке;
    ЭлементОтбора.ПравоеЗначение = СписокДляСкрытия;
    ЭлементОтбора.Использование = Истина;
    
    // 2. Указываем поля, которые нужно скрыть
    // Важно: нужно добавить ВСЕ колонки таблицы, которые выведены на форму
    Для Каждого Колонка Из Элементы.Товары.ПодчиненныеЭлементы Цикл
        ПолеОформления = ЭлементУО.Поля.Элементы.Добавить();
        ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(Колонка.Имя);
        ПолеОформления.Использование = Истина;
    КонецЦикла;
    
    // 3. Устанавливаем параметр оформления "Видимость" в Ложь
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
    ЭлементУО.Использование = Истина;
    
КонецПроцедуры

Важный момент: если ваша версия платформы ниже 8.3.10, вы можете столкнуться с тем, что свойство Видимость в условном оформлении ведет себя нестабильно для некоторых типов элементов. В таких случаях рекомендуется переходить к следующим методам.

Метод 2. Использование свойства ОтборСтрок

Если таблица на форме связана с реквизитом типа ТаблицаЗначений или ДанныеФормыКоллекция, у соответствующего элемента формы (таблицы) есть мощное свойство — ОтборСтрок. Оно работает гораздо эффективнее условного оформления, так как фильтрация происходит на уровне отображения данных коллекции, и строки скрываются целиком без необходимости перечислять все колонки.

Проанализируем, как реализовать такой отбор программно (для сложных условий можно использовать отборы на соответствие шаблону):


&НаКлиенте
Процедура ПрименитьФильтр(Команда)
    
    // Формируем фиксированные настройки для отбора
    НастройкиОтбора = Новый ФиксированныеНастройкиКомпоновкиДанных;
    
    // В реальной задаче здесь может быть сложная логика заполнения настроек
    // Для простоты используем прямое обращение к свойству элемента формы
    Элементы.Товары.ОтборСтрок = Новый ФиксированныеНастройкиКомпоновкиДанных;
    
    // Пример установки отбора через структуру (для простых случаев)
    // Внимание: свойство ОтборСтрок может ожидать разные типы в зависимости от версии
    Элементы.Товары.ОтборСтрок = Новый Структура("Номенклатура", ВыбраннаяНоменклатура);
    
КонецПроцедуры

Однако стоит учитывать, что работа со свойством ОтборСтрок имеет свои ограничения. Например, если вам нужно реализовать сложное условие, придется использовать КомпоновщикНастроекКомпоновкиДанных, а облегчить задачу поможет СКДБилдер.

Метод 3. Программная фильтрация данных (Перезаполнение)

Рассмотрим ситуацию, когда в таблице включено отображение итогов в подвале. Ни условное оформление, ни ОтборСтрок в большинстве случаев не меняют итоговые суммы в подвале, так как строки физически остаются в коллекции Объект.Товары. Если пользователю важно видеть сумму только по видимым строкам, единственный надежный путь — это фильтрация самой коллекции данных.

Разберем алгоритм по шагам:

  1. Создаем вспомогательный реквизит формы типа ТаблицаЗначений для хранения полной копии данных.
  2. При необходимости наложить фильтр, очищаем основную таблицу.
  3. Обходим вспомогательную таблицу и копируем в основную только те строки, которые удовлетворяют условию.

Пример реализации:


&НаСервере
Процедура ОбновитьОтображаемыеДанные()
    
    // Допустим, ПолныеДанные - это скрытый реквизит формы с копией всех строк
    // Объект.Товары - то, что видит пользователь
    
    Объект.Товары.Очистить();
    
    Для Каждого СтрокаИсточник Из ПолныеДанные Цикл
        // Проверяем наше условие
        Если СтрокаИсточник.Количество > 0 Тогда 
            НоваяСтрока = Объект.Товары.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточник);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Этот метод гарантирует корректную нумерацию строк и правильный расчет всех итогов.

Сравнительный анализ и рекомендации

Выясним, какой метод лучше выбрать в зависимости от условий задачи:

Производительность: Если в таблице несколько тысяч строк, УсловноеОформление может замедлять отрисовку при прокрутке, так как условие вычисляется "на лету" для каждой видимой строки. ОтборСтрок работает быстрее, так как поддерживается платформенными механизмами оптимизации.

Поиск по таблице: Выяснилось, что стандартный поиск по нажатию Ctrl + F продолжает находить данные в строках, скрытых через УсловноеОформление. Это часто путает пользователей: фокус поиска перемещается на невидимую строку. Если такое поведение недопустимо, используйте ОтборСтрок или перезаполнение коллекции.

Версия платформы: Как было отмечено в обсуждении, на старых релизах платформы (например, 8.3.6) программное управление видимостью через УО может не срабатывать корректно. В современных релизах (8.3.15+) рекомендуется отдавать предпочтение ОтборСтрок для простых фильтров и УО для визуального выделения.

Таким образом, для простого визуального скрытия строк без изменения итогов оптимально использовать Условное оформление с параметром Видимость для всех полей. Если же требуется полноценная фильтрация с пересчетом сумм и корректным поиском — выбирайте метод перезаполнения коллекции или ОтборСтрок.

← На главную