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

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

При разработке сложных документов в системе 1С часто возникает ситуация, когда объект содержит большое количество табличных частей. В зависимости от бизнес-логики или основания заполнения, в конкретном экземпляре документа могут быть заполнены лишь некоторые из них. Отображение множества пустых таблиц перегружает интерфейс, путает пользователя и делает форму визуально «тяжелой». В данной статье мы разберем, как автоматизировать процесс управления видимостью таблиц, чтобы на экране оставались только те, в которых есть данные.

Постановка задачи и выбор правильного метода

Основная цель — перебрать все элементы формы, определить среди них те, которые являются табличными частями, проверить наличие строк в соответствующих данных и установить свойство Видимость. Рассмотрим типичные ошибки начинающих разработчиков и перейдем к наиболее эффективному решению.

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

Разбор базового алгоритма обхода элементов

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Для Каждого Элемент Из Элементы Цикл
        // Здесь будет логика проверки
    КонецЦикла;
    
КонецПроцедуры

В этом цикле переменная Элемент будет поочередно принимать значения всех объектов, расположенных на форме: кнопок, полей ввода, групп и, конечно, таблиц. Наша задача — отфильтровать только нужные нам таблицы.

Идентификация табличных частей и проверка типа

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

Правильный способ проверки типа в 1С выглядит так:

Если ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда

Однако, просто найти ТаблицаФормы недостаточно. На форме могут быть таблицы, не связанные с табличными частями объекта напрямую: динамические списки, деревья значений или вспомогательные таблицы значений, созданные как реквизиты формы. Чтобы убедиться, что таблица относится именно к данным нашего документа, проанализируем свойство ПутьКДанным. Для табличных частей документа путь обычно начинается с префикса Объект..

Реализация надежного решения

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


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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    СкрытьПустыеТаблицыНаСервере();
    
КонецПроцедуры

Нюансы интерфейсного оформления

При использовании данного подхода стоит обратить внимание на группировку элементов. Проанализируем ситуацию: если ваша таблица находится внутри «Группы страниц» (вкладки) и эта таблица скрывается, сама вкладка может остаться видимой, но пустой. Это выглядит неаккуратно.

Чтобы интерфейс «схлопывался» красиво, мы можем применить один из двух подходов:

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

Использование универсальных методов (БСП)

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), рекомендуется использовать методы общего назначения. Например, для динамического получения данных по пути можно использовать функции из модуля ОбщегоНазначенияКлиентСервер. Это сделает ваш код более устойчивым к возможным изменениям структуры данных и упростит поддержку.

Рассмотрим пример обращения к данным через БСП:

ЗначениеТЧ = ОбщегоНазначенияКлиентСервер.ПолучитьРеквизитФормыПоПути(ЭтотОбъект, Элемент.ПутьКДанным);

Это позволяет получить коллекцию строк таблицы, даже если путь к данным более сложный, чем стандартный Объект.ИмяТЧ.

Заключение

Мы рассмотрели эффективный способ управления видимостью табличных частей. Подведем итог ключевым правилам:

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

← На главную