При разработке в обычных формах часто возникает задача скрыть от пользователей элементы и группы справочника, которые помечены на удаление, но при этом оставить возможность включить их видимость. Рассмотрим типичную ситуацию: разработчик накладывает стандартный отбор на список, элементы успешно скрываются, а вот помеченные на удаление группы продолжают отображаться в интерфейсе.
Разберем первоначальный код, который часто пытаются использовать для решения этой задачи:
Процедура ПоказыватьОтмененныеПриИзменении(Элемент=Неопределено)
Если ПоказыватьОтмененные Тогда
СправочникСписок.Отбор.ПометкаУдаления.Использование=Ложь;
Иначе
СправочникСписок.Отбор.ПометкаУдаления.Использование=Истина;
СправочникСписок.Отбор.ПометкаУдаления.ВидСравнения=ВидСравнения.Равно;
СправочникСписок.Отбор.ПометкаУдаления.Значение=Ложь;
// Попытка обновить дерево путем переключения иерархии (не работает для групп)
Если ЭлементыФормы.СправочникСписок.ИерархическийПросмотр Тогда
ЭлементыФормы.СправочникСписок.ИерархическийПросмотр=Ложь;
ЭлементыФормы.СправочникСписок.ИерархическийПросмотр=Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем причину, по которой данный подход не работает для групп. Особенность кроется в архитектуре ядра 1С для обычных форм. При включенном свойстве ИерархическийПросмотр платформа применяет фильтр только к самим элементам, негласно добавляя условие принадлежности именно к элементам. Группы принудительно выводятся ядром для сохранения связности дерева, ведь помеченная на удаление родительская группа вполне может содержать внутри себя непомеченные элементы. В этом случае скрытие группы привело бы к разрыву иерархии.
Посмотрим на проверенные способы, которые действительно помогут решить данную задачу.
Если вам критически важно сохранить древовидную визуализацию на форме и при этом полностью убрать удаленные папки, стандартный объект СправочникСписок не подойдет. Разберем альтернативный путь:
ДеревоЗначений.ПометкаУдаления = Ложь как для элементов, так и для групп.Этот метод требует дополнительного программирования (например, обработки двойного клика для открытия формы элемента), но дает вам 100% контроль над отображаемыми строками.
Рассмотрим наиболее корректный с точки зрения платформы способ — ограничение на уровне записей (Record Level Security). Если вы хотите, чтобы удаленные группы бесшовно исчезали из интерфейса, не ломая встроенную иерархию, сделайте следующее:
При таком подходе ядро 1С физически не сможет прочитать эти данные из базы при построении списка, и они не попадут в кэш отображения формы. Иерархическая структура при этом будет выведена корректно.
Если древовидная структура (отображение по папкам) не является строго обязательной для текущего бизнес-процесса, мы можем просто выключить ее. Проанализируем этот вариант:
Когда вы принудительно задаете свойство ИерархическийПросмотр = Ложь (и не возвращаете его обратно в Истина, как это делалось в изначальном коде-костыле), список становится плоским. В режиме плоского списка платформенный отбор работает без ограничений ядра. В таком виде условие по свойству отбора ПометкаУдаления успешно сработает и на элементы, и на группы.
Подведем итог: попытки скрыть группы стандартным отбором в иерархическом списке обычного приложения обречены на неудачу из-за внутренних механизмов 1С. Выбирайте один из рассмотренных обходных путей в зависимости от того, что для вас важнее: сохранение визуального дерева или минимизация написания дополнительного программного кода.