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