gifts2017

Управляемая форма 1С 8.2(8.3) – работа с деревом значений и таблицей значений. Часть III (Реализация трехпозиционного флажка)

Опубликовал Дмитрий К (ll13) в раздел Программирование - Практика программирования

Продолжаем работать с деревом значений в управляемом приложении 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;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЕсли;

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

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

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

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

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

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

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

http://www.obrabotki.com/1s-tree-table-managedforms-3/

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Пример к статье
.rar 3,66Kb
24.06.15
10
.rar 3,66Kb 10 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владимир Командровский (Wefast) 30.07.15 10:13

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

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

Через ЭтаФорма обратиться к дереву вообще не получает.

ERP 2.0 УФ

Дальше еще не смотрел.
2. Елена Пименова (Bukaska) 30.07.15 11:24
(1) Wefast, Платформа какая? 8.3.6?
Попробуйте тогда вместо: ЭтаФорма использовать: ЭтотОбъект.
3. 1 (shomo) 30.07.15 11:47
(1) Wefast, Если реализация процедуры &НаКлиента, тогда
ДТекущейСтроки = Элементы["Дерево"].ТекущаяСтрока;
ЭлементКоллекции = ЭтаФорма["Дерево"].НайтиПоИдентификатору(
ИДТекущейСтроки);

Вполне работоспособная конструкция. &НаСервере работать не будет, по причине отсутствия не сервере понятия ФОРМА. &НаСервере надо использовать реквизитформывзначение() и значениевреквизитформы.
4. Антон Черных (stupidgamer) 09.11.15 12:29
Отличная статья. Спасибо.
5. 1 (shomo) 21.03.16 18:09
"Через ЭтаФорма обратиться к дереву вообще не получает. " . Возможно глупый вопрос. Через форму не видно - на форме дерево значений присутствует?
6. 1 (shomo) 21.03.16 18:13
Либо Вы пытаетесь получить форму на сервере, а надо на клиенте. С галочками работают только на клиенте. А вот первоначальное считывание состояний галочек на сервере, при заполнении дерева значений данными.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа