Флажок с тремя состояниями в 1С 8

Флажок с тремя состояниями в 1С 8

Рассмотрим более подробно постановку задачи. На форме имеется табличное поле, источником данных для которого является дерево значений. В одной из колонок расположен элемент управления «Флажок». Необходимо что бы он мог принимать три состояния «Включен», «Выключен» и «Неопределено». При этом состояние «Неопределено» или так называемый «серый флажок», т.е. выбранный частично, устанавливается в том случае, если не у всех подчиненных строк состояние флажка одинаковое. Так же если строка имеет подчиненные строки, то при изменении её флажка, соответствующим образом должны изменяться флажки и всех подчиненных строк.
Во-первых, добавим нашу колонку с флажком в дерево значений:

Дерево.Колонки.Добавить(“Пометка”, Новый ОписаниеТипов(“Число”));
ЭлементыФормы.Дерево.СоздатьКолонки();
КолонкиДерева = ЭлементыФормы.Дерево.Колонки;
КолонкиДерева.Пометка.ДанныеФлажка = “Пометка”;
КолонкиДерева.Пометка.УстановитьЭлементУправления(Тип(“Флажок”));
КолонкиДерева.Пометка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
КолонкиДерева.Пометка.ТриСостоянияФлажка = Истина;

Во-вторых, при изменении флажка нужно устанавливать соответствующие значения в подчиненных строках и контролировать значение флажка в «строке-родителе»:

Процедура ДеревоПриИзмененииФлажка(Элемент, Колонка)

  ТекущаяСтрока = Элемент.ТекущаяСтрока;

  Если ТекущаяСтрока.Пометка = 2 Тогда
     ТекущаяСтрока.Пометка = 0;
  КонецЕсли;

  УстановкаФлажков(ТекущаяСтрока, ТекущаяСтрока.Пометка);

  Пока ТекущаяСтрока.Родитель <> Неопределено Цикл
     ТекущаяСтрока.Родитель.Пометка =
                      ?(УстановленноДляВсех(ТекущаяСтрока), ТекущаяСтрока.Пометка, 2);
     ТекущаяСтрока = ТекущаяСтрока.Родитель;
  КонецЦикла;

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

 

Здесь процедура УстановкаФлажков() рекурсивно устанавливает флажки в подчиненных строках:

Процедура УстановкаФлажков(ТекущаяСтрока,Значение)

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

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

А функция УстановленноДляВсех() проверяет установлено ли одинаковое значение для всех строк на текущем уровне:

Функция УстановленноДляВсех(Строка)
   Для Каждого Стр Из Строка.Родитель.Строки Цикл
      Если Стр.Пометка <> Строка.Пометка Тогда
         Возврат Ложь;
      КонецЕсли;
   КонецЦикла;

   Возврат Истина;

КонецФункции