Как в 1С 8.3 открыть форму списка с элементами только одной предопределенной группы

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

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

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

Способ 1. Управление свойствами динамического списка через параметры формы

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

Реализуем передачу этих настроек из модуля общей команды в форму списка:

  1. В модуле команды получаем ссылку на предопределенный элемент и формируем структуру параметров.
  2. В обработчике формы списка применяем переданные свойства к элементу таблицы.

Посмотрим на пример кода в модуле команды:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    НужнаяГруппа = ПредопределенноеЗначение("Справочник.ОбъектыНедвижимости.ЗемельныеУчастки");
    
    ПараметрыСписка = Новый Структура;
    ПараметрыСписка.Вставить("РодительВерхнегоУровня", НужнаяГруппа);
    ПараметрыСписка.Вставить("ТекущийРодитель",        НужнаяГруппа);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ПараметрыСписка", ПараметрыСписка);
    
    // Передаем ссылку на группу в качестве ключа уникальности
    ОткрытьФорму("Справочник.ОбъектыНедвижимости.ФормаСписка", 
        ПараметрыФормы, 
        ПараметрыВыполненияКоманды.Источник, 
        НужнаяГруппа);
        
КонецПроцедуры

Теперь в модуле формы списка справочника применим эти параметры в событии ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("ПараметрыСписка") Тогда
        ЗаполнитьЗначенияСвойств(Элементы.Список, Параметры.ПараметрыСписка);
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Использование стандартного параметра «Отбор» и автозаполнения

Если требуется вывести элементы строго в виде плоского списка (без отображения самой папки-родителя и без возможности подняться наверх), наиболее надежным и лаконичным решением является стандартный механизм отборов платформы при открытии формы.

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

Рассмотрим реализацию в модуле команды:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    НужнаяГруппа = ПредопределенноеЗначение("Справочник.ОбъектыНедвижимости.ЗемельныеУчастки");
    
    Отбор = Новый Структура;
    Отбор.Вставить("Родитель", НужнаяГруппа);
    
    ЗначенияЗаполнения = Новый Структура;
    ЗначенияЗаполнения.Вставить("Родитель", НужнаяГруппа);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", Отбор);
    ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);
    
    ОткрытьФорму("Справочник.ОбъектыНедвижимости.ФормаСписка", 
        ПараметрыФормы, 
        ПараметрыВыполненияКоманды.Источник, 
        НужнаяГруппа);
        
КонецПроцедуры

При таком подходе писать дополнительный код в процедуре ПриСозданииНаСервере формы списка не требуется — платформа выполнит фильтрацию штатно.

Способ 3. Программная настройка отбора компоновки данных

В ситуациях, когда внутри предопределенной группы есть сложная многоуровневая структура подгрупп и требуется показать все вложенные элементы на любую глубину, прямого равенства по полю Родитель недостаточно. В этом случае используем отбор компоновки данных динамического списка с видом сравнения В иерархии.

Посмотрим на пример установки отбора в процедуре ПриСозданииНаСервере формы списка:


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

Решение проблемы блокировки открытия других групп (параметр «Уникальность»)

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

Выясним причину такого поведения. Метод ОткрытьФорму по умолчанию использует значение Истина или Неопределено для параметра Уникальность. Платформа видит, что форма данного справочника уже существует, и просто активизирует ранее открытое окно, игнорируя новые параметры.

Чтобы каждая группа открывалась в своей независимой вкладке рабочего пространства:

  1. В четвертый параметр метода ОткрытьФорму передаем уникальный ключ. В качестве такого ключа идеально подходит сама ссылка на группу (НужнаяГруппа) или её уникальный идентификатор.
  2. Благодаря этому для каждой группы создается отдельный экземпляр формы. При повторном клике по той же команде активизируется окно именно этой группы, а остальные остаются открытыми параллельно.

Дополнительная настройка: динамический заголовок формы

Когда открыто несколько окон одного и того же справочника с разными группами, стандартный заголовок (например, «Объекты недвижимости») делает навигацию по вкладкам неудобной. Рекомендуется динамически менять заголовок окна в зависимости от выбранной группы.

Посмотрим, как установить заголовок в ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("ПараметрыСписка") Тогда
        ЗаполнитьЗначенияСвойств(Элементы.Список, Параметры.ПараметрыСписка);
        
        Если ЗначениеЗаполнено(Параметры.ПараметрыСписка.ТекущийРодитель) Тогда
            АвтоЗаголовок = Ложь;
            Заголовок = "Список: " + Строка(Параметры.ПараметрыСписка.ТекущийРодитель);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Итог: сочетание установки свойств ТекущийРодитель / РодительВерхнегоУровня (или структуры Отбор) с корректно заданным параметром Уникальность позволяет быстро реализовать изолированные списки предопределенных групп без создания лишних объектов конфигурации.

← На главную