Відновленнярозгорнутих рядків ДереваЗначень після його оновлення (керована форма)
Для початку було перерито багато форумів. Здебільшого в них пропонували зберігати стан додаткової колонки. Але у моєму дереві понад 400 тис. записів, а це додаткова витрата пам'яті. Тому я пішов іншим шляхом.
Аналіз завдання привів до таких висновків:
- зберігати потрібно перелік лише розгорнутих рядків дерева;
- якщо рядок згортається, зберігати його у списку більше не потрібно;
- список розгорнутих рядків дерева зберігаємо на клієнті, відносно дерева він зазвичай дуже невеликий;
- якщо є виділений рядок, після поновлення дерева виділяємо його знову;
- оскільки після оновлення дерева ідентифікатори в данихФормиДерево змінюються, нам потрібно це проконтролювати.
Для клієнтської сторони було введено змінну типу Відповідність. Вона зберігатиме для розгорнутих рядків їх унікальні значення (як ключ) та ідентифікатори рядків (як значення). Важливо те, щоне можна як ключі використовувати ідентифікатори рядків. Як я написав вище, вони змінюються системою при оновленні дерева і вплинути на це неможливо.
У таблиці керованої форми, що з ДеревомЗначень, з'являються дві події - ПередРозгортанням() і ПередЗгортанням() . У ці події поміщаємо алгоритми додавання/видалення даних по рядку дерева, що розгортається/згортається.
При відкритті форми дерево заповнюється автоматично в події При Створенні на сервері () і знаходиться з згорнутому стані.
Користувач може самостійно оновити дані, наприклад, після натискання кнопки. Опишемо програмне оновлення дерева на стороні клієнта.
Оновлення даних дерева виконуємо на сервері.
Стисло опишу, що відбувається. Запитом формуємо ієрархію довідника Номенклатура та будуємо дерево.Щоб виключити повторне додавання в дерево вже наявних елементів, відсікаємо, використовуючи відповідність номенклатури і рядок дерева. Також принагідно з цієї відповідності отримуємо рядок-батько дерева для нового елемента.
Після того, як дерево збудовано, формуємо таблицю з даними розгорнутих рядків. Ця частина є актуальною для перебудови дерева. За першої побудови вона пропускається, оскільки в нас немає розгорнутих вузлів.
Коли таблицю створено, перевантажуємо дерево в реквізит форми ДеревоЗначень. Потім методом Оновити Таблицю Ідентифікаторів Рядок Дерева На Сервері () перебираємо дані реквізиту ДеревоЗначень (він має тип Дані Форми Дерево) і шукаємо номенклатуру з дерева в таблиці Таблиця Розгорнутих Рядок Дерева. Якщо збіги знаходяться, змінюємо ідентифікатори в рядках ТаблиціРозгорнутихДерево. Якщо користувач має виділений рядок, також шукаємо новий ідентифікатор цього рядка і запам'ятовуємо його. У методі Оновити Таблицю Ідентифікаторів Рядок Дерева На Сервері () встановлено обмеження, яке спрацьовує, якщо оновлено ідентифікатори всіх розгорнутих рядків.
Далі управління повертається в процедуру Оновити ДеревоЗначеньНа Сервері(), де клієнтська змінна відповідність ідентифікаторів рядків дерева оновлюється актуальними даними. На клієнті рядки дерева розгортаються згідно з даними відповідності, виділяється рядок, оновлення дерева завершується.
Сам алгоритм досить простий, незважаючи на великий обсяг коду. Використовувати його можна у будь-якому дереві. Достатньо визначити унікальне значення для кожного рядка деревини.
Працює код також швидко. Зокрема через веб-клієнта на комп'ютері середньої продуктивності дерево з 400 тис. рядків будується приблизно за 2 хвилини, перебудовується за 40 секунд.