1с события дерева значений

Вопрос по дереву значений

В событии ПриИзменении() для дерева значений программно меняю значение в одном из полей. И после этого все узлы ДЗ сворачиваются автоматически.

Подскажите, как избежать этого сворачивания ДЗ?

Вот код:
ДеревоОбъект = РеквизитФормыВЗначение(«ДеревоПК», Тип(«ДеревоЗначений»));

ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить(«Позиция», вхПозиция);
ПараметрыОтбора.Вставить(«Наименование», вхНаименование);
СтрокиДерева = ДеревоОбъект.Строки.НайтиСтроки(ПараметрыОтбора, Истина);
Если СтрокиДерева.Количество() > 0 Тогда
СтрокиДерева[0][вхПараметрИмя] = вхЗначение;
КонецЕсли;

Как тогда запомнить состояние (развёрнут/свёрнут) по каждому из узлов, чтобы потом при «заново рисуется» восстановить положение? И каким событием перехватить перерисовку?

Или как можно отказаться от перерисовки дерева?

(0) перебирай ЭлементФормы.ДеревоПК через ПолучитьЭлементы(), а не через преобразование в тип ДеревоЗначений.
При обратном преобразовании дерево заново перестроится с параметрами установленными при настройки элемента формы (НачальноеОтображениеДерева — Раскрывать все уровни — дерево будет развёрнутым).

(2) не преобразовывать, а перебирать
стр=ЭлементыФормы.ДеревоПК.ТекущиеДанные; — текущая ветка
УровеньВниз=стр.ПолучитьЭлементы();
УровеньВверх=стр.ПолучитьРодителя();

(4) У меня вся обработка на сервере ведётся.
Получается, мне надо на выходе этой обработки получать нужное значение и в ТекущиеДанные по имени колонки это значение подставлять? В таком случае дерево не будет перерисовываться?

НайтиПоИдентификатору(). Наверное, Вы это имели ввиду? И опять же, как это отразится на перерисовке дерева?

(10) Сделал как в (3)
Флаг = Ложь;
ВсеСтроки = ДеревоПК.ПолучитьЭлементы();
Для Каждого Строка Из ВсеСтроки Цикл
Если Строка.Позиция = вхПозиция И Строка.Наименование = вхНаименование Тогда
Строка[вхПараметрИмя] = вхЗначение;
Прервать;
Иначе
ВсеПодстроки = Строка.ПолучитьЭлементы();
Для Каждого Подстрока Из ВсеПодстроки Цикл
Если Подстрока.Позиция = вхПозиция И Подстрока.Наименование = вхНаименование Тогда
Подстрока[вхПараметрИмя] = вхЗначение;
Флаг = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Флаг Тогда
Прервать;
КонецЕсли;
КонецЦикла;

Наверное, не очень красиво получилось. Но зато работает. Потом ещё причещу.

ТекДанные = ДеревоПК.НайтиПоИдентификатору(вхИД);
ТекДанные[вхПараметрИмя] = вхЗначение;

Источник

Использование событий Перед разворачиванием и Перед сворачиванием табличного поля

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

Читайте также:  Изготовление порталов из дерева

  • Строка — строка табличного поля.
  • Отказ — значение типа Булево . Признак отказа от стандартной обработки события. Если данный параметр имеет значение Истина , то разворачивание или сворачивание узла дерева производиться не будет.

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

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

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

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

Источник

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

В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.

Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».

Дерево значений

Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.

Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».

Дерево значений на форме

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

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

Заполнение дерева значений

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

Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.

Небольшой пример программного заполнения таблицы значений для управляемых форм:

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

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

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

Сворачивается и разворачивается дерево значений очень просто.

Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).

Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.

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

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

Точно также можно очистить от подчиненных элементов другую другую строку.

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

Запрос и дерево значений

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

Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:

Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.

Дерево значений в таблицу значений и обратно

Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.

Отбор в дереве значений

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

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

Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.

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

Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.

На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

УжасноПлохоНеплохоХорошо Отлично(оценок: 36, средняя оценка: 4,64 из 5)

Источник

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