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

11.11.14

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

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

Файлы

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

Наименование Скачано Купить файл
8.2.13 УФ
.dt 25,20Kb
14 2 500 руб. Купить
8.3.5 УФ
.dt 26,01Kb
52 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

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

Оформить подписку и скачать решение со скидкой
 
 
 
 Форма выбора ДО  Форма выбора ПОСЛЕ
 (видны "пустые" группы справочника, хотя выводятся только элементы с типом "Услуга")  ("пустых" групп справочника не видно)
 
Для того чтобы получить вышеуказанный указанный результат необходимо:
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С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

31720 руб.

27.03.2025    77919    52    40    

63

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.

36600 руб.

28.08.2025    7140    2    2    

6

Работа с интерфейсом Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия Платные (руб)

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

6100 руб.

14.01.2016    59924    22    25    

47

Консолидация данных Работа с интерфейсом Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)

Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.

6088 руб.

17.10.2025    1822    3    0    

2

Работа с интерфейсом Рабочее место 1С:Предприятие 8 1C:Бухгалтерия Платные (руб)

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

6100 руб.

16.01.2015    67875    46    60    

85

Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

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

20.08.2024    48346    mrXoxot    44    

139

Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

27.05.2024    26149    smielka    38    

115
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. shevelyov 90 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

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

Показать


Переданный в форму отбор достаточно превратить в параметры дин списка.
Каменный цветок сразу получится.
Zentrum; user1098876; Greysvandir; Mizhgan42; rusakov1969; +5 Ответить
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 Сейчас в теме
Нужно просто в динамическом списке > Настройки > Группировка выбрать группировку по "Родитель" и будет счастье
user958854; user_Andryushka; ilyav; SashinPapa; sulitckaja; nick-max; +6 Ответить
17. Westbound 22.09.23 12:45 Сейчас в теме
(13) Включил группировку по родителю, вообще ничего не поменялось.
14. ChekarV 11 27.03.20 09:15 Сейчас в теме
Коллеги, очень нужна помощь. Воспользовался подсказками из данной статьи в реализации задачи, за что огромное спасибо автору. Но у меня справочник с 4 уровнями и кол-вом записей 300К+. При накладывании "отборов" на форму выбора - база замирает минут на 5, ничего не могу придумать. Может кто подсказать как можно оптимизировать запросы и/или код?
15. headMade 144 01.04.20 20:44 Сейчас в теме
(14) вы используете прием со скрытием пустых групп справочников?
Или форма подбора сама по себе работает медленно?
Для отправки сообщения требуется регистрация/авторизация