Коллеги, добрый вечер! Сориентируйте пожалуйста новичка, подскажите куда копать?

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

Развивая вопрос - как запретить не только в рамках назначения констант, но и при использовании в каких-либо других справочниках и документах.

Надеюсь описал понятно. Спасибо!
---
Коллеги, "я шмогла". Вдруг кому нужно, хотя, вероятно, это банальная задача. Решилось всё созданием формы выбора для справочника моего. А сам код в модуле упомянутой формы вот такой:

```1c
    &НаСервере
    Функция СписокВыборНаСервере(ДанныеВыбора, СтандартнаяОбработка)
    Если ДанныеВыбора.Родитель.Наименование = "Уволенные" Тогда
    СтандартнаяОбработка = Ложь;
    Возврат Ложь;
    Иначе Возврат Истина;
    КонецЕсли;
    КонецФункции

    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    Если НЕ СписокВыборНаСервере(Элементы.Список.ТекущиеДанные.Ссылка, СтандартнаяОбработка) Тогда
    ОчиститьСообщения();
    Сообщить("Уволенные сотрудники приведены исключительно справочно!");
    КонецЕсли
    КонецПроцедуры
```

Критика приветствуется!
---
Развивая вопрос - как запретить не только в рамках назначения констант, но и при использовании в каких-либо других справочниках и документах.

Как раз мой вариант в форме выбора справочника и позволяет из любых форм запретить выбор определённых элементов.
Но повторюсь, работает только при вызове формы выбора. Если есть быстрый выбор из выпадающего списка, не поможет.
---
Для Справочника нужно создать предопределенные группы по которым устанавливаться будет запрет, например: "Группа1", "Группа2", "Группа3". Нужно создать для каждой группы соотв. константу: "ЗапретитьГруппу1", "ЗапретитьГруппу2", "ЗапретитьГруппу3".
В форме где будет происходить выбор, для реквизита определить событие Реквизит1ОбработкаВыбора(

```1c
    &НаСервереБезКонтекста
    Функция ВыборЗапрещен(ВыбранноеЗначение)
    Если ВыбранноеЗначение.ПринадлежитЭлементу(Справочники.Справочник1.Группа1) Тогда
    Если Константы.ЗапретитьГруппу1.Получить() Тогда
    Возврат Истина;
    КонецЕсли;
    ИначеЕсли ВыбранноеЗначение.ПринадлежитЭлементу(Справочники.Справочник1.Группа2) Тогда
    Если Константы.ЗапретитьГруппу2.Получить() Тогда
    Возврат Истина;
    КонецЕсли;
    ИначеЕсли ВыбранноеЗначение.ПринадлежитЭлементу(Справочники.Справочник1.Группа3) Тогда
    Если Константы.ЗапретитьГруппу3.Получить() Тогда
    Возврат Истина;
    КонецЕсли;
    КонецЕсли;

    Возврат ложь;

    КонецФункции

    &НаКлиенте
    Процедура Реквизит1ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    Если ВыборЗапрещен(ВыбранноеЗначение) Тогда
    Сообщить("Элемент "+ВыбранноеЗначение+" запрещено выбирать!");
    СтандартнаяОбработка = ложь;
    КонецЕсли;
    КонецПроцедуры
```
---
Мне кажется автор немного не то имеет в виду. Ему не хочется повторять один и тот же код на каждой форме константы. Ему необходимо в нескольких формах запретить выбрать определенную группу.
Проще всего в форме выбора в событии "ОбработкаВыбора" сделать проверку, что-то типа этого:

```1c
    &НаСервере
    Функция ПроверитьЗначение(Значение)
    Возврат НЕ (Значение.Родитель.Код = "00-00037437");
    КонецФункции

    &НаКлиенте
    Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
    СтандартнаяОбработка = ПроверитьЗначение(Значение);
    КонецПроцедуры
```

Единственное, что это не сработает, если не будет вызываться стандартная форма выбора. Ну или будет выбран элемент из выпадающего списка.
---
о имеет в виду. Ему не хочется повторять один и тот же код на каждой форме константы. Ему необходимо в нескольких формах запретит
Ну просто если это выбор элемента из справочника - тогда будет открываться форма выбора?
Весь код по фильтрации будет только в этой форме в одном месте. Вместо повтора кода в форме констант.
Если конечно это не быстрый выбор.. Хотя справочник ирерархический вроде..
---
Да, иерархический, именно так. И к запрету будет одна из групп.
---
Соверешенно верно! А ещё лучше бы запретить на уровне самого справочника, элементы которого по типу привязаны к константе. Может быть есть возмжность какая-то?
---
Так точно, своей формой выбора, в рамках её модуля это и решил. Решение приложил. Если есть какие-то нарекания, прошу озвучить :)
---
Может прописать условие с фильтром в форме списка и форме выбора этого справочника?
Тогда везде будет это использоваться
---
Вариант I
RLS не подойдёт?
Добавить в справочник реквизит: "СправочныйЭлемент" и роль, которая "видит" только не справочные.

Вариант II
Забодяжить подписку на событие "ОбработкаПолученияДанныхВыбора" для источника "СправочникМенеджер.МойЛюбимыйСправочник"
---
Вариант II
Забодяжить подписку на событие "ОбработкаПолученияДанныхВыбора" для источника "СправочникМенеджер.МойЛюбимыйСправочник"

А как это можно реализовать? Чуть-чуть бы подробнее. Мне намекали на менеджер справочника, но я не разобрался... Что-то такое мне и видится, чтобы на уровне справочника решить, а дальше уже бы не волноваться о том, как и где мы будем выбирать из него элементы. Если это так работает.
---
Конфигуратора рядом нет. Но там легко разобраться:
1. Добавляете новую подписку.
2. Источник СправочникМенеджер.ВашСправочник
3. Событие ОбработкаПолученияДанныхВыбора

Создаёте процедуру нажав лупу в палитре свойств (ну как обычно). Процедура создаётся с параметрами.
Далее с ИТС:

ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

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

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

Таким образом, у нас есть следующие возможности:

    изменить Параметры и сказать платформе, чтобы она сформировала список выбора;
    отказаться от стандартной обработки и самостоятельно сформировать список выбора.
---
Всё решилось проще, ОбработкаПолученияДанных позже чем мне надо срабатывало. Моё решение ниже.
Вероятно, можно было тоже зайти через подписку, но я сделал проще.
---
И отключить ввод по строке?
---
(3) И отключить ввод по строке?
Ну если уж совсем хардкор - тогда только права.
Как вы правильно сказали - RLS несложный замутить.
Но не думаю что оно того стоит: Речь идет о константах, там наверное какие-то настройки, которые и так редактировать не каждый должен иметь права.
---
Коллеги, "я шмогла". Вдруг кому нужно, хотя, вероятно, это банальная задача. Решилось всё созданием формы выбора для справочника моего. А сам код в модуле упомянутой формы вот такой:

```1c
    &НаСервере
    Функция СписокВыборНаСервере(ДанныеВыбора, СтандартнаяОбработка)
    Если ДанныеВыбора.Родитель.Наименование = "Уволенные" Тогда
    СтандартнаяОбработка = Ложь;
    Возврат Ложь;
    Иначе Возврат Истина;
    КонецЕсли;
    КонецФункции

    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    Если НЕ СписокВыборНаСервере(Элементы.Список.ТекущиеДанные.Ссылка, СтандартнаяОбработка) Тогда
    ОчиститьСообщения();
    Сообщить("Уволенные сотрудники приведены исключительно справочно!");
    КонецЕсли
    КонецПроцедуры
```

Критика приветствуется!