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