Здравствуй, дерево! Продолжение разбора особенностей поведения таблицы формы

12.08.24

Разработка - Работа с интерфейсом

Данная статья является логическим продолжением публикации https://infostart.ru/1c/articles/2156279/ по особенностям представления табличных частей на форме. Но на этот раз поговорим о реквизите типа Дерево и его представления на управляемой форме. Элементы дерева тоже можно обойти, как и элементы коллекции, но есть свои особенности

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

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

Итак, реквизит для отображения дерева имеет тип ДанныеФормыДерево и является коллекцией элементов типа ДанныеФормыЭлементДерева.

Рассмотрим общие черты и различия реквизиты типа ДанныеФормыДерево и реквизиты типа ДанныеФормыКоллекция.

 

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

 

Элемент формы Таблица, связанный с соответствующим типом.
 

ДанныеФормыДерево ДанныеФормыКоллекция
Идентификатор однозначно связывает со строкой реквизита - ЭлементКоллекции или ДанныеФормыЭлементДерева
Можно получить идентификатор текущей строки
Можно установить текущую строку по идентификатору
Можно получить/установить родителя элемента - свойство ТекущийРодитель (согласно документации допускается чтение и запись). Лично у меня на 8.3.23.2157 получить родителя таким образом не получилось, всегда возвращалось Неопределено  
Структуру дерева можно свернуть-развернуть Свернуть(Идентификатор) Развернуть(Идентификатор)  

 

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

Основные правила "навигации" по реквизиту формы Дерево типа ДанныеФормыДерево.

1. Получить элементы "корня" Дерево.ПолучитьЭлементы(). Метод ПолучитьРодителя() для любого элемента "корня" будет возвращать Неопределено 

2. Для произвольного элемента возможно:

2.1. Получить родителя = ПолучитьРодителя()

2.2. Получить дочерние элементы = ПолучитьЭлементы()

2.3. Получить "соседние" элементы того же уровня = ПолучитьРодителя().ПолучитьЭлементы()

3. Для получения списка родителей / родителя верхнего уровня следует рекурсивно получать родителей вышестоящего элемента. Как было сказано выше, для родителя самого верхнего уровня ПолучитьРодителя() возвращает Неопределено.

Как и в "прошлой серии" привожу код процедуры движение текущей строки вниз в пределах подчинения.

Опция Вокруг определяет действие при достижении последней строки. Если Истина, то текущей становится первая строка, если Ложь, то ничего не изменяется.

&НаКлиенте
Процедура Вниз(Команда)
	Идентификатор = Элементы.Дерево.ТекущаяСтрока; 
	
	Если Дерево.НайтиПоИдентификатору(Идентификатор).ПолучитьРодителя() = Неопределено Тогда
		ТекущийУровеньДерева = Дерево.ПолучитьЭлементы(); 
	Иначе
		ТекущийУровеньДерева = Дерево.НайтиПоИдентификатору(Идентификатор).ПолучитьРодителя().ПолучитьЭлементы(); 
		//Определяется получением дочерних элементов от родителя текущего элемента

	КонецЕсли;
		
	Индекс = ТекущийУровеньДерева.Индекс(Дерево.НайтиПоИдентификатору(Идентификатор));

	Если Индекс < ТекущийУровеньДерева.Количество()-1 Тогда
		НовыйИдентификатор = ТекущийУровеньДерева[Индекс+1].ПолучитьИдентификатор();
	Иначе
		
		Если Вокруг Тогда
			
			НовыйИдентификатор =ТекущийУровеньДерева[0].ПолучитьИдентификатор();
			
		Иначе
			
			НовыйИдентификатор = Идентификатор; // А можно проще - написать Возврат, ведь ничего делать не нужно
			
		КонецЕсли;
	КонецЕсли;
	
	
	Элементы.Дерево.ТекущаяСтрока = НовыйИдентификатор;
	
	
КонецПроцедуры


Разрабатывалось и тестировалось на 23-м релизе 8.3.23.2157. Поскольку "новые" методы здесь не используются, можно с уверенностью сказать, что обработка будет функционировать под любым релизом платформы на управляемых формах.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Работа с интерфейсом Анализ учета Мониторинг 1С v8.3 8.3.14 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Библиотека стандартных подсистем 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

28800 руб.

27.03.2025    48643    27    22    

39

Работа с интерфейсом Программист 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами (виджетами) в 1С.

5160 руб.

29.06.2020    22433    32    6    

50

Работа с интерфейсом Программист 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

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

5040 руб.

06.10.2020    12464    8    8    

14

Работа с интерфейсом Программист Стажер 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    41331    mrXoxot    44    

136

Работа с интерфейсом Программист 1С v8.3 Бесплатно (free)

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

27.05.2024    24296    smielka    38    

111

Работа с интерфейсом 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    22195    1315    elcoan    53    

128

Инструментарий разработчика Работа с интерфейсом Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    15845    178    acces969    31    

132
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. alex649 109 02.07.25 18:19 Сейчас в теме
Я так добавил вержний уровень, на клиенте у меня тоже не получилось
&НаКлиенте
Процедура ДобавитьВерхнийУровень(Команда)
	
	ДобавитьВерхнийУровеньНаСервере()
    
КонецПроцедуры

&НаСервере
Процедура ДобавитьВерхнийУровеньНаСервере()
   	мДеревоДанных = РеквизитФормыВЗначение("ДеревоДанных", Тип("ДеревоЗначений"));
	мДеревоДанных.Строки.Добавить();
	ЗначениеВДанныеФормы(мДеревоДанных, ДеревоДанных);
КонецПроцедуры
Показать
2. sinkawa 28.08.25 11:52 Сейчас в теме
Спасибо, быстро помогли решить 5-минутный затуп.
Но за
Для обоих коллекций
в вас бы учебником русского языка кинуть.
Коллекция - она, моя. Вспоминаем русский язык за 3 класс и получаем звучное "для обеих коллекций".
Для отправки сообщения требуется регистрация/авторизация