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

24.06.15

Разработка - Механизмы платформы 1С

Продолжаем работать с деревом значений в управляемом приложении 1С 8.2. Данная статья будет посвящена реализации трехпозиционного флажка для ДереваЗначений на управляемой форме 1С предприятия 8.2

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

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

С предыдущими статьями этой серии можно ознакомиться тут:
«Управляемая форма 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/

1с 8.2 1с 8.3 Дерево значений Таблица значений Управляемые формы

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4420    dsdred    53    

69

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5269    YA_418728146    25    

62

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6380    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18458    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12069    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8795    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6271    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15945    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Wefast 30.07.15 10:13 Сейчас в теме

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

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

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

ERP 2.0 УФ

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

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

все заработало....
8. boln 1040 24.06.17 16:28 Сейчас в теме
Интересная тема.

Когда-то 1С вела сайт "Наше 1С", такой слабый аналог Инфостарта. Я разместил там пример программного управления флажком в дереве на управляемой форме по иерархии - установка флажка для потомков и для предков ветви, на которой флажок изменился. Сайта этого давно уже нет. Но вот случайно обнаружил описание своей давнишней публикации на каком-то украинском сайте:
http://pro1c.org.ua/index.php?showtopic=3058



Поскольку там скачать нельзя, выложу здесь. Может, кому пригодится алгоритм.
Прикрепленные файлы:
ДеревоСФлажками.epf
RodinMax; anuar_medeup; ligan; Ryo3000; sevushka; antonio_i; Deemon82; fromer; Надюшка1812; Fartovaya; Мах; +11 Ответить
10. Deemon82 02.06.21 23:15 Сейчас в теме
(8) Спасибо тебе добрый человек!
9. sergeyshik 4 13.03.18 10:40 Сейчас в теме
В принципе рабочий механизм согласно ТЗ описанному в заголовке.
Еще добавил:
-При добавлении нового элемента дерева всегда добавляется с включенной пометкой
-При переносе и удалении строки нужно актуализировать флажки.
Оставьте свое сообщение