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