Как в справочнике ограничить выбор родителя только группами нижнего уровня?

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

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

Основные подходы к решению задачи

Стандартные механизмы настройки параметров выбора формы не всегда позволяют гибко управлять динамической иерархией, особенно когда критерий «низший уровень» вычисляется в зависимости от структуры данных. Мы рассмотрим два ключевых этапа: ограничение на этапе выбора в форме и защитный механизм при записи объекта.

Реализация ограничения выбора через событие «ПриНачалеВыбора»

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

  1. В модуле формы, где находится реквизит Родитель, найдем событие ПриНачалеВыбора.
  2. Отключим стандартную обработку выбора, установив параметр СтандартнаяОбработка = Ложь.
  3. Программно откроем форму выбора с применением фильтров или параметров.

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


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

При открытии формы выбора необходимо настроить ДинамическийСписок так, чтобы он не отображал или блокировал возможность выбора папок, имеющих подчиненные группы. Это можно сделать через запрос к справочнику, где в отбор будут включены только группы, у которых Количество подчиненных элементов равно нулю.

Программная проверка при записи (Защита от ошибок)

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

Рассмотрим логику проверки:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если НЕ ЭтоГруппа И ЗначениеЗаполнено(Родитель) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	Спр.Ссылка
        |ИЗ
        |	Справочник.ВашСправочник КАК Спр
        |ГДЕ
        |	Спр.Родитель = &Родитель
        |	И Спр.ЭтоГруппа = ИСТИНА";
        
        Запрос.УстановитьПараметр("Родитель", Родитель);
        Результат = Запрос.Выполнить();
        
        Если НЕ Результат.Пустой() Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выбранная группа содержит вложенные папки! Выберите конечный уровень.");
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Почему важен такой комплексный подход?

Разберем детали реализации:

Таким образом, комбинируя программное открытие формы для настройки отборов и проверку в модуле объекта для контроля записи, вы добьетесь стабильной и предсказуемой работы справочника в любой конфигурации 1С.

← На главную