Программно свернуть/развернуть узел динамического списка (с основной таблицей). Жирная точка над всеми "i".

08.10.21

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

Какой пользователь не мечтал поменьше тыркать кнопкой? Особенно в малюсенькие +/- в "древесных" динамических списках. Если вас тоже озадачили, чтобы, при выборе узла дерева сами развернулись все его вложенные элементы , а при выборе другого узла - так же автоматом свернулась ранее развернутая ветка (причем эти узлы могут находится в разных "отношениях" друг с другом)... То вам - сюда.

(NB: еще раз - речь про дин.  список с основной таблицей!)

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

Например, приходится методы Развернуть/Свернуть выносить в отдельные процедуры, которые подключаются через ПодключитьОбработчикОжидания. Непосредственное выполнение их в обработчике события активизации строки приводит к "барабашкам" (отлов которых отнял немало времени и нервов; описывать не буду - кто хочет, экспериментируйте!). 

А вот, собственно, задача и код:

1. Дело происходит в конфигурации Документооборот КОРП, в форме списка внутренних документов. Здесь есть дин. список с именем "Папки", с основной таблицей Справочник.ПапкиВнутреннихДокументов, в виде дерева. При выборе папки должно раскрыться ее содержимое; при выборе другой папки - если она не является "дочерней" - ранее выбранная должна свернуться. Уровней иерархии может быть много; понятно, что свернуть надо все (но так, чтобы выбранная не "закрылась").

2. Для этого дин. списка уже есть обработчик ПапкиПриАктивизацииСтроки:


&НаКлиенте
Процедура ПапкиПриАктивизацииСтроки(Элемент)
	
	Если ВидПросмотра = ПредопределенноеЗначение("Перечисление.ВидыПросмотраСпискаОбъектов.ПоПапкам")
		И Элементы.СтраницаПапки.Видимость 
		И ТекущаяПапка <> Элементы.Папки.ТекущаяСтрока Тогда 
		
		ТекущаяПапка = Элементы.Папки.ТекущаяСтрока;
		
		ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.2, Истина);
	КонецЕсли;
	
КонецПроцедуры

Здесь ТекущаяПапка - реквизит формы (а обработчик ОбработкаОжидания нам не интересен, на нашу задачу он не влияет).

В расширении я добавил два реквизита формы: ПапкаДляСворачивания  и ПапкаДляРазворачивания, а также два расширения - Перед и После - обработчика ПапкиПриАктивизацииСтроки:


#Область АвторазворачиваниеПапок

&НаКлиенте
Процедура jibПапкиПриАктивизацииСтрокиПеред(Элемент)
	
	// ТекущаяПапка - та папка, которая была выбрана РАНЕЕ; Элементы.Папки.ТекущаяСтрока - та папка, выбор которой вызвал событие
	Если ВидПросмотра = ПредопределенноеЗначение("Перечисление.ВидыПросмотраСпискаОбъектов.ПоПапкам")
		И Элементы.СтраницаПапки.Видимость 
		И НЕ Элементы.Папки.ТекущаяСтрока = ТекущаяПапка Тогда
		
		// проверка на случай, если выбранная папка принадлежит той, что уже развернута (т.е. ТекущаяПапка) - тогда ничего делать не надо
		Если ВыбранаПапкаДругойВетки(Элементы.Папки.ТекущаяСтрока, ТекущаяПапка) Тогда
			
			ПапкаДляСворачивания = ТекущаяПапка;
			ПодключитьОбработчикОжидания("СвернутьПапки", 0.1, Истина);
			
		КонецЕсли; 
		
	КонецЕсли; 
	
КонецПроцедуры

&НаКлиенте
Процедура jibПапкиПриАктивизацииСтрокиПосле(Элемент)
	
	Если ВидПросмотра = ПредопределенноеЗначение("Перечисление.ВидыПросмотраСпискаОбъектов.ПоПапкам")
		И Элементы.СтраницаПапки.Видимость Тогда 
		
		ПапкаДляРазворачивания = Элементы.Папки.ТекущаяСтрока;
		ПодключитьОбработчикОжидания("РазвернутьПапки", 0.1, Истина);
		
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервере
Функция ПолучитьРодителяПапки(ВыбраннаяПапка)
	
	Возврат ВыбраннаяПапка.Родитель;
	
КонецФункции

&НаКлиенте
Процедура РазвернутьПапки()
	
	Если НЕ Элементы.Папки.Развернут(ПапкаДляРазворачивания) Тогда
		
		Элементы.Папки.Развернуть(ПапкаДляРазворачивания);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СвернутьПапки()
	
	Если Элементы.Папки.Развернут(ПапкаДляСворачивания) Тогда
		
		Элементы.Папки.Свернуть(ПапкаДляСворачивания);
		
		// перебираем "предков" ранее развернутой папки: сворачиваем их; но если выбранная папка содержится каким-то из них - прерываем перебор
		РодительПапкиДляСворачивания = ПолучитьРодителяПапки(ПапкаДляСворачивания);
		Пока ЗначениеЗаполнено(РодительПапкиДляСворачивания) Цикл
			// проверка: если выбранная папка принадлежит той, что уже развернута - ничего делать не надо
			Если ВыбранаПапкаДругойВетки(ПапкаДляРазворачивания, РодительПапкиДляСворачивания) Тогда
				Если Элементы.Папки.Развернут(РодительПапкиДляСворачивания) Тогда
					Элементы.Папки.Свернуть(РодительПапкиДляСворачивания);
				КонецЕсли; 
				РодительПапкиДляСворачивания = ПолучитьРодителяПапки(РодительПапкиДляСворачивания);
			Иначе
				Прервать;
			КонецЕсли; 
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти 

