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

11.11.14

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

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

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

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

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

6000 руб.

16.01.2015    61795    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

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

5000 руб.

14.01.2016    54402    16    21    

42

Управление дашбордами

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

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

2400 руб.

29.06.2020    16697    21    4    

35

Новогоднее оформление для 1С

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

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

27.12.2023    10736    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

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

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

2 стартмани

10.04.2023    9613    151    acces969    31    

118

Модель состояния для MVC

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

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12080    1    5    

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