1с динамический список в виде дерева

Отображение иерархических динамических списков в табличном поле имеет ряд особенностей .

Так табличное поле позволяет просматривать иерархические динамические списки по группам , при этом свойство » ТекущийРодитель » табличного поля указывает текущую группу , а свойство » ИзменятьТекущегоРодителя » позволяет запретить переход между группами в табличном поле . Смена текущего родителя происходит при помощи команд перехода по уровням , при отработке связи с другим табличным полем , отображающим дерево групп , а также при программном изменении свойства » ТекущийРодитель «. Следует заметить , что поле » Родитель » отображаемого динамического списка исключается табличным полем из списка доступных полей для отбора . Это связано с тем , что переход по иерархии является частью функциональности табличного поля и понятие » Родитель » для табличного поля является выделенным понятием и не обрабатывается в отборах как другие поля . Так как табличное поле при отображении динамических списков использует механизм динамической выборки , то при формировании выборки оно включает в нее дополнительное условие , указывающее родителя для получаемого блока данных . Тем самым , получаются только строки , имеющие указанного родителя .

Следует отметить , что не существует возможности установки отбора по родителю программно или интерактивно ( посредством команды » Установить отбор и сортировку списка «).

Может возникнуть ситуация , когда в табличном поле необходимо отобразить строки , подчиненные определенному родителю , включая подчиненные строки . Так как используя свойство табличного поля » ТекущийРодитель » можно получить только строки , подчиненные указанному родителю , то не существует стандартной возможности сделать такой отбор . Для решения данной проблемы рекомендуется использовать следующую методику .

Например , пусть существует форма списка справочника » Номенклатура » с двумя табличными полями . Пусть одно из табличных полей отображает указанный список справочника как дерево , а другое как список .

Требуется в табличном поле , отображающем справочник как список отображать все строки , подчиненные текущей строке табличного поля , отображающего древовидный справочник . Для этого при обработке события » ПриАктивизацииСтроки » табличного поля , отображающего древовидный справочник необходимо установить отбор списку справочника , отображаемому как список . Например :

Следует заметить , что табличное поле в открываемой форме будет отображать не иерархический список , а также что данный фрагмент программы не является производительным .

Более подробно ознакомиться с отличиями работы табличного поля при отображении динамических списков можно в разделе Особенности работы табличного поля с динамическими списками.

Особенности работы полосы прокрутки

Табличное поле может отображать два типа данных : динамические списки и статические данные . Особенностью динамических списков является использование при обращении к базе данных механизма динамической выборки , при которой данные считываются не полностью , а блоками . Особенностью статических данных является хранение в памяти всех данных . Примерами динамических списков являются списки справочников , документов , регистров , а примерами статических данных — таблица значений , дерево значений , табличная часть , наборы записей .

При отображении динамических списков табличное поле особым образом отображает полосу прокрутки — в ней бегунок отображается только в трех положениях : вверху , в центре и внизу , и имеет постоянный размер . Такое поведение связано с тем , что табличное поле для уменьшения объема выбираемых данных загружает из базы данных только часть списка , причем, считывание может происходить начиная с любой записи, в том числе и из середины списка . Тем самым табличное поле содержит только видимую часть списка и , следовательно , не имеет информации об положении строки в списке и количестве строк в списке . Поэтому бегунок не отражает положение видимой части списка и используется только для перемещения в начало и конец списка , а также к текущей строке списка . Также положение бегунка указывает на достижение начала или конца списка , это происходит если пользователь попытался выйти за границы списка .

Множественное выделение строк

При выделении группы строк в табличном поле ( например , при нажатии Shift+Home или Shift+End) выделяются только первая и последняя строка списка . Такое поведение характерно для табличных полей , отображающих динамические списки . Как уже было сказано выше , табличное поле при работе с динамическими списками оперирует только видимой частью списка и не имеет информации о положении строки в списке . Следовательно , при выборе группы записей , невозможно однозначно определить, какая из выбранных строк является первой , а какая последней . Следовательно , невозможно определить направление выделения строк , что не позволяет быстро определить диапазон строк .

Поэтому при множественном выделении в динамических списках выполняется выделение только отдельных строк и выделение соседних строк при движении вверх и вниз, но не выполняется выделение диапазонов строк .

Особенности использования свойств ТекущиеДанные и ТекущаяСтрока

Табличное поле предоставляет свойства ТекущиеДанные и ТекущаяСтрока . Отличие между этими свойствами состоит в том , что свойство ТекущиеДанные содержит значения считанных данных текущей строки табличного поля , а свойство ТекущаяСтрока содержит значение , идентифицирующее строку . Следует отметить , что свойство ТекущиеДанные содержит коллекцию значений текущей строки , соответствующую коллекции колонок отображаемого динамического списка , при этом если нужного поля нет в текущих данных , то его можно добавить в коллекцию полей списка используя метод » Добавить » коллекции колонок списка .

Свойство ТекущиеДанные предназначено для получения значений колонок текущей строки , а свойство ТекущаяСтрока для получения и установки текущей строки табличного поля.

Следует заметить, что для объектных данных (Справочник, Документ и т.д.) в качестве значения свойства ТекущаяСтрока используется ссылка на объект базы данных. Соответственно при обращении к свойствам этого значения будет выполняться считывание объекта базы данных.

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

Рекомендуется для обращения к данным объекта использовать свойство ТекущиеДанные.
Правильный фрагмент приведен ниже :

Особенности работы в режиме отображения дерева

В режиме отображения дерева табличное поле , отображающее динамические списки , особым образом отображает кнопки раскрытия узлов . Используется два цвета отображения кнопки : черный и серый . Если при попытке открытия узла дерева было обнаружено, что дочерних узлов нет , то кнопка рисуется серым цветом , иначе — черным . Такое поведение обусловлено тем , что определение наличия подчиненных узлов требует дополнительных ресурсов и при считывании данных не происходит . Поэтому для удобства пользователя узлы , у которых не было обнаружено дочерних узлов , запоминаются табличным полем . Также стоит отметить , что цвет кнопки никак не влияет на последующее раскрытие узлов дерева .

apolenary 14.03.2012 11:06
Прочитано: 7080
Добрый день.
Подскажи как можно реализовать на УП (релиз 8.2.14.519) следующее:
Имеется справочник с иерархическим списком вроде такого:

Иерархический список
Узел1
Узел11
Элемет111
Узел12
Узел121
Элемет1211
Элемет1212
Элемет121
Узел13
Элемент131
Узел2
Узел21
Элемет211
Узел22
Узел221
Элемет2211
Элемет2212
Элемет221
Узел23
Узел3
Узел31
Элемет311
Узел32
Узел321
Элемет3211
Элемет3212
Элемет321
Узел33

Как можно вывести только одну ветку и только узлы:
Узел2
Узел21
Узел22
Узел221
Узел23

Так, чтобы можно было выделить узел и по событию выделения найти его в справочнике.

Сам запрос как сделать я нашел:
ВЫБРАТЬ
Справочник1.Наименование КАК Наименование,
Справочник1.Родитель КАК Родить
ИЗ
Справочник.Справочник1 КАК Справочник1
ГДЕ
Справочник1.Родитель В ИЕРАРХИИ(&Родитель)
И Справочник1.ЭтоГруппа
УПОРЯДОЧИТЬ ПО
Наименование ИЕРАРХИЯ

Но если результат добавляю просто в Динамический список, то данные выводятся просто списком без дерева. Как это можно реализовать?

Оцените статью