1с развернуть дерево значений на управляемой форме

Свернуть / Развернуть дерево значений

Долго бегал в поисковик мучался искал как свернуть / развернуть дерево значений программно, безрезультатно. В итоге в который раз убедился, что Отладчик + Синтаксис-помощник рулят. Результаты моих поисков:

//Свернуть все выделенные строки дерева
Для каждого Строка Из ЭлеменетыФормы.ТабличноеПоле.ВыделенныеСтроки Цикл
ЭлементыФормы.ДеревоЗначений.Развернуть(Строка);
КонецЦикла;

//Развернуть все строки дерева
Для каждого Строка Из ЭлеменетыФормы.ДеревоЗначений.Значение.Строки Цикл
ЭлементыФормы.ДеревоЗначений.Свернуть(Строка);
КонецЦикла;

(2)
пути в синтакс помошнике:

для 8.1: Интерфейсные объекты \ Элементы управления \ Табличное поле \ ТабличноеПоле \ Методы
для 8.2: Интерфейс (обычный) \ Элементы управления \ Табличное поле \ ТабличноеПоле \ Методы

(3)
ну еще есть аналогичный путь для управляемых форм:
для 8.2: Интерфейс (управляемый) \ Таблица формы \ ТаблицаФормы \ Методы

ЗЫ:
еще один полезный метод из той же серии:

ТаблицаФормы (FormTable)
Развернут (Expanded)
Синтаксис:

Тип: Произвольный.
Идентификатор строки таблицы.
Возвращаемое значение:

Определяет, развернут ли узел дерева в указанной строке.

Тонкий клиент, веб-клиент, толстый клиент.

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

З.Ы. Спасибо что дополнил пост.

НачальноеОтображениеДерева не сработало.

УФ дерево Развернуть

УФ дерево Свернуть

Предлагаю как-то развивать тему еще XD

У меня СтандартныеПодсистемыКлиент.РазвернутьУзлыДерева(ЭтаФорма, «ДеревоКлиенты») вызывает ошибку.

Вот так работает если деревьев много на форме.
&НаКлиенте
Процедура СвернутьРазвернутьДерево(Дерево,имяДерева, Знач Развернуть)

Для Каждого ЭлементКоллекции Из Дерево Цикл
ВложенныеЭлементыКоллекции = ЭлементКоллекции.ПолучитьЭлементы();
Если ВложенныеЭлементыКоллекции.Количество() > 0 Тогда
СвернутьРазвернутьДерево(ВложенныеЭлементыКоллекции, имяДерева,Развернуть);

Если Развернуть = Истина Тогда
Элементы[имяДерева].Развернуть(ЭлементКоллекции.ПолучитьИдентификатор());
Иначе
Элементы[имяДерева].Свернуть(ЭлементКоллекции.ПолучитьИдентификатор());
КонецЕсли;
КонецЕсли;
КонецЦикла;

. Укажем дерево (реквизит формы и его имя.
Дерево = ДеревоМое1;
имяДерева = «ДеревоМое1»;

Источник

Управляемая форма 1С 8.2(8.3) – работа с деревом значений и таблицей значений. Часть II (Реализация DRAG and DROP)

Эта статья является продолжением статьи «Управляемая форма 1С 8.2(8.3) – Работа с деревом значений и таблицей значений. Часть I (Основы)», она будет посвящена реализации механизма Drag and Drop (или, проще говоря, “Перетаскивания”) для ДереваЗначений, расположенного на управляемой форме управляемого приложения 1С 8.2

Основная сложность реализации механизма перетаскивания заключается в том, что у строки ДереваЗначений платформа не позволяет просто изменить родителя, т.е. переподчинить строку. Единственный способ это сделать – создать новую строку вместе со всеми подчиненными строками, т.е. полностью скопировать всю ветку дерева вместе со всей иерархией и подчинить ее требуемой строке-родителю, после чего удалить исходную ветку. Данная задача распадается на две подзадачи:
1). Перед перетаскиванием необходимо проверить корректность данной операции, узел дерева нельзя переносить в узлы, подчиненные ему самому, т.е. родительский узел нельзя переносить в дочерние, т.к. это приведет к “бесконечной рекурсии” и “падению” платформы. Это реализуется с помощью обработчика события ЭлементДеревоПроверкаПеретаскивания(…)
2). Если перетаскивание возможно, то при помощи обработчика ЭлементДеревоПеретаскивание(…) запускается рекурсивная функция, которая создает новую ветку дерева, подчиненную требуемому родителю, а исходную удаляет.

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

