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