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