В общем-то, комментарии, наверно, излишни. Пользуйтесь на здоровье!

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

См. также

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

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

2400 руб.

29.06.2020    18428    26    6    

40

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    13455    YA_418728146    7    

165

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

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3257    52    progmaster    8    

4

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

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

1 стартмани

05.07.2022    5161    kalyaka    6    

33

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

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

6000 руб.

18.01.2022    9830    1    2    

6

Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

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

12.11.2021    20016    acces969    97    

153

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

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

1500 руб.

06.10.2020    9899    6    7    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4691 08.10.21 12:20 Сейчас в теме
Может не надо? Пальцы не отвалятся, не мешки ведь тягают. Из-за этих "сделайтетакчтобынеперетрудиться" не хватает времени на более важные проблемы.
slknnk; DrAku1a; IgorS; kser87; +4 Ответить
2. kser87 2463 08.10.21 12:59 Сейчас в теме
(1) собственно для этого и выложили готовое решение. Думайте над важными проблемами, а эту хотюлечьку за вас уже решили
frkbvfnjh; DrAku1a; Aleskey_K; +3 Ответить
4. e-9 60 08.10.21 14:31 Сейчас в теме
(1) если честно, к 40 годам я тоже стал очень напрягаться тыркать на экране в мелкие значки, типа +/- в дереве ) Прямо физически ощущаю напряжение в мышцах шеи))
DrAku1a; starik-2005; +2 Ответить
3. kser87 2463 08.10.21 13:01 Сейчас в теме
Вспомнил, как 7 лет назад решал эту задачку.
5. ixijixi 1904 11.10.21 09:19 Сейчас в теме
Немного оптимизации

&НаСервереБезКонтекста
Функция ВыбранаПапкаДругойВетки(ВыбраннаяПапка, ПредполагаемыйРодитель)
	
	Возврат ТипЗнч(ВыбраннаяПапка) = Тип("СправочникСсылка.ПапкиВнутреннихДокументов")
		И ТипЗнч(ПредполагаемыйРодитель) = Тип("СправочникСсылка.ПапкиВнутреннихДокументов")
		И НЕ ВыбраннаяПапка.ПринадлежитЭлементу(ПредполагаемыйРодитель);
	
КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьРодителяПапки(ВыбраннаяПапка)
	
	Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВыбраннаяПапка, "Родитель");
	
КонецФункции
Показать
DrAku1a; Yashazz; e-9; +3 Ответить
6. e-9 60 11.10.21 10:54 Сейчас в теме
(5)
ОбщегоНазначения.ЗначениеРеквизитаОбъекта
поленился, ибо справочник "легкий" (мало реквизитов, нет среди них "тяжелых").
А вот НаСервереБезКонтекста - да, очень. Форма "нагруженная".
7. obemgyorik 99 11.10.21 11:57 Сейчас в теме
(6) никогда не понимал аргумента про "лёгкий" справочник.
Сегодня - лёгкий, а если завтра вам туда реквизит с типом "ХранилищеЗначений" понадобится добавить, то будете переписывать весь код где он встречался?
8. e-9 60 11.10.21 14:23 Сейчас в теме
(7) да все верно - если в общем
Но в этом конкретном случае надо очень сильную фантазию иметь, чтобы предположить необходимость хотя бы в будущем добавить туда ХЗ.
9. e-9 60 12.10.21 15:37 Сейчас в теме
...Ну и еще небольшое, но важное уточнение функции ВыбранаПапкаДругойВетки - проверка на заполненность переданных параметров (иначе при выборе корня будет ошибочка):
Функция ВыбранаПапкаДругойВетки(ВыбраннаяПапка, ПредполагаемыйРодитель)
	
	Возврат ЗначениеЗаполнено(ВыбраннаяПапка)
		И ЗначениеЗаполнено(ПредполагаемыйРодитель)
		И ТипЗнч(ВыбраннаяПапка) = Тип("СправочникСсылка.ПапкиВнутреннихДокументов")
		И ТипЗнч(ПредполагаемыйРодитель) = Тип("СправочникСсылка.ПапкиВнутреннихДокументов")
		И НЕ ВыбраннаяПапка.ПринадлежитЭлементу(ПредполагаемыйРодитель);
	
КонецФункции
Показать


(Конечно, было бы красивее выкладывать сразу отлаженный вариант - но сколько таких хороших вещей не дожило до публикации из-за перфекционизма!)
10. user1587901 19.10.21 13:08 Сейчас в теме
Добрый день всем, подскажите пожалуйста можно ли эту функцию реализовать в справочнике номенклатура? если да, то подскажите как?
11. e-9 60 20.10.21 11:33 Сейчас в теме
(10) Конфа-то какая?) Если это УФ, и в форме (списка? выбора?) номенклатур имеет место быть динамический список в виде дерева с основной таблицей - то чуть изменить и взлетит.
12. user1587901 20.10.21 12:45 Сейчас в теме
(11) 1С УТ11 на скриншоте на правой стороне выделено красным где бы хотелось чтобы эта фишка работала.
Прикрепленные файлы:
13. e-9 60 20.10.21 16:53 Сейчас в теме
Оставьте свое сообщение