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