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