Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений. Часть III (Реализация трехпозиционного флажка)

Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений. Часть III (Реализация трехпозиционного флажка)

Продолжаем работать с деревом значений в управляемом приложении 1С 8.2. Данная статья будет посвящена реализации трехпозиционного флажка для ДереваЗначений на управляемой форме 1С предприятия 8.2. С предыдущими статьями этой серии можно ознакомиться тут:
«Управляемая форма 1С 8.2 – Работа с деревом значений и таблицей значений. Часть I (Основы)»
«Управляемая форма 1С 8.2 – Работа с деревом значений и таблицей значений. Часть II (Реализация DRAG and DROP)»

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

  • Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо «включен», либо «выключен».
  • Если у элемента есть подчиненные, то флажок «включен», если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, «выключен» если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
    Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение «неопределенно».
  • При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Создание и заполнение "обычного" объекта прикладного типа ДеревоЗначений,
    // который будет отображен на управляемой форме
    ДеревоОбъект = Новый ДеревоЗначений;
    ДеревоОбъект.Колонки.Добавить("Узел", Новый ОписаниеТипов("Строка"));
    ДеревоОбъект.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Число"));
    Для к1 = 1 По 3 Цикл
        СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
        СтрокаУ1.Узел = "Узел"+к1;
        Для к2 = 1 По 3 Цикл
            СтрокаУ2 = СтрокаУ1.Строки.Добавить();
            СтрокаУ2.Узел = СтрокаУ1.Узел+к2;
            Для к3 = 1 По 3 Цикл
                СтрокаУ3 = СтрокаУ2.Строки.Добавить();
                СтрокаУ3.Узел = СтрокаУ2.Узел+к3;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

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

    // Преобразование объекта прикладного типа ДеревоЗначений
    // в реквизит управляемой формы (данные формы)
    ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");

    // Создание элемента формы типа ТаблицаФормы для отображения дерева
    ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
    ЭлементДерево.ПутьКДанным = "Дерево";
    ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;

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

КонецПроцедуры

Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.

Комментарии:

  1. Игорь:

    Блин, спасибо! помогло
    только флажок в упр. форме все равно не принимает третьего состояния! Либо включен, либо выключен 🙁

  2. Игорь:

    Разобрался) спасибо

  3. Роман:

    Те що ви робите заслуговує великої похвали.
    Дуже знадобилось.
    Дякую.
    Молодці!

  4. Артем:

    Автору, спасибо! Очень пригодилось! Так держать!

  5. Антон:

    спасибо за статью.

Оставить комментарий на Антон