Как скрыть "пустые группы" в списке выбора справочника при отборе

29.10.15

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

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

Стоит задача - открыть форму выбора справочника по определённой группе.

Вроде, всё просто, делаем отбор по иерархии:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ГруппаКонструктора = Параметры.ГруппаКонструктора;
ПроверочныйЭлемент = Параметры.ПроверочныйЭлемент;

// установить отбор в форме выбора по иерархии
ОтборПоГруппе = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
ОтборПоГруппе.ПравоеЗначение = ГруппаКонструктора;

 

В форме выбора в настройке списка видим требуемый отбор по группе "Огурцы":

 отбор по иерархии

 

Однако сам список справочника выглядит неожиданно:

Список справочника только с отбором

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

Есть решение от headMade в этой публикации //infostart.ru/public/311136/ .

Я нашёл другой вариант условного оформления. Ниже вторая половина процедуры "ПриСозданииНаСервере" формы выбора справочника:

// установить видимость только в выбранной группе
ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

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

Если ПроверочныйЭлемент.Пустая() Тогда
Элементы.Список.ТекущаяСтрока = ГруппаКонструктора;
Иначе
Элементы.Список.ТекущаяСтрока = ПроверочныйЭлемент;
КонецЕсли;

КонецПроцедуры

 

Данный код устанавливает параметр "Видимость" условного оформления динамического списка в значение "Нет" по следующему условию

Условие видимости групп справочника

Результат такого оформления ниже:

 Результат

Видна только нужная группа, её подгруппы и их элементы. Что, собственно, и хотелось увидеть.

 

Upd:

shurik_shurik предложил лучшее, более понятное решение (комментарий № 5):

 

    ГруппаКонструктора = Справочники.Номенклатура.НайтиПоКоду("00-00000001");
    
    ОтборПоГруппе = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
    ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
    ОтборПоГруппе.ПравоеЗначение = ГруппаКонструктора;

    ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
    
    ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Истина );
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать",Истина );
    
    ОтборПоГруппе = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
    ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
    ОтборПоГруппе.ПравоеЗначение = ГруппаКонструктора;
Кстати, удаление отбора по группе совершенно не изменяет работу кода! Получается, строки 2-5 лишние.

пустые группы форма выбора

См. также

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

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55303    17    23    

43

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

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63697    44    59    

82

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

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

2400 руб.

29.06.2020    19548    27    6    

42

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

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

1500 руб.

06.10.2020    10768    7    7    

11

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

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

20.08.2024    20816    mrXoxot    44    

128

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

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

27.05.2024    10303    smielka    37    

105

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

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

27.12.2023    17740    1223    elcoan    53    

125
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. rozer 312 29.10.15 10:20 Сейчас в теме
есть только один недостаток ИМХО, выражение "НЕ В ИЕРАРХИИ" очень сильно нагружают СУБД
linkki; shevelyov; +2 Ответить
2. shevelyov 89 29.10.15 10:50 Сейчас в теме
(1) rozer, согласен, мой отбор по оформлению происходит заметно долго даже на глаз, мне самому не очень нравится моё решение, но придумать что-либо проще не удалось. Может, кто поделится более удачным решением?
3. Paradise.87 29.10.15 13:31 Сейчас в теме
Топорный, но эффективный вариант: В реквизит группы или в РС записывать количество вложенных элементов (При записи номенклатуры или рег.заданием).
P.S. Но вроде и без реализации этой хотелки многие прекрасно живут.)
4. headMade 144 29.10.15 14:23 Сейчас в теме
shevelyov,
Главное отличие от того что есть в публикации http://infostart.ru/public/311136/ видно даже из постановки задачи: у вас "Когда требуется открыть список справочника с отбором, например,ПО ОПРЕДЕЛЕННО ГРУППЕ", а там "при открытии формы выбора накладываются определенные УСЛОВИЯ НА ЭЛЕМЕНТЫ СПРАВОЧНИКА". Т.е. вы сразу знаете какие группы д.б. видны, а там они определяется исходя из иерархии справочника и накладываемых условия отбора на элементы справочника.

Кроме того если вам надо показать огурцы, которые будут находиться в
-Группа "Овощи и фрукты"
-- Группа "Овощи"
--- Группа "Огурцы"
В вашем случаем пользователь будет видеть ТОЛЬКО группу "Огурцы", а там будет видна вся иерархиям полностью вплоть до группы "Огурцы".
shevelyov; +1 Ответить
5. shurik_shurik 04.11.15 23:52 Сейчас в теме
предложенный в этой статье вариант натолкнул меня на одну интересную мысль, решил проверить, вроде получилось:
        ГруппаКонструктора = Справочники.Номенклатура.НайтиПоКоду("00-00000001");
	
	ОтборПоГруппе = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
	ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
	ОтборПоГруппе.ПравоеЗначение = ГруппаКонструктора;

	ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Истина );
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать",Истина );
	
	ОтборПоГруппе = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
	ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
	ОтборПоГруппе.ПравоеЗначение = ГруппаКонструктора;
Показать

Что интересно, без второй строки с "Отображать" система вела себя не адекватно..
А вообще смысл в том, что всем выключить видимость, а после по отбору "ВИерархии" включить....
Вот только не пойму, есть ли прирост в скорости по сравнению с "НЕ в ИЕРАРХИИ"
alsegor; begemot; 4ed; shevelyov; +4 Ответить
6. shevelyov 89 05.11.15 10:11 Сейчас в теме
(5) shurik_shurik, Замерил производительность обоих вариантов. Ваш, если и быстрее, то на десятитысячную секунды. Зато понятнее и проще. Включил Ваш код в статью. Надеюсь, Вы не против? Да, оказалось, что отбор по группе (строки 2-5 Вашего кода) излишен!
15. Nehc 22 19.12.17 09:19 Сейчас в теме
(6) "Да, оказалось, что отбор по группе (строки 2-5 Вашего кода) излишен!"

Это только пока в справочнике элементов относительно не много!

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

Так что да, не зря ИТС не рекомендует, но... Не понятно почему все-таки нет нормального способа скрыть группы.
feikaa; shevelyov; +2 Ответить
22. Xershi 1557 27.11.18 23:59 Сейчас в теме
(15) потому что отбор в режиме иерархии работает только на элементы. Сними режим в список и получишь что хотел.
7. Chrizt 269 05.11.15 11:51 Сейчас в теме
А как быть с обычными формами?
8. shurik_shurik 05.11.15 13:00 Сейчас в теме
Вот Вам еще в копилку вариантов (правда он получается не совсем динамический, но эта проблема возникнет когда во время открытого списка, будут добавлять группы в корне справочнике или в группе выше от "ГруппаКонструктора"):
&НаСервере
Функция ПолучитьГруппыНеВИерархии(Группа)
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Номенклатура.Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	НЕ Номенклатура.Ссылка В ИЕРАРХИИ (&Группа)
	|	И Номенклатура.ЭтоГруппа";
	Запрос.УстановитьПараметр("Группа",Группа);
	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ГруппаКонструктора = Справочники.Номенклатура.НайтиПоКоду("00-00000001");
	
	ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	ОтборПоГруппе = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
	ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
	ОтборПоГруппе.ПравоеЗначение = ПолучитьГруппыНеВИерархии(ГруппаКонструктора);;
КонецПроцедуры
Показать

Скорость можете замерить. Я у себя визуально увидел реальную разницу в работе списка.
Даже если групп будет очень много, проще их хранить в памяти сервера и проверять, чем каждый раз дергать базу запросом "В ИЕРАРХИИ", который, кстати, тоже не может похвастаться быстродействием...
Вот с отбором в первых строках, тут нужно проверять более детально, в моем случае разницы с ним и без не заметил, для компактности убрал.
UPD Можно еще доработать на контроль уровня, поскольку если будет отбор не по корневой папке, тогда весь "этот разговор" разбивается об стенку....
request4t; CyberCerber; chizik05; shevelyov; +4 Ответить
9. scape 282 23.02.17 13:29 Сейчас в теме
В "такси" ведет себя не адекватно. Пропадает заголовок таблицы списка.
10. unknown181538 159 25.11.17 05:07 Сейчас в теме
(0) У меня очень сильно тормозило.
помогло следующее: т.к. элементы (не-группы) успешно скрываются отбором, то нужно в условия условного оформления добавить, условие, чтобы оно накладывалось только на группы.
ОтборПоГруппе = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
	ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии;
	ОтборПоГруппе.ПравоеЗначение = МассивГрупп;
	
	ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	УслГруппаИ = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	УслГруппаИ.Использование = Истина;
	УслГруппаИ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
	УслГруппаИ.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный; 
	
	УслЭтоГруппа = УслГруппаИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	УслЭтоГруппа.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	УслЭтоГруппа.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоГруппа");
	УслЭтоГруппа.ПравоеЗначение = Истина;
	
	УслОформГруппаНЕ = УслГруппаИ.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	УслОформГруппаНЕ.Использование = Истина;
	УслОформГруппаНЕ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе;
	УслОформГруппаНЕ.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный; 
	
	УслОформПоГруппе = УслОформГруппаНЕ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	УслОформПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
	УслОформПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии;
	УслОформПоГруппе.ПравоеЗначение = МассивГрупп;
