gifts2017

Как скрыть "пустые" группы справочника при открытии формы выбора? (только для УФ)

Опубликовал Анатолий Бритько (headMade) в раздел Программирование - Работа с интерфейсом

Довольно часто при открытии формы выбора накладываются определенные условия на элементы справочника, которые необходимо показать пользователю (наличие на остатке, отбор по значению реквизита и др). И если с выводом элементов справочника проблем не возникает, то группы выводятся все. В статье описан несложный способ как можно скрыть "пустые" группы справочника при открытии формы выбора.
 
 
 
 Форма выбора ДО  Форма выбора ПОСЛЕ
 (видны "пустые" группы справочника, хотя выводятся только элементы с типом "Услуга")  ("пустых" групп справочника не видно)
 
Для того чтобы получить вышеуказанный указанный результат необходимо:
1. Определяем элементы справочника, которые необходимо показать пользователю.
2. При открытии формы выбора устанавливаем отбор по элементам из п.п.1
3. Определяем ГРУППЫ СПРАВОЧНИКА, которые НЕ ЯВЛЯЮТСЯ РОДИТЕЛЕМ для элементов из п.п.1
4. При открытии формы через условное оформление убираем видимость групп справочника из п.п. 3

Самым "толстым" моментов в этой схеме является п.п.3 "Определяем ГРУППЫ СПРАВОЧНИКА, которые НЕ ЯВЛЯЮТСЯ РОДИТЕЛЕМ". Но для решения этой задачи был использован способ описанный ildarovich в статье Транзитивное замыкание запросом. После небольшой доработки ф-ии из этой статьи c легкостью можно получить группы справочника, которые не имеют никакого отношения к показываемым элементам справочника:
 
 
Функция ТранзитивноеЗамыкание(ИмяСправочника, МаксимальнаяДлинаПути, СписокИспользуемыхЭлементов) Экспорт
        Пролог = "ВЫБРАТЬ Родитель НачалоДуги, Ссылка КонецДуги ПОМЕСТИТЬ ЗамыканияДлины1 ИЗ Справочник.Номенклатура
        | ГДЕ Родитель <> Значение(Справочник.Номенклатура.ПустаяСсылка)
        | ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка, Ссылка ИЗ Справочник.Номенклатура;";
        
        Рефрен = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги, ВтораяДуга.КонецДуги ПОМЕСТИТЬ ЗамыканияДлины#2 ИЗ ЗамыканияДлины#1 КАК ПерваяДуга
        | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины#1 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги;
        | УНИЧТОЖИТЬ ЗамыканияДлины#1;";
        
        Эпилог = "ВЫБРАТЬ НачалоДуги Предок, КонецДуги Потомок ИЗ ЗамыканияДлины#2 ГДЕ НачалоДуги <> КонецДуги";
                
        Запрос = Новый Запрос(СтрЗаменить(Пролог, "Номенклатура", ИмяСправочника));
        
        МаксимальнаяДлинаЗамыканий = 1;
        
        Пока МаксимальнаяДлинаЗамыканий < МаксимальнаяДлинаПути Цикл
            Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(Рефрен, "#1", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0")), "#2", Формат(2 * МаксимальнаяДлинаЗамыканий, "ЧГ=0"));
            МаксимальнаяДлинаЗамыканий = 2 * МаксимальнаяДлинаЗамыканий;
        КонецЦикла;
        
        /// НАЧАЛО ВНЕСЕННЫХ МНОЮ ИЗМЕНЕНИЙ В Ф-ИЮ        КУЛЬМИНАЦИЯ
        
        //////Запрос.Текст = Запрос.Текст + СтрЗаменить(Эпилог, "#2", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0"));
        
        Кульминация = "ВЫБРАТЬ НачалоДуги Предок, КонецДуги Потомок ПОМЕСТИТЬ ЗамыканияДлины#2 ИЗ ЗамыканияДлины#1 ГДЕ НачалоДуги <> КонецДуги;
        |УНИЧТОЖИТЬ ЗамыканияДлины#1;
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ЗамыканияДлины#2.Предок
        |ПОМЕСТИТЬ СписокИспользуемыхГрупп
        |ИЗ
        |    ЗамыканияДлины#2 КАК ЗамыканияДлины#2
        |ГДЕ
        |    ЗамыканияДлины#2.Потомок В(&СписокИспользуемыхЭлементов)
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ЗамыканияДлины#2.Предок КАК Родитель
        |ИЗ
        |    ЗамыканияДлины#2 КАК ЗамыканияДлины#2
        |        ЛЕВОЕ СОЕДИНЕНИЕ СписокИспользуемыхГрупп КАК СписокИспользуемыхГрупп
        |        ПО ЗамыканияДлины#2.Предок = СписокИспользуемыхГрупп.Предок
        |ГДЕ
        |    СписокИспользуемыхГрупп.Предок ЕСТЬ NULL 
        |
        |СГРУППИРОВАТЬ ПО
        |    ЗамыканияДлины#2.Предок";
        
        
        Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(Кульминация, "#1", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0")), "#2", Формат(МаксимальнаяДлинаЗамыканий * 2, "ЧГ=0"));;
        Запрос.УстановитьПараметр("СписокИспользуемыхЭлементов",СписокИспользуемыхЭлементов);
        
        МассивНесипользуемыхГрупп = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Родитель");
        
        СписокНеиспользуемыхГрупп = Новый СписокЗначений;
        СписокНеиспользуемыхГрупп.ЗагрузитьЗначения(МассивНесипользуемыхГрупп);
        
        Возврат СписокНеиспользуемыхГрупп;
    КонецФункции
 Стоит отметить что приведенная функция работает достаточно шустро. Приведенная в статье функция не учитывает одну ситуацию - наличие в списке справочника ПУСТЫХ ГРУПП т.е. групп, у которых нет ни одного элемента. Но эту ситуацию легко обыграть, но при этом будет одно лишнее ображение к Справочнику для получения всех групп.
 
В статье находтся выгрузка базы, в которой на примере одного справочника показан принцип работы вышеописанного способа.
 
Дополнительная информация к ознакомлению:
4. Условное оформление в управляемых формах. (см. програмная работа с условным оформлением)
 

Скачать файлы

Наименование Файл Версия Размер
8.2.13 УФ 5
.dt 25,20Kb
11.11.14
5
.dt 25,20Kb Скачать
8.3.5 УФ 13
.dt 26,01Kb
11.11.14
13
.dt 26,01Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Шевелев (shevelyov) 29.10.15 09:29
Предлагаю своё решение: http://infostart.ru/public/413242/ Мне кажется, оно проще.
2. Анатолий Бритько (headMade) 29.10.15 14:21
(1) shevelyov,
Главное отличие видно даже из постановки задачи: у вас "Когда требуется открыть список справочника с отбором, например,ПО ОПРЕДЕЛЕННО ГРУППЕ", а у меня "при открытии формы выбора накладываются определенные УСЛОВИЯ НА ЭЛЕМЕНТЫ СПРАВОЧНИКА". Т.е. вы сразу знаете какие группы д.б. видны, а я их еще определяю исходя из иерархии справочника и накладываемых условия отбора на элементы справочника.

Кроме того если вам надо показать огурцы, которые будут находиться в
-Группа "Овощи и фрукты"
-- Группа "Овощи"
--- Группа "Огурцы"
В вашем случаем пользователь будет видеть ТОЛЬКО группу "Огурцы", а в моем случаем будет видна вся иерархиям полностью вплоть до группы "Огурцы".
veretennikoff; +1 Ответить
3. Владислав Кашин (MECHTAKZ) 15.04.16 06:06
Очень классное решение.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа