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