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

11.11.14

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

Довольно часто при открытии формы выбора накладываются определенные условия на элементы справочника, которые необходимо показать пользователю (наличие на остатке, отбор по значению реквизита и др). И если с выводом элементов справочника проблем не возникает, то группы выводятся все. В статье описан несложный способ как можно скрыть "пустые" группы справочника при открытии формы выбора.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
8.2.13 УФ
.dt 25,20Kb
14
14 Скачать (1 SM) Купить за 1 850 руб.
8.3.5 УФ
.dt 26,01Kb
51
51 Скачать (1 SM) Купить за 1 850 руб.
 
 
 
 Форма выбора ДО  Форма выбора ПОСЛЕ
 (видны "пустые" группы справочника, хотя выводятся только элементы с типом "Услуга")  ("пустых" групп справочника не видно)
 
Для того чтобы получить вышеуказанный указанный результат необходимо:
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. Условное оформление в управляемых формах. (см. програмная работа с условным оформлением)
 

форма управляемая отбор пустые группы видимость

См. также

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

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

6000 руб.

16.01.2015    63056    44    59    

82

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

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

2400 руб.

29.06.2020    18926    26    6    

41

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

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

1500 руб.

06.10.2020    10290    7    7    

10

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

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

20.08.2024    17391    mrXoxot    43    

121

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

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

27.05.2024    7756    smielka    37    

100

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

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

27.12.2023    15058    946    elcoan    49    

117

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

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

2 стартмани

10.04.2023    11989    162    acces969    31    

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

Кроме того если вам надо показать огурцы, которые будут находиться в
-Группа "Овощи и фрукты"
-- Группа "Овощи"
--- Группа "Огурцы"
В вашем случаем пользователь будет видеть ТОЛЬКО группу "Огурцы", а в моем случаем будет видна вся иерархиям полностью вплоть до группы "Огурцы".
CyberCerber; veretennikoff; +2 Ответить
3. MECHTAKZ 15.04.16 06:06 Сейчас в теме
Очень классное решение.
4. scape 282 23.02.17 13:28 Сейчас в теме
В "такси" ведет себя не адекватно. Пропадает заголовок таблицы списка.
5. Ioanngood 27.04.17 14:02 Сейчас в теме
А есть подобное решение для обычных форм?
6. headMade 144 02.05.17 13:48 Сейчас в теме
(5) Для обычных форм ничего нет.
7. evgeniti 3 05.06.17 14:34 Сейчас в теме
Очень сложно. Зачем?
Вся фишка заключается в том, что отбор компоновки дин списка и даже прямое условие дин списка в условии ГДЕ не справляется со скрытием ненужных групп.

То есть такой код динамического списка не работает
Выбрать 
Спр.Ссылка, 
Спр.ПолеОтбора 
из
Справочник.НекийСправочник
ГДЕ 
Спр.ПолеОтбора = "хочу оставить"
Показать





Чтобы скрыть группы надо перетащить условие фильтрации из ГДЕ в JOIN

Выбрать 
Спр.Ссылка, 
Спр.ПолеОтбора 
из
Справочник.НекийСправочник Спр
ВНУТРЕННЕЕ СОЕДИНЕНИЕ 
 (Выбрать Фильтр.ссылка из Справочник.НекийСправочник как Фильтр где Фильтр.ПолеОтбора =  "хочу оставить") Фильтр 
По Спр.ссылка = Фильтр.Ссылка

Показать


Переданный в форму отбор достаточно превратить в параметры дин списка.
Каменный цветок сразу получится.
user1098876; Greysvandir; Mizhgan42; rusakov1969; +4 Ответить
8. headMade 144 05.06.17 17:25 Сейчас в теме
(7) ваше предложение это работающее решение или это концепция?

У меня при использовании
"ВНУТРЕННЕЕ СОЕДИНЕНИЕ... По Спр.ссылка = Фильтр.Ссылка "
форма выбора в режиме просмотра "Дерево" ничего не показывает, а вот в режиме просмотра "Список" показывает ТОЛЬКО элементы (группы справочника не видны) по условию
где Фильтр.ПолеОтбора =  "хочу оставить"

Требуется еще какая-то доп настройка?
9. evgeniti 3 05.06.17 22:11 Сейчас в теме
(8) не концепция. вполне себе работает для верхнего уровня иерархии. Насчет старта с промежуточного - не было такой задачи :-)

По поводу только элементов - это решение для тех, кому не страшно разрешить реквизит фильтрации для группы, и далее заполнить его нужными данными. Иначе, как вы заметили, групп не будет видно. Тут, как говорится, "Вам шашечки или ехать".
Согласен, что такое вмешательство в конфигурацию не всем понравится, для кого-то вообще жирный минус, но тут как раз можно вашу транзитивность попробовать сюда доцепить и отпадет необходимость в условном оформлении... UPD 1: или просто добавить непосредственных родителей фильтрованных элементов в фильтр соединения. Необязательно вложенный запрос же, наверное можно же и врем таблицу в соединение пихнуть. В каком то релизе временные таблице в дин списке уже сделали кажись.

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

Вариант с видимостью я пробовал, но он себя забавно ведет иногда. Попробуйте нажать кнопку пометки удаления когда условным оформлением скрыты все элементы.

А вообще, конечно, 1с подвела так подвела. Издевательство над людьми.
10. headMade 144 13.06.17 13:41 Сейчас в теме
(9) Спасибо за совет. Действительно при использовании
"ВНУТРЕННЕЕ СОЕДИНЕНИЕ... По Спр.ссылка = Фильтр.Ссылка "
можно "побороть" многие "особенности" поведения условного оформления (при использовании видимости).
16. rusakov1969 04.04.20 17:32 Сейчас в теме
(7) как? как ты до этого допер?!!!
я прям в ступоре был
в запросе указываю жестко условие. а оно не работает.
а так вот срабатывает. гениально
11. alex-l19041 8 13.06.17 14:47 Сейчас в теме
какое отличие в коде между версиями 8.2.13 и 8.3.5 ?
12. headMade 144 13.06.17 14:55 Сейчас в теме
(11) никаких. Просто кому что ближе по платформе. (и это не такси)
13. WiseSnake 1521 05.11.17 16:52 Сейчас в теме
Нужно просто в динамическом списке > Настройки > Группировка выбрать группировку по "Родитель" и будет счастье
user_Andryushka; ilyav; SashinPapa; sulitckaja; nick-max; +5 Ответить
17. Westbound 22.09.23 12:45 Сейчас в теме
(13) Включил группировку по родителю, вообще ничего не поменялось.
14. ChekarV 8 27.03.20 09:15 Сейчас в теме
Коллеги, очень нужна помощь. Воспользовался подсказками из данной статьи в реализации задачи, за что огромное спасибо автору. Но у меня справочник с 4 уровнями и кол-вом записей 300К+. При накладывании "отборов" на форму выбора - база замирает минут на 5, ничего не могу придумать. Может кто подсказать как можно оптимизировать запросы и/или код?
15. headMade 144 01.04.20 20:44 Сейчас в теме
(14) вы используете прием со скрытием пустых групп справочников?
Или форма подбора сама по себе работает медленно?
Оставьте свое сообщение