Приклади роботи з деревом значень в уп

Так як робота з ДеревомЗначеній і ТабліцейЗначеній в даному контексті практично не відрізняється, в прикладі буде використовуватися ДеревоЗначеній, все те ж саме за винятком ієрархії може бути застосовано і до ТабліцеЗначеній. Як відомо, в. У керованому додатку 1С 8.2 зробити це не так просто як здається на перший погляд.
Звертаю увагу, що ДеревоЗначеній доступно тільки на сервері, в товстому клієнті і зовнішньому з'єднання. В даних самої керованої форми для моделювання дерева використовується тип ДанниеФормиДерево. Для перетворення ДеревоЗначеній <-> ДанниеФормиДерево використовуються методи керованої форми ЗначеніеВРеквізітФорми () і РеквізітФормиВЗначеніе (). Для безпосереднього відображення дерева використовується елемент форми типу ТабліцаФорми пов'язаний через реквізит ПутьКДанним з реквізитом форми типу ДанниеФормиДерево. Якщо Ви не дуже зрозуміла вищеописана зв'язок об'єктів, не засмучуйтеся, нижче розглянемо практичний приклад і все встане на свої місця.

Завдання: Є дерево значень, необхідно відобразити його на керованої формі.
Створюємо нову зовнішню обробку (), додаємо керовану форму і створюємо обробник ПріСозданііНаСервере (). Ніяких реквізитів та елементів "вручну" не додаємо, будемо робити це програмно.
Код 1C v 8.2 УП

Механізм Drag and D_rop (або простіше кажучи "Перетягування") для ДереваЗначеній розташованого на керованої формі керованого застосування
Основна складність реалізації механізму перетягування полягає в тому, що у рядки ДереваЗначеній платформа не дозволяє просто змінити батька, тобто перепідпорядкувати рядок. Єдиний спосіб це зробити - створити новий рядок разом з усіма підлеглими рядками, тобто повністю скопіювати всю гілку дерева разом з усією ієрархією і підпорядкувати її необхідної рядку-батькові, після чого видалити вихідну гілку. Дане завдання розпадається на дві підзадачі:
1). Перед перетягуванням необхідно перевірити коректність даної операції, вузол дерева не можна переносити в вузли підлеглі йому самому, тобто батьківський вузол не можна переносити в дочірні, тому що це призведе до "нескінченної рекурсії" і "падіння" платформи. Це реалізується за допомогою обробника події ЕлементДеревоПроверкаПеретасківанія (...)
2). Якщо перетягування можливо, то за допомогою обробника ЕлементДеревоПеретасківаніе (...) запускається рекурсивна функція, яка створює нову гілку дерева, підпорядковану необхідному батькові, а вихідну видаляє.
Звертаю особливу увагу на те, що в платформі 8.2 реалізований механізм множинного вибору елементів, так що приведені вище операції необхідно зробити для всіх обраних користувачем елементів. ()
Код 1C v 8.2 УП

Реалізувати трьохпозиційний прапорець в ДеревеЗначеній на керованої формі
який працює за наступним алгоритмом:
* Якщо у елемента ДереваЗначеній немає підлеглих елементів, то прапорець може бути або "включений", або "вимкнений".
* Якщо у елемента є підлеглі, то прапорець "включений", якщо ВКЛЮЧЕНО прапорці у ВСІХ підлеглих елементів, "вимкнений" якщо вимкнути прапорці у ВСІХ підлеглих елементів.
Якщо у деяких підлеглих елементів прапорці включені, а у деяких вимкнені, то прапорець батьківського елемента має значення "невизначено".
* При включенні прапорця у батьківського елементу, включаються прапорці ВСІХ підлеглих, при виключенні прапорця у батьківського елементу, вимикаються прапорці ВСІХ підлеглих.
Візьмемо з першої статті процедуру побудови дерева значень і доопрацюємо її, додавши в дерево ще одну колонку, яка буде містити елемент управління прапорець і реалізуємо для нього обробник події "ПріІзмененіі". Весь алгоритм зводиться до обробки зміни прапорця: у всіх підлеглих елементів необхідно включити / вимкнути прапорці в залежності від стану прапорця поточного елемента, а у всіх батьків поточного елемента (які розташовані на верхніх рівнях ієрархії) проставити прапорці в стану "включено" / "вимкнений" / "невизначено" відповідно до вищеописаного алгоритму. ()
Код 1C v 8.2 УП

Отримати відповідь на питання

Схожі статті