Источник

Программирование в 1С для всех

Дерево значений 1С – это универсальная коллекция значений, в которой данные можно расположить в иерархическом порядке в виде дерева. По сути, дерево значений в 1С 8.3 — это таблица значений, где у строк могут быть подчиненные строки. Одна строка дерева значений может иметь несколько подчиненных строк, но в тоже время она может иметь только одну строку, которой подчинена, строку-родителя, или не иметь родителя вообще. Строка без родителя – это строка верхнего уровня, или первая строка.

В программном модуле дерево значений создается при помощи конструктора Новый.

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

То есть, такой код, при выполнении на тонком клиенте, работать не будет:

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

Колонки дерева значений 1С

Само по себе дерево значений не имеет смысла, для того, чтобы можно было с ним работать у этого дерева нужно создать колонки. Для этого, нужно использовать свойство дерева значений Колонки, которое имеет тип КоллекцияКолонокДереваЗначений, у объекта данного типа имеется ряд методов, с которыми вы можете познакомиться в синтакс-помощнике, а нас конкретно интересует метод Добавить. Этот метод добавляет новые колонки в дерево значений. Он имеет следующий синтаксис:

Где Имя – это имя колонки (уникальное в рамках этого дерева); Тип – в этом параметре описывают возможные типы колонки, делается при помощи объекта ОписаниеТипов; Заголовок – название колонки и Ширина — ширина колонки в символах.

Например, добавим нашему дереву регионов три колонки:

Мы добавили три колонки, две из которых имеют тип строка, а одна имеет тип число.

Строки дерева значений 1С

Строки дерева значений 1С бывают двух видов. Это строки верхнего (или первого) уровня. Те строки, у которых нет ни каких родителей, и которые ни кому не подчинены. И подчиненные строки – это строки более низких уровней. У подчиненных строк заполнено свойство Родитель, в котором указывается родительская строка, т.е. та строка, которой подчинена эта текущая строка (у строк верхнего уровня свойство Родитель пустое). Для того, чтобы создать строку верхнего (или первого) уровня, нужно воспользоваться свойством Строки дерева значений. Это свойство имеет тип КоллекцияСтрокДереваЗначений. И у объекта этого типа есть метод Добавить, который создает новую строку верхнего (первого) уровня. Причем, этот метод является функцией, которая возвращает строку дерева значений. А у этой строки мы, как к свойствам, можем обращаться к колонкам дерева значений.

В этом коде добавлено две строки верхнего уровня дерева регионов.

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

Например, так мы создаем две строки второго уровня:

А так, мы создаем строки третьего уровня (две для Удмуртии и одну для Татарстана):

Обход дерева значений 1С

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

Поскольку свойство Строки дерева значений является коллекцией, то к ней применим цикл Для Каждого Цикл. Где в значении очередного элемента коллекции находится строка верхнего уровня (первого) дерева значений, у этой строки можно обращаться к колонкам как к свойствам.

Если нам нужно обойти строку следующего уровня, то в этот раз следует уже циклом Для каждого Цикл обходить свойство Строки текущей строки дерева значений.

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

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

Теперь нам достаточно эту процедуру вызвать в том месте, где мы создаем и заполняем дерево.

1

Ну и для того, чтобы наш список выглядел более наглядно, будем при выводе строк второго и третьего уровня добавлять тире. Для этого создадим функцию, которая добавляет тире, количество которых зависит от уровня вложенности. А узнать уровень вложенности строки можно при помощи метода строки дерева значений Уровень(), который возвращает уровень вложенности строки начиная с 0.

2

Дерево значений 1С на управляемой форме

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

3

Само по себе такое дерево бессмысленно. Нужно добавить ему колонки. Если мы хотим дереву значений на форме добавить колонку, то необходимо сначала выделить дерево на форме, а потом нажать на кнопку «Добавить колонку реквизита».

4

Можно создать колонки с различными типами, и поместить дерево на форму в виде таблицы.

5

В моей учебной конфигурации имеется справочник Регионы, который является иерархическим (иерархия элементов).

6

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

Заполнить это дерево можно несколькими способами. В первом способе, мы в рекурсивной процедуре обходим выборку из запроса, и если у этой выборки имеется выборка вложенных записей, то вызываем эту же процедуру.

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

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

7

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

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

8

Статьи о других универсальных коллекциях значений в 1С

Более подробно о работе с другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»

