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