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