1C %D0%B2 %D0%B6%D0%B5%D0%BB%D1%82%D0%BE%D0%BC %D1%86%D0%B2%D0%B5%D1%82%D0%B5 3D

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

1 %D0%B2 %D0%B6%D0%B5%D0%BB%D1%82%D0%BE%D0%BC %D1%86%D0%B2%D0%B5%D1%82%D0%B5 3D %D0%BC%D0%B0%D0%BB%D0%B5%D0%BD%D1%8C%D0%BA%D0%B0%D1%8F

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Промо-код на скидку в 15% — 48PVXHeYu


Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:

Источник

Работаем с деревом значений программно

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

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

Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.

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

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

Создание дерева значений

Как и большинство объектов встроенного языка, новая дерево значений может быть создано с помощью оператора Новый :

Свойства и методы дерева значений

Имя Тип Описание
Свойства
Колонки КоллекцияКолонокДереваЗначений содержит коллекцию колонок дерева значений
Строки КоллекцияСтрокДереваЗначений содержит коллекцию корневых строк дерева значений
Методы
ВыбратьСтроку() СтрокаДереваЗначений открывает диалог для интерактивного выбора строки дерева значений
Скопировать() ДеревоЗначений создает новый объект копированием текущего (копируются все колонки и строки)

Колонки дерева значений

Прежде чем начать работу с деревом значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:

Имя Тип Описание
Имя Строка символьный идентификатор колонки, по которому к ней можно обращаться из кода. Может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания
Заголовок Строка строковое представление колонки на форме. Может содержать произвольные символы
ТипЗначения ОписаниеТипов тип значения содержимого ячеек в этой колонке. Свойство ограничивает пространство доступных значений, которые можно указать в данной колонке
Ширина Число ширина колонки на форме (выражается в количестве символов)

Для того, чтобы определить наличие колонки с нужным именем используется метод Колонки.Найти():

Перебор колонок выполняется следующим образом:

Для удаления колонки используется метод Колонки.Удалить():

Методы коллекции колонок дерева значений

Вставить() Вставляет новую колонку в указанную позицию коллекции
Добавить() Добавляет новую колонку в конец коллекции
Индекс() Возвращает индекс колонки в коллекции колонок
Получить() Возвращает колонку по ее индексу
Количество() Возвращает количество колонок в коллекции
Найти() Ищет колонку в коллекции по имени
Очистить() Удаляет все колонки из коллекции
Сдвинуть() Сдвигает колонку влево или вправо
Удалить() Удаляет колонку из коллекции

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

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

Имя Тип Описание
Свойства
Родитель СтрокаДереваЗначений ссылается на строку верхнего уровня. Для корневой строки имеет значение Неопределено
Строки КоллекцияСтрокДереваЗначений содержит коллекцию подчиненных строк
Методы
Владелец() ДеревоЗначений возвращает ссылку на дерево значений, которому принадлежит строка
Уровень() Число возвращает уровень вложенности строки в иерархии дерева. Для строки, не имеющей родителя, уровень будет равен 0 (верхний уровень или корневой уровень). Подчиненная ей строка будет иметь уровень 1 и т.д.

Добавление и удаление строк

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

Для удаления строки используется метод Строки.Удалить(). Строку можно удалить передав методу либо саму строку, либо ее индекс:

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

Поиск строк

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

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

Все методы коллекции строк дерева значений:

Вставить() Вставляет строку на указанное место коллекции строк
ВыгрузитьКолонку() Выгружает значения ячеек указанной колонки из текущей коллекции строк в массив значений
Добавить() Добавляет новую строку в коллекцию строк
ЗагрузитьКолонку() Загружает значения из массива в ячейки указанной колонки коллекции строк
Индекс() Возвращает индекс строки дерева значений в коллекции
Итог() Возвращает просуммированный итог по колонке дерева значений
Количество() Возвращает количество строк в коллекции строк
Найти() Выполняет поиск строки по значению
НайтиСтроки() Выполняет поиск строк по указанным параметрам
Очистить() Удаляет все строки из текущей коллекции строк
Получить() Возвращает строку по ее индексу
Сдвинуть() Сдвигает строку вверх или вниз по коллекции строк
Сортировать() Выполняет сортировку строк в коллекции по указанным колонкам
Удалить() Удаляет строку из коллекции строк

Иерархию свойств и типов значений, связанных с деревом значений, схематически можно представить в виде дерева:

Источник

Восстановление развернутых строк ДереваЗначений после его обновления (управляемая форма)

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • 1с радиокнопка на обычной форме
  • 1с работа со списком значений на форме