Управляемая форма 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; КонецЦикла; КонецЦикла; КонецЦикла; // Создание Реквизита формы типа ДанныеФормыДерево МассивДобавляемыхРеквизитов = Новый Массив; МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево", Новый ОписаниеТипов("ДеревоЗначений"))); Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево")); КонецЦикла; ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); // Преобразование объекта прикладного типа ДеревоЗначений // в реквизит управляемой формы (данные формы) ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево"); // Создание элемента формы типа ТаблицаФормы для отображения дерева ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы")); ЭлементДерево.ПутьКДанным = "Дерево"; ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево; Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ЭлементДерево); НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя; Если НЕ Колонка.Имя = "Пометка" Тогда НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; Иначе НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка; НовыйЭлемент.ТриСостояния = Истина; НовыйЭлемент.УстановитьДействие("ПриИзменении", "ФлажокПриИзменении"); КонецЕсли; КонецЦикла; КонецПроцедуры
Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.
Комментарии:
Чтобы оставить комментарий, Вы должны войти в систему.
Блин, спасибо! помогло
только флажок в упр. форме все равно не принимает третьего состояния! Либо включен, либо выключен 🙁
Разобрался) спасибо
Те що ви робите заслуговує великої похвали.
Дуже знадобилось.
Дякую.
Молодці!
Автору, спасибо! Очень пригодилось! Так держать!
спасибо за статью.