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

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 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    18083    25    6    

39

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

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

20.08.2024    11088    mrXoxot    43    

107

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

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

27.05.2024    5963    smielka    37    

97

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

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

27.12.2023    13295    809    elcoan    47    

113

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    11094    160    acces969    31    

121

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    4963    kalyaka    6    

33

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

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

6000 руб.

18.01.2022    9666    1    2    

6
Оставьте свое сообщение