Показать
shevelyov; +1 Ответить
11. AvalonE2008 101 04.12.17 14:07 Сейчас в теме
Большое спасибо за статью!
12. user649060 04.12.17 16:26 Сейчас в теме
ИТС: Условное оформление формы
"Не рекомендуется использовать условное оформление для скрытия в таблице строк целиком. Использование условного оформления для скрытия строк может негативно влиять на производительность и приводить к некорректному отображению содержимого таблицы."
13. shevelyov 89 04.12.17 22:06 Сейчас в теме
(12) Если есть лучшее и более простое решение - буду рад ознакомиться.
14. user649060 06.12.17 10:56 Сейчас в теме
(13) "лучшего и более простого решения" отбора групп в динамическом списке не существует.
Можно использовать РодительВерхнегоУровня таблицы формы.
Можно отказаться от иерархического отображения вообще.
Можно внутренними соединениями пошаманить.

Ну и вообще, при публикации таких статей стоит хотя бы упомянуть, что это велосипед, а не качественное решение. В первую очередь это нужно это для начинающих коллег, которые сразу могут этого самостоятельно не понять.
bushfish; PCcomCat; +2 1 Ответить
16. cruel 20.11.18 15:01 Сейчас в теме
Нашёл, как мне кажется "лучшее и более простое решение" вот тут: http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=560816
Добавил в динамический список группировку по полю "Родитель". Всё сразу заработало.
dammit666; Yan_Malyakov; Henistaromin; shevelyov; +4 Ответить
24. Henistaromin 16.08.19 10:02 Сейчас в теме
(16)
Добавил в динамический список группировку по полю "Родитель". Всё сразу заработало.

Единственное, что мне помогло. Быстро и просто, без лишнего кода. Спасибо!
17. skyboy13 14 27.11.18 18:39 Сейчас в теме
А это разве дает иерархию? Они идут списком, но по родителю.
Прикрепленные файлы:
18. shevelyov 89 27.11.18 22:05 Сейчас в теме
(17)

Если в группе "Диагностика анемий" в результате отбора будет пусто, Вы её всё равно будете видеть. В чём и проблема.
19. skyboy13 14 27.11.18 22:16 Сейчас в теме
Кстати нет, если пометить все позиции в группе на удаление, она исчезает !
Так же если фильтр в выборке наложить. Группы - Гематологии нет (там все элементы помечены на удаление)
Прикрепленные файлы:
20. skyboy13 14 27.11.18 22:22 Сейчас в теме
и кстати с деревом тоже получается
Прикрепленные файлы:
21. skyboy13 14 27.11.18 22:47 Сейчас в теме
Но здесь другая проблема, это кол-во уровней. Оно постоянно. И если уровень вложенности ниже максимального, то папка верхнего уровня получается пустой. А в данном примере 4.
То папка вложенности 2 в справочники, будет в данном варианте, как
<Пусто> - <Пусто> - <Имя1>-<Имя2>
23. titlimilitryambia 14.04.19 21:48 Сейчас в теме
В примере настраивается видимость группы верхнего уровня. А я пробовала на вложенной группе. Попробовала все варианты из статьи - не видно группы. Оказалось чтобы она стала видна нужно чтобы моя группа была текущей. Если на ней спозиционироваться, то она видна. Если нет - настройка видимости конкретно ее при отключенной видимости остальных не помогает. Это если режим просмотра иерархический список
dammit666; umni4ka; shevelyov; +3 Ответить
25. VOPOH 19.08.19 16:00 Сейчас в теме
Спасибо огромное братан:) я 4 часа сидел, замучался блин, а твой код моментально подошёл)
Оставьте свое сообщение