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