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

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

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

Метод 1: Использование Условного оформления (УО)

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

Порядок действий при использовании УО:

  1. Создайте элемент в коллекции УсловноеОформление.
  2. В качестве оформления установите параметр Видимость в значение Ложь.
  3. В поле Отбор укажите условие, при котором строка должна быть скрыта (например, значение реквизита строки).
  4. В коллекции Поля обязательно добавьте все колонки, которые присутствуют в вашем дереве. Если вы добавите только одну колонку, скроется лишь ячейка, а сама строка останется видимой.

Рассмотрим пример программной реализации такого подхода:


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

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

Метод 2: Динамическое формирование дерева (Рекомендуемый подход)

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

Почему это надежнее:

Как реализовать этот подход:

  1. Храните исходные данные (например, в таблице значений) на сервере.
  2. При изменении критериев фильтрации очищайте текущие Строки дерева значений.
  3. Запускайте процедуру обхода исходных данных, применяя необходимые условия (например, через оператор Если...Тогда).
  4. Добавляйте в дерево только те элементы, которые прошли проверку.

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

Подводя итоги

Мы проанализировали два пути решения задачи. Использование УсловноеОформление — это «быстрый» способ визуального скрытия, который требует осторожности и может приводить к побочным эффектам в интерфейсе. Перегенерация данных — это профессиональный подход, обеспечивающий стабильную работу формы и предсказуемое поведение дерева.

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

← На главную