- Как развернуть (свернуть) строки дерева значений?
- Дерево значений на управляемых формах
- Дерево значений на обычных формах
- Развернуть дерево значений 1с обычные формы
- Программно развернуть дерево значений в табличном поле на обычных формах
- Работа с деревом значений в 1С
- Дерево значений
- Дерево значений на форме
- Заполнение дерева значений
- Обход дерева значений
- Как свернуть и развернуть дерево значений
- Как удалить строку и очистить дерево значений
- Запрос и дерево значений
- Дерево значений в таблицу значений и обратно
- Отбор в дереве значений
Как развернуть (свернуть) строки дерева значений?
Иерархические данные, размещаемые в табличном поле на обычных формах или в таблице формы на управляемых формах, могут иметь множество строк и уровней вложенности. Порой бывает очень неудобно сворачивать и разворачивать строки дерева значений вручную. К счастью, встроенный язык располагает методами манипулирования такими объектами
По умолчанию, при помещении на форму табличного поля или таблицы формы, связанных с деревом значений, оно показывается в свернутом виде. Если нужно, чтобы при открытии формы дерево значений показывалось в раскрытом виде, проще всего воспользоваться свойством НачальноеОтображениеДерева таблицы (табличного поля). Оно может принимать одно из следующих значений:
НеРаскрывать (NoExpand) | отображать строки дерева в свернутом виде (по умолчанию) |
РаскрыватьВерхнийУровень (ExpandTopLevel) | отображать развернутыми строки дерева значений первого уровня |
РаскрыватьВсеУровни (ExpandAllLevels) | отображать развернутыми все строки дерева значений |
Внимание! Программная установка свойства НачальноеОтображениеДерева на клиенте в режиме управляемого приложения неизбежно ведет к вызову сервера
Теперь рассмотрим варианты программного сворачивания\разворачивания строк дерева значений. Реализация этих методов может отличаться для обычных и управляемых форм.
Дерево значений на управляемых формах
Пример для сворачивания всех строк дерева значений:
//получаем подчиненные элементы ДанныеФормыДерево СтрокиДерева = ДеревоДокументов.ПолучитьЭлементы(); Для каждого СтрокаДерева Из СтрокиДерева Цикл //получаем идентификатор строки в таблице формы СтрокаДереваИД = СтрокаДерева.ПолучитьИдентификатор(); //проверяем состояние строки Если Элементы.ДеревоДокументов.Развернут(СтрокаДереваИД) = Истина Тогда //сворачиваем строку дерева Элементы.ДеревоДокументов.Свернуть(СтрокаДереваИД); КонецЕсли; КонецЦикла;
Пример для разворачивания всех строк дерева значений верхнего уровня:
//получаем подчиненные элементы ДанныеФормыДерево СтрокиДерева = ДеревоДокументов.ПолучитьЭлементы(); Для каждого СтрокаДерева Из СтрокиДерева Цикл //получаем идентификатор строки в таблице формы СтрокаДереваИД = СтрокаДерева.ПолучитьИдентификатор(); //проверяем состояние строки Если Элементы.ДеревоДокументов.Развернут(СтрокаДереваИД) = Ложь Тогда //разворачиваем строку дерева Элементы.ДеревоДокументов.Развернуть(СтрокаДереваИД); КонецЕсли; КонецЦикла;
Если нужно сворачивать и разворачивать вложенные строки, потребуется доработать данный код, добавив рекурсию
Дерево значений на обычных формах
С обычными формами дела обстоят проще: обращение к серверу для обычных форм не так критично, как для управляемых, поэтому раскрыть все строки дерева можно так:
ЭлементыФормы.ДеревоДокументов.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;
Но в большинстве случаев лучше использовать следующий код, который гарантированно работает
//свернуть строки верхнего уровня Для каждого ПодчиненнаяСтрока Из ДеревоДокументов.Строки Цикл Если ЭлементыФормы.ДеревоДокументов.Развернут(ПодчиненнаяСтрока) Тогда ЭлементыФормы.ДеревоДокументов.Свернуть(ПодчиненнаяСтрока); КонецЕсли; КонецЦикла; //развернуть строки верхнего уровня Для каждого ПодчиненнаяСтрока Из ДеревоДокументов.Строки Цикл Если ЭлементыФормы.ДеревоДокументов.Развернут(ПодчиненнаяСтрока) = Ложь Тогда ЭлементыФормы.ДеревоДокументов.Развернуть(ПодчиненнаяСтрока); КонецЕсли; КонецЦикла;
Источник
Развернуть дерево значений 1с обычные формы
А вот мнения самого дерева никогда никто не спрашивает =(
Согласно ли оно на это? Не находится ли оно под принуждением?
ОФ, УПП, внешний отчёт, на форме есть табличное поле «КодыМаркировкиОстатков», тип значения «ДеревоЗначений».
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.КодыМаркировкиОстатков;
Попытка
ОбъектShell = Новый COMОбъект(«Wscript.Shell»);
ОбъектShell.SendKeys(«^+» + Символ(107)); // Символ(107) — «-» на нумпад
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Код отрабатывает, текущий элемент действительно становится ТабличноеПоле, но не разворачивается и не сворачивается. С клавиатуры это работает, причём именно тогда, когда курсор стоит на табличном поле.
А что
ТаблицаФормы (FormTable)
Развернуть (Expand)
Синтаксис:
Развернуть(, )
Параметры:
(обязательный)
Тип: Произвольный.
Идентификатор строки таблицы.
(необязательный)
Тип: Булево.
Определяет необходимость раскрытия подчиненных узлов. Истина — раскрывать подчиненные узлы, Ложь — не раскрывать подчиненные узлы.
Значение по умолчанию: Ложь.
Описание:
Разворачивает узел в указанной строке дерева.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
Примечание:
Если таблица не отображается на форме, если в таблице нет строк или передана строка, отсутствующая в таблице, то будет сгенерировано исключение.
Использование в версии:
Доступен, начиная с версии 8.2.
Описание изменено в версии 8.3.18.
Методическая информация
// Изменяет свернутость всех строк табличного поля дерева значений.
//
// Параметры:
// Дерево – ТабличноеПоле – связанное с деревом значений и включенным режимом «Дерево»;
// Свернуть – Булево, *Истина — новое значение свернутости.
//
Процедура ДеревоЗначенийСвернутьРазвернутьЛкс(Дерево, Свернуть = Ложь, Строки = Неопределено, СПодчиненными = Истина) Экспорт
Если Строки = Неопределено Тогда
Строки = Дерево.Значение.Строки;
КонецЕсли;
Для Каждого СтрокаДерева Из Строки Цикл
Если Истина
И Свернуть
И Дерево.Развернут(СтрокаДерева)
Тогда
Дерево.Свернуть(СтрокаДерева);
ИначеЕсли Истина
И Не Свернуть
И Не Дерево.Развернут(СтрокаДерева)
Тогда
Дерево.Развернуть(СтрокаДерева, СПодчиненными);
КонецЕсли;
КонецЦикла;
(7) Там правда только верхний по умолчанию обрабатывается. Но быть может автор и сам дописать немного кода сможет.
Источник
Программно развернуть дерево значений в табличном поле на обычных формах
А вот мнения самого дерева никогда никто не спрашивает =(
Согласно ли оно на это? Не находится ли оно под принуждением?
ОФ, УПП, внешний отчёт, на форме есть табличное поле «КодыМаркировкиОстатков», тип значения «ДеревоЗначений».
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.КодыМаркировкиОстатков;
Попытка
ОбъектShell = Новый COMОбъект(«Wscript.Shell»);
ОбъектShell.SendKeys(«^+» + Символ(107)); // Символ(107) — «-» на нумпад
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Код отрабатывает, текущий элемент действительно становится ТабличноеПоле, но не разворачивается и не сворачивается. С клавиатуры это работает, причём именно тогда, когда курсор стоит на табличном поле.
А что
ТаблицаФормы (FormTable)
Развернуть (Expand)
Синтаксис:
Развернуть(, )
Параметры:
(обязательный)
Тип: Произвольный.
Идентификатор строки таблицы.
(необязательный)
Тип: Булево.
Определяет необходимость раскрытия подчиненных узлов. Истина — раскрывать подчиненные узлы, Ложь — не раскрывать подчиненные узлы.
Значение по умолчанию: Ложь.
Описание:
Разворачивает узел в указанной строке дерева.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
Примечание:
Если таблица не отображается на форме, если в таблице нет строк или передана строка, отсутствующая в таблице, то будет сгенерировано исключение.
Использование в версии:
Доступен, начиная с версии 8.2.
Описание изменено в версии 8.3.18.
Методическая информация
// Изменяет свернутость всех строк табличного поля дерева значений.
//
// Параметры:
// Дерево – ТабличноеПоле – связанное с деревом значений и включенным режимом «Дерево»;
// Свернуть – Булево, *Истина — новое значение свернутости.
//
Процедура ДеревоЗначенийСвернутьРазвернутьЛкс(Дерево, Свернуть = Ложь, Строки = Неопределено, СПодчиненными = Истина) Экспорт
Если Строки = Неопределено Тогда
Строки = Дерево.Значение.Строки;
КонецЕсли;
Для Каждого СтрокаДерева Из Строки Цикл
Если Истина
И Свернуть
И Дерево.Развернут(СтрокаДерева)
Тогда
Дерево.Свернуть(СтрокаДерева);
ИначеЕсли Истина
И Не Свернуть
И Не Дерево.Развернут(СтрокаДерева)
Тогда
Дерево.Развернуть(СтрокаДерева, СПодчиненными);
КонецЕсли;
КонецЦикла;
(7) Там правда только верхний по умолчанию обрабатывается. Но быть может автор и сам дописать немного кода сможет.
Источник
Работа с деревом значений в 1С
В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.
Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».
Дерево значений
Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.
Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».
Дерево значений на форме
Визуальное представление дерева значений обеспечивает элемент «Табличное поле».
Заполнение дерева значений
При заполнении дерева значений нужно помнить, что сам объект «ДеревоЗначений» и все его строки имеют свойство «Строки»и добавление новых строк на любом уровне дерева осуществляется через это свойство.
Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.
Небольшой пример программного заполнения таблицы значений для управляемых форм:
Обход дерева значений
Обход всех строк дерева значений делается при помощи рекурсии, вот так будет выглядеть код для обхода дерева созданного в примере выше:
Как свернуть и развернуть дерево значений
Сворачивается и разворачивается дерево значений очень просто.
Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).
Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.
Как удалить строку и очистить дерево значений
Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.
Точно также можно очистить от подчиненных элементов другую другую строку.
Удалить строку дерева значений не сложнее — нужно только знать ее индекс:
Запрос и дерево значений
Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».
Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:
Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.
Дерево значений в таблицу значений и обратно
Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.
Отбор в дереве значений
Стандартного отбора в дереве значений не предусмотрено. Так получилось потому, что непонятно как разрешать ситуацию, когда родительский элемент не удовлетворяет условию отбора, а подчиненные ему элементы удовлетворяют.
Таким образом, если Вам нужно реализовать отбор в дереве значений, то начать нужно с решения именно этой проблемы. А уже после этого можно придумать несколько способов реализовать задуманное.
Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.
Второй способ — перебор всех строк дерева значений. Описывать здесь особенно нечего, нужно просто взять обход дерева значений, проверять каждую строку на соответствие условию отбора и удалять лишние строки.
Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.
На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 36, средняя оценка: 4,64 из 5)
Источник