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