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

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

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

Программная настройка колонки флажка

Для того чтобы флажок в дереве значений не просто отображался, но и корректно редактировался, нам необходимо правильно проинициализировать свойства колонки табличного поля. Разберем по шагам, какие параметры критически важны. Основная ошибка новичков заключается в попытке использовать свойство Данные одновременно со свойством ДанныеФлажка. Если в поле Данные указано имя реквизита типа Булево, система пытается отобразить его как текст («Да»/«Нет»), что мешает нормальной отрисовке графического флажка.

Рассмотрим пример кода, который следует разместить в обработчике события ПриОткрытии формы или в процедуре инициализации дерева:


// Находим нужную колонку в табличном поле дерева значений
КолонкаФлаг = ЭлементыФормы.ДеревоМетаданных.Колонки.Найти("Выбрать");

// Устанавливаем режим редактирования "Непосредственно", 
// чтобы флажок менялся сразу при клике, без лишних нажатий Enter
КолонкаФлаг.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;

// Принудительно назначаем элемент управления "Флажок" для этой колонки
КолонкаФлаг.УстановитьЭлементУправления(Тип("Флажок"));

// Ключевой момент: связываем колонку с данными через ДанныеФлажка
КолонкаФлаг.ДанныеФлажка = "Выбрать";

// Очищаем обычные Данные, чтобы избежать наложения текста на картинку флажка
КолонкаФлаг.Данные = "";

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

Настройка визуального оформления и рамок

Если после программной настройки флажок виден, но его границы (рамка) кажутся бледными или невидимыми, следует обратиться к свойствам оформления табличного поля. В обычных формах 1С визуализация сильно зависит от системных настроек Windows и установленных стилей оформления в самой платформе.

Выясним причину плохой видимости границ. Зачастую это связано с тем, что цвет рамки совпадает с цветом фона поля. Чтобы исправить это, проделаем следующие действия в палитре свойств или программно:

  1. Проверим свойство Рамка у колонки или всего табличного поля. Если установлено «Без рамки», флажок может выглядеть плоским и невыразительным.
  2. Установим цвет рамки. Рекомендуется использовать системные цвета, например, ЦветРамки из набора стилей.
  3. Рассмотрим использование события ПриВыводеСтроки. Если нам нужно выделить флажки только в определенных строках или сделать их контрастнее, мы можем управлять оформлением ячейки динамически.

Посмотрим на пример управления цветом через код:


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

Альтернативный метод: Использование «Картинок состояния»

Бывают ситуации, когда стандартный флажок 1С категорически не подходит под требования дизайна или некорректно отображается из-за специфических настроек операционной системы. В таких случаях опытные разработчики используют механизм картинок состояния (State Images).

Разберем этот метод подробнее:

  1. Создадим библиотеку картинок, содержащую два (или три) состояния: «Снят», «Установлен» и, если нужно для дерева, «Частично установлен» (для родительских узлов).
  2. В свойствах табличного поля выберем эту библиотеку в поле КартинкиСтрок.
  3. В колонке, отвечающей за выбор, вместо типа флажка будем использовать картинку.
  4. Программно будем менять индекс картинки при нажатии на строку или ячейку.

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

Реализация иерархического выбора (рекурсия)

Работа с флажком в дереве значений подразумевает, что выбор родительского узла должен влиять на дочерние. Стандартный флажок 1С этого не умеет «из коробки», поэтому нам необходимо написать обработку события ПриИзменении в элементе управления колонки.

Проанализируем логику рекурсивного обхода. Нам нужно решить две задачи:

Пример реализации обхода вниз по дереву:


Процедура УстановитьФлажкиУПодчиненных(СтрокаДерева, ЗначениеФлага)
    Для Каждого ТекущаяСтрока Из СтрокаДерева.Строки Цикл
        ТекущаяСтрока.Выбрать = ЗначениеФлага;
        // Рекурсивно вызываем функцию для следующего уровня вложенности
        УстановитьФлажкиУПодчиненных(ТекущаяСтрока, ЗначениеФлага);
    КонецЦикла;
КонецПроцедуры

Процедура ДеревоМетаданныхВыбратьПриИзменении(Элемент)
    ТекущаяСтрока = ЭлементыФормы.ДеревоМетаданных.ТекущаяСтрока;
    ЗначениеФлага = ТекущаяСтрока.Выбрать;
    
    // Запускаем рекурсивное обновление подчиненных строк
    УстановитьФлажкиУПодчиненных(ТекущаяСтрока, ЗначениеФлага);
КонецПроцедуры

Проверка доступности и прав редактирования

Если флажок виден, но не реагирует на клики, проверим настройки доступности. В табличном поле дерева значений должны быть соблюдены следующие условия:

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

← На главную