Как в управляемой форме списка определить, находится ли пользователь в корне справочника или внутри группы?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с иерархическими справочниками в среде 1С 8.3 часто возникает задача программно определить текущее состояние навигации пользователя. Например, нам нужно знать, находится ли пользователь на верхнем уровне (в корне), где отображаются только группы первого уровня, или же он «провалился» внутрь конкретной группы и видит её содержимое. Рассмотрим, как это реализовать эффективно и корректно, даже если в справочнике еще нет данных.

Анализируем свойство ТекущийРодитель

Основным инструментом для решения нашей задачи является свойство элемента формы Таблица, который отображает динамический список справочника. Разберем механизм работы свойства ТекущийРодитель. Это свойство содержит ссылку на ту группу, содержимое которой в данный момент выведено в список.

Проанализируем возможные значения этого свойства:

  1. Если ТекущийРодитель равен пустой ссылке (например, Справочники.Номенклатура.ПустаяСсылка()), это однозначно указывает на то, что пользователь находится в корне справочника.
  2. Если значение свойства заполнено конкретной ссылкой, значит, открыт просмотр содержимого данной группы.

Важный момент: в отличие от обращения к ТекущиеДанные, обращение к ТекущийРодитель работает всегда, независимо от наличия строк в списке. Рассмотрим пример кода, который можно использовать для проверки:


// Пример получения текущего родителя из элемента формы "Список"
ТекущийРодитель = Элементы.Список.ТекущийРодитель;

Если ТекущийРодитель.Пустая() Тогда
    Сообщить("Мы находимся в корне справочника");
Иначе
    Сообщить("Мы находимся внутри группы: " + ТекущийРодитель);
КонецЕсли;

Событие ПриСменеТекущегоРодителя

Для того чтобы оперативно реагировать на действия пользователя (вход в папку или выход из нее), нам потребуется обработчик события ПриСменеТекущегоРодителя. Это стандартное событие расширения таблицы динамического списка.

Выясним особенности работы этого события:

Разберем пример реализации обработчика:


&НаКлиенте
Процедура СписокПриСменеТекущегоРодителя(Элемент)
    
    // Получаем текущее состояние иерархии
    НовыйРодитель = Элемент.ТекущийРодитель;
    
    Если НовыйРодитель.Пустая() Тогда
        // Логика для корня справочника
        Элементы.ГруппаКомандыДляКорня.Видимость = Истина;
        Элементы.ГруппаКомандыДляГрупп.Видимость = Ложь;
    Иначе
        // Логика для нахождения внутри группы
        Элементы.ГруппаКомандыДляКорня.Видимость = Ложь;
        Элементы.ГруппаКомандыДляГрупп.Видимость = Истина;
    КонецЕсли;
    
КонецПроцедуры

Влияние режима просмотра на логику программы

Важно учитывать, что понятие «текущий родитель» имеет смысл только в определенных режимах просмотра динамического списка. В платформе 1С предусмотрено три режима:

  1. Иерархический список: Пользователь перемещается по папкам, свойство ТекущийРодитель меняется.
  2. Дерево: Свойство ТекущийРодитель также актуально для выделенного узла.
  3. Список: Весь справочник выводится «плоским» перечнем. В этом режиме навигация по родителям отсутствует, и визуально пользователь не «входит» в группы.

Посмотрим, как проверить текущий режим просмотра программно, чтобы избежать логических ошибок в коде:


Если Элементы.Список.РежимПросмотра = РежимПросмотраСписка.ИерархическийСписок Тогда
    // Только здесь логика с ТекущийРодитель будет полностью соответствовать ожиданиям пользователя
КонецЕсли;

Почему не подходят другие способы?

Рассмотрим альтернативы, которые часто предлагают новички, и выясним их недостатки:

1. Использование ТекущиеДанные.Родитель:

Этот метод крайне ненадежен. Если справочник пуст или в текущей группе нет элементов, ТекущиеДанные будет иметь значение Неопределено, и вы не сможете определить, где находится пользователь. Свойство Элементы.Список.ТекущийРодитель лишено этого недостатка.

2. Использование ТекущиеДанные.ЭтоГруппа:

Это свойство говорит лишь о том, является ли текущая выделенная строка группой. Оно никак не отвечает на вопрос, «внутри» какой группы мы находимся в данный момент.

Заключение и рекомендации

Подведем итог нашего анализа. Для надежного определения состояния формы списка справочника (корень или конкретная группа) следует придерживаться следующего алгоритма:

Такой подход обеспечит стабильную работу вашего интерфейса в любых ситуациях — от пустых справочников до сложных многоуровневых структур.

← На главную