helpf.pro
Регистрация
 0 
Распечатать

Табличное поле ~ Как реализовать в дереве значений флажок с тремя состояниями?

8.2 УП
Необходимо реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме 1С предприятия 8.2, который работает по следующему алгоритму:
* Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо “включен”, либо “выключен”.
* Если у элемента есть подчиненные, то флажок “включен”, если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, “выключен” если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение “неопределенно”.
* При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.

Возьмем из первой статьи процедуру построения дерева значений и доработаем ее, добавив в дерево еще одну колонку, которая будет содержать элемент управления флажок и реализуем для него обработчик события “ПриИзменении”. Весь алгоритм сводится к обработке изменения флажка: у всех подчиненных элементов необходимо включить/выключить флажки в зависимости от состояния флажка текущего элемента, а у всех родителей текущего элемента (которые расположены на верхних уровнях иерархии) проставить флажки в состояния “включен”/”выключен”/”неопределенно” в соответствии с вышеописанным алгоритмом. Пример - Скачивать файлы может только зарегистрированный пользователь!
Код 1C v 8.2 УП
 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

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

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

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

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

    ИДТекущейСтроки = Элементы["Дерево"].ТекущаяСтрока;

    Если ИДТекущейСтроки <> Неопределено Тогда

        ЭлементКоллекции = ЭтаФорма["Дерево"].НайтиПоИдентификатору(
            ИДТекущейСтроки);

        Если ЭлементКоллекции.Пометка = 2 Тогда
            ЭлементКоллекции.Пометка = 0;
        КонецЕсли;

        УстановкаФлажков(ЭлементКоллекции, ЭлементКоллекции.Пометка);

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

    КонецЕсли;

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

&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)

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

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

&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)

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

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


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

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


Здесь процедура УстановкаФлажков() рекурсивно устанавливает флажки в подчиненных строках:
Код 1C v 8.х
 Процедура УстановкаФлажков(ТекущаяСтрока,Значение)
 Для Каждого Стр Из ТекущаяСтрока.Строки Цикл
   Стр.Пометка=Значение;
   УстановкаФлажков(Стр,Стр.Пометка);
 КонецЦикла;
КонецПроцедуры   


А функция УстановленноДляВсех() проверяет установлено ли одинаковое значение для всех строк на текущем уровне:
Код 1C v 8.х
 Функция УстановленноДляВсех(Строка)
 Для Каждого Стр Из Строка.Родитель.Строки Цикл
   Если Стр.Пометка<>Строка.Пометка Тогда
    Возврат Ложь;
   КонецЕсли;
 КонецЦикла;
 Возврат Истина;
КонецФункции    
Разместил:   Версии: | 8.x | 8.2 УП |  Дата:   Прочитано: 44584
 0 
Распечатать
Возможно, вас также заинтересует
Google maps, поиск оптимального маршрута 5
В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута: * Географические координаты объектов, которые хранятся в базе; * Координаты начальной и коне
База 1С вылетает, виснет, не грузится, падает с ошибкой? 0
Есть ряд методов, которыми можно попытаться " поднять" упавшую базу 1С 8.х Но сперва нужно сделать резервную копию! Сделайте резервную копию простым копированием папки базы, выгрузка не всегда может быть корректна. Удалить все файлы в папке базы,
Выгрузка / Загрузка данных посредством XML файлов? 1
В основе работы с XML-файлами лежит технология доступа SAX, которая осуществляет считывание по одному тегу. Для этого существует два типа данных – ЗаписьXML и ЧтениеXML . Запись данных справочника в XML-файл: Запись = Новый ЗаписьXML; Запись.О
Дерево значений в таблицу значений или в табличную часть и обратно 10
Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранени
Есть ли у текущего элемента подчиненные 0
Выборка = Справочники.Номенклатура.Выбрать( , Владелец); Если Выборка.Следующий() = Истина Тогда // Есть подчиненные элементы. КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = " ВЫБРАТЬ ПЕРВЫЕ 1 | ЕдиницыИзмерения.Ссылка |ИЗ | Справоч
Посмотреть все результаты поиска похожих
Комментарии
Dasf
19.02.2012 14:45Комментарий: 4
Dasf
А как будет выглядеть код если накладываем отбор на это поле по истина и выгрузкой полученных строк в массив?
Dasf
19.02.2012 13:33Комментарий: 3
Dasf
А можно с примером )
E_Migachev
19.02.2012 13:02Комментарий: 2
E_Migachev
Dasf, перебором в цикле и проверкой на установленный флажок
Dasf
19.02.2012 12:13Комментарий: 1
Dasf
А как теперь значния выделенные флажком просмотреть
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!