Удобный выбор из таблицы/дерева в УФ


Выбор из таблицы значений или дерева значений в выпадающем списке рядом с полем ввода — УФ, быстро и просто!

Нажимали мы на "педальку" в поле ввода, и надо было нам выбрать значения…
Раньше у нас был метод "ВыбратьСтроку", открывавший модальное окно таблицы или дерева. В УФ ради этого приходилось делать отдельные формы, или сводить всё к выбору из списка.
С помощью нововведения последних релизов — "всплывающей" группы элементов — это можно эмулировать, и весьма неплохо.

Ранее у группы элементов было два поведения — обычное и свёртываемая. Теперь добавилось "всплывающая". Она может раскрываться, как и свёртываемая, по иконке или по гиперссылке; обязательно должна иметь непустой заголовок и установленный флаг "Отображать заголовок", по масштабированию не зависит от остальных объектов формы, и отображается как всплывающая мини-форма с крестиком закрытия; по возможности там, откуда вызвали (иногда, при вызове снизу экрана, выкручивается "вверх"). Одновременно может показываться только одна всплывающая группа. При переключении на родительскую форму исчезает. Свёртываемые формы внутри себя отрабатывает штатно. Всплывающие внутри всплывающих ведут себя как свёртываемые (а не как каскад). Можно использовать методы "Показать()" и "Скрыть()", см. СП в расширении групп формы, но они в нашем случае оставляют маленький, но раздражающий заголовочек, поэтому будем менять видимость.

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


&НаКлиенте
Процедура ПоказатьВсплывающуюГруппу()
// можно ещё Элементы.ВсплывающаяГруппа.Показать();
ЭтотОбъект.ТекущийЭлемент=Элементы.ДеревоВыбора;
КонецПроцедуры

&НаКлиенте
Процедура СкрытьВсплывающуюГруппу()
Если ЭтотОбъект.ТекущийЭлемент()<>Элементы.ДеревоВыбора и Элементы.ВсплывающаяГруппа.Видимость Тогда
Элементы.ВсплывающаяГруппа.Видимость=Истина;
КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура ДеревоВыбораПриАктивизацииСтроки(Элемент)
текдан=Элементы.ДеревоВыбора.ТекущиеДанные;
Если текдан=Неопределено Тогда Возврат КонецЕсли;
Если текдан.ПолучитьЭлементы().Количество()=0 Тогда
НекоеПоле=текдан.Поле1;
ЭтотОбъект.ТекущийЭлемент=Элементы.НекоеПоле;
Элементы.ВсплывающаяГруппа.Видимость=Ложь;
КонецЕсли;
КонецПроцедуры

На форме размещаем нужное поле, чьё событие "НачалоВыбора" перехватываем (при желании можно и другие события, например, просмотр по "лупе"); размещаем всплывающую группу (в качестве заголовка можно пробел, да-да), и на ней — наше дерево (или таблицу, или форматированный документ, или другую красивость). Дереву подключим событие активации строки, оно у нас обслуживает быстрый выбор и скрытие группы.

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

Тестировалось на 8.3.13.1690.

18 Comments

  1. Rustig

    (0) интересно, может пригодиться — сохранил в свою копилку алгоритмов….

    Reply
  2. Yashazz

    Фишка в том, что активация элемента, расположенного на «всплывающей» группе заставляет её принудительно всплыть. Остальное, в общем, примитив и баян.

    Reply
  3. azhilichev

    Только ЭтаФорма считается устаревшим свойством. Для управляемой формы актуальное — ЭтотОбъект.

    Reply
  4. Yashazz

    (3) Да. Привычка(((

    Reply
  5. aximo

    (1) что за система хранения?

    Reply
  6. Yashazz

    (5) Полагаю, некий справочник, такое рисуется за полчаса. У меня тоже есть. С нечётким поиском нужного.

    Reply
  7. Rustig

    (5) вот же, старая как мир обработка https://infostart.ru/public/89310/

    Reply
  8. Yashazz

    (7) Ну да, можно и её, многие юзают похожее, идея-то одинаковая)

    Reply
  9. dreamcreal

    (1) СПС, я не поняла сначала почему у Вас шаблоны слева….

    Reply
  10. K_A_O

    Неплохая идея.

    Но у группы же есть методы Показать() и Скрыть()

    Reply
  11. Yashazz

    (10) В моём 8.2.12.1685 оно объявлено в СП, но почему-то не работало…

    Reply
  12. Yashazz

    Публикация отредактирована согласно комментариям. Всем спасибо за дополнения!

    Reply
  13. AllexSoft

    Идея крутая, беру не вооружение.

    Reply
  14. s_vidyakin

    (8) откройте для себя notion.so

    Reply
  15. nagaitseff

    Баян..!

    Reply
  16. nagaitseff

    (15) возьму на вооружение себе тоже, спасибо

    Reply
  17. Yashazz

    (15) Ага) Я так и написал в (2), цитирую: «Остальное, в общем, примитив и баян». )))

    Reply
  18. fomix

    Попробовал сделать по аналогии. По правде сказать, вид стрёмный! Особенно в режиме запуска 1С в отдельных окнах. Да и практическое применение сомнительно…очередная интерфейсная плюшка!

    Reply

Добавить коментарий

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