Индекс строки дерева значений

Индекс строки дерева значений

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

Получаем искомую строку вызвав функцию, в функцию передаем строки дерева значений на первом уровне:
ОписаниеМетаданныхЗагрузки = НайтиОтмеченноеЗначениеВДеревеЗначений(ДеревоМетаданных.Строки);

Дерево значений представляет из себя некую структуру с иерархией. Каждая строка имеет свойства «Родитель» и «Строки». У каждой строки может быть сколько угодно подчиненных строк. При этом такие операции как поиск, сортировка, подсчет итогов можно проводить с учетом уровня иерархии и подчиненных строк.

Программное создание дерева значений

Как уже упоминалось выше, каждая строка имеет свойство Строки , которое содержит коллекцию дочерних строк. И сам объект ДеревоЗначений имеет свойство Строки , которое содержит коллекцию строк верхнего уровня.

  • Добавляет колонку в конец коллекции колонок дерева значений.
  • Возвращаемое значение: КолонкаДереваЗначений .
  • Добавляет строку в конец коллекции строк данного уровня дерева значений.
  • Возвращаемое значение: СтрокаДереваЗначений .

    Заполнить табличное поле на форме

    Визуальное представление дерева значений на форме обеспечивает элемент Таблица .

    Пример программного заполнения дерева значений для управляемых форм:

    Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом Выгрузить() и указать параметр ТипОбхода отличным от того, что стоит по умолчанию, т.е. ПоГруппировкам или ПоГруппировкамСИерархией .

    Свернуть и развернуть строки дерева значений

    Свернуть и развернуть дочерние строки элемента дерева значений можно с помощью методов Свернуть() и Развернуть() .

  • Сворачивает узел в указанной строке дерева.
  • ИдектификаторСтроки — идентификатор строки таблицы.
  • Разворачивает узел в указанной строке дерева.
  • ИдектификаторСтроки — идентификатор строки таблицы.
  • СПодчиненными — определяет необходимость раскрытия подчиненных узлов.
  • Получает коллекцию элементов дерева верхнего уровня.
  • Возвращаемое значение: ДанныеФормыКоллекцияЭлементовДерева .
  • Получает коллекцию дочерних элементов.
  • Возвращаемое значение: ДанныеФормыКоллекцияЭлементовДерева .
Читайте также:  Как сделать калибровку аккумулятора на ноутбуке

Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:

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

Прикладной объект представлен либо одним, либо несколькими элементами данных формы. Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).

Удалить строку и очистить дерево значений

Поиск в дереве значений

Среди наиболее часто используемых методов стоит отметить метод Найти() коллекции строк дерева значений.

  • Значение (обязательный, тип Произвольный ). Искомое значение.
  • Колонки (необязательный, тип Строка ). Список имен колонок, в которых будет осуществляться поиск, разделенных запятыми. Если параметр не указан, поиск осуществляется по всем колонкам дерева. Значение по умолчанию — Пустая строка.
  • ВключатьПодчиненные (необязательный, тип Булево ). Определяет, будут ли участвовать в поиске строки подчиненных коллекций (если таковые имеются). Если Истина — строки подчиненных коллекций участвуют в поиске. Значение по умолчанию — Ложь .

Метод осуществляет поиск значения в дереве в указанных колонках коллекции строк дерева значений. Возвращает строку (тип СтрокаДереваЗначений ), которая содержит искомое значение. Если значение не найдено, то возвращается значение Неопределено . Предназначен для поиска уникальных значений.

Читайте также:  Драйвер блютуз для ноутбука леново

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

Анализ задачи привел к следующим выводам:

  • хранить нужно список только развернутых строк дерева;
  • если строка сворачивается, хранить ее в списке больше не нужно;
  • список развернутых строк дерева храним на клиенте, относительно всего дерева он обычно очень небольшой;
  • если есть выделенная строка, после обновления дерева выделяем ее снова;
  • поскольку после обновления дерева идентификаторы в ДанныхФормыДерево изменяются, нам нужно это проконтролировать.

Для клиентской стороны была введена переменная типа Соответствие. Она будет хранить для развернутых строк их уникальные значения (как ключ) и идентификаторы строк (как значения). Важно то, что нельзя в качестве ключей использовать идентификаторы строк. Как я написал выше, они изменяются системой при обновлении дерева, и повлиять на это невозможно.

У таблицы управляемой формы, связанной с ДеревомЗначений, появляются два события — ПередРазворачиванием() и ПередСворачиваением() . В эти события помещаем алгоритмы добавления/удаления данных по разворачиваемой/сворачиваемой строке дерева.

При открытии формы дерево заполняется автоматически в событии ПриСозданииНаСервере() и находится с свернутом состоянии.

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

Обновление данных дерева выполняем на сервере.

Кратко опишу, что происходит. Запросом формируем иерархию справочника Номенклатура и строим дерево. Чтобы исключить повторное добавление в дерево уже имеющихся элементов, отсекаем, используя СоответствиеНоменклатурыИСтрокДерева. Также попутно из этого соответствия получаем строку-родитель дерева для нового элемента.

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

Читайте также:  Доступ с вашего ip адреса временно ограничен

Когда таблица создана, перегружаем дерево в реквизит формы ДеревоЗначений. Затем методом ОбновитьТаблицуИдентификаторовСтрокДереваНаСервере() перебираем данные реквизита ДеревоЗначений (он имеет тип ДанныеФормыДерево) и ищем номенклатуру из дерева в таблице ТаблицаРазвернутыхСтрокДерева. Если совпадения находятся, изменяем идентификаторы в строках ТаблицыРазвернутыхСтрокДерева. Если у пользователя была выделена строка, также ищем новый идентификатор этой строки и запоминаем его. В методе ОбновитьТаблицуИдентификаторовСтрокДереваНаСервере() установлено ограничение, которое срабатывает, если обновлены идентификаторы всех развернутых строк.

Далее управление возвращается в процедуру ОбновитьДеревоЗначенийНаСервере(), где клиентская переменная соответствия идентификаторов строк дерева обновляется актуальными данными. На клиенте строки дерева разворачиваются согласно данным соответствия, выделяется строка, обновление дерева завершается.

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

Работает код тоже быстро. В частности, через веб-клиента на компьютере средней производительности дерево из 400 тыс. строк строится примерно за 2 минуты, перестраивается за 40 секунд.

Я постарался подробно прокомментировать непонятные моменты. Думаю, что-то окажется вам полезным. Буду благодарен за конструктивные предложения и примеры других реализаций. На комментарии вроде "да ты нифига не умеешь, парниша" отвечать не буду принципиально. Спасибо за внимание.

Ссылка на основную публикацию
Индекс расчетного адреса что это
Что такое расчетный адрес? Расчетный адрес платежного инструмента – это один из реквизитов карты, который совпадает с местом жительства или...
Закон мура простыми словами
Зако́н Му́ра (англ. Moore's law ) — эмпирическое наблюдение, изначально сделанное Гордоном Муром, согласно которому (в современной формулировке) количество транзисторов,...
Закрасьте внутреннюю область данной линии
Вопрос по математике: Помогите пожалуйста плиз срочно задание: закрасте внутреннюю область данной линии . какой области :внутренней или внешней -принадлежит...
Индекс строки дерева значений
С деревом значений проблема в том, что по сути это массив строк с данными, каждая строка в котором может иметь...
Adblock detector