Константы и глобальный запрет на выбор элементов справочника из определённой группы

1. Baszilio 3 24.09.21 23:52 Сейчас в теме
Коллеги, добрый вечер! Сориентируйте пожалуйста новичка, подскажите куда копать?

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

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

Надеюсь описал понятно. Спасибо!
Найденные решения
14. Baszilio 3 29.09.21 22:59 Сейчас в теме
Коллеги, "я шмогла". Вдруг кому нужно, хотя, вероятно, это банальная задача. Решилось всё созданием формы выбора для справочника моего. А сам код в модуле упомянутой формы вот такой:
&НаСервере
Функция СписокВыборНаСервере(ДанныеВыбора, СтандартнаяОбработка)
	Если ДанныеВыбора.Родитель.Наименование = "Уволенные" Тогда
		СтандартнаяОбработка = Ложь;
		Возврат Ложь;
	Иначе Возврат Истина;
	КонецЕсли;
КонецФункции

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

Критика приветствуется!
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. =Kollega= 4 25.09.21 15:46 Сейчас в теме
Развивая вопрос - как запретить не только в рамках назначения констант, но и при использовании в каких-либо других справочниках и документах.

Как раз мой вариант в форме выбора справочника и позволяет из любых форм запретить выбор определённых элементов.
Но повторюсь, работает только при вызове формы выбора. Если есть быстрый выбор из выпадающего списка, не поможет.
2. provadyuga 99 25.09.21 07:25 Сейчас в теме
Для Справочника нужно создать предопределенные группы по которым устанавливаться будет запрет, например: "Группа1", "Группа2", "Группа3". Нужно создать для каждой группы соотв. константу: "ЗапретитьГруппу1", "ЗапретитьГруппу2", "ЗапретитьГруппу3".
В форме где будет происходить выбор, для реквизита определить событие Реквизит1ОбработкаВыбора(
&НаСервереБезКонтекста
Функция ВыборЗапрещен(ВыбранноеЗначение)
	Если ВыбранноеЗначение.ПринадлежитЭлементу(Справочники.Справочник1.Группа1) Тогда
		Если Константы.ЗапретитьГруппу1.Получить() Тогда
			Возврат Истина;
		КонецЕсли;	
	ИначеЕсли ВыбранноеЗначение.ПринадлежитЭлементу(Справочники.Справочник1.Группа2) Тогда
		Если Константы.ЗапретитьГруппу2.Получить() Тогда
			Возврат Истина;
		КонецЕсли;	
	ИначеЕсли ВыбранноеЗначение.ПринадлежитЭлементу(Справочники.Справочник1.Группа3) Тогда
		Если Константы.ЗапретитьГруппу3.Получить() Тогда
			Возврат Истина;
		КонецЕсли;	
	КонецЕсли;	
	
	Возврат ложь;
	
КонецФункции

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

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

Единственное, что это не сработает, если не будет вызываться стандартная форма выбора. Ну или будет выбран элемент из выпадающего списка.
5. Dem0 25.09.21 10:10 Сейчас в теме
(4)
о имеет в виду. Ему не хочется повторять один и тот же код на каждой форме константы. Ему необходимо в нескольких формах запретит

Ну просто если это выбор элемента из справочника - тогда будет открываться форма выбора?
Весь код по фильтрации будет только в этой форме в одном месте. Вместо повтора кода в форме констант.
Если конечно это не быстрый выбор.. Хотя справочник ирерархический вроде..
11. Baszilio 3 25.09.21 18:16 Сейчас в теме
(5) Да, иерархический, именно так. И к запрету будет одна из групп.
10. Baszilio 3 25.09.21 18:14 Сейчас в теме
(4) Соверешенно верно! А ещё лучше бы запретить на уровне самого справочника, элементы которого по типу привязаны к константе. Может быть есть возмжность какая-то?
16. Baszilio 3 29.09.21 23:04 Сейчас в теме
(4) Так точно, своей формой выбора, в рамках её модуля это и решил. Решение приложил. Если есть какие-то нарекания, прошу озвучить :)
3. Dem0 25.09.21 09:46 Сейчас в теме
Может прописать условие с фильтром в форме списка и форме выбора этого справочника?
Тогда везде будет это использоваться
6. dehro 5 25.09.21 10:34 Сейчас в теме
Вариант I
RLS не подойдёт?
Добавить в справочник реквизит: "СправочныйЭлемент" и роль, которая "видит" только не справочные.

Вариант II
Забодяжить подписку на событие "ОбработкаПолученияДанныхВыбора" для источника "СправочникМенеджер.МойЛюбимыйСправочник"
gonnahard; Dem0; +2 Ответить
12. Baszilio 3 25.09.21 18:19 Сейчас в теме
(6)
Вариант II
Забодяжить подписку на событие "ОбработкаПолученияДанныхВыбора" для источника "СправочникМенеджер.МойЛюбимыйСправочник"


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

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

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

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

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

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

изменить Параметры и сказать платформе, чтобы она сформировала список выбора;
отказаться от стандартной обработки и самостоятельно сформировать список выбора.
15. Baszilio 3 29.09.21 23:03 Сейчас в теме
(13)
Всё решилось проще, ОбработкаПолученияДанных позже чем мне надо срабатывало. Моё решение ниже.
Вероятно, можно было тоже зайти через подписку, но я сделал проще.
7. dehro 5 25.09.21 10:36 Сейчас в теме
(3) И отключить ввод по строке?
9. Dem0 25.09.21 15:59 Сейчас в теме
(7)
(3) И отключить ввод по строке?

Ну если уж совсем хардкор - тогда только права.
Как вы правильно сказали - RLS несложный замутить.
Но не думаю что оно того стоит: Речь идет о константах, там наверное какие-то настройки, которые и так редактировать не каждый должен иметь права.
14. Baszilio 3 29.09.21 22:59 Сейчас в теме
Коллеги, "я шмогла". Вдруг кому нужно, хотя, вероятно, это банальная задача. Решилось всё созданием формы выбора для справочника моего. А сам код в модуле упомянутой формы вот такой:
&НаСервере
Функция СписокВыборНаСервере(ДанныеВыбора, СтандартнаяОбработка)
	Если ДанныеВыбора.Родитель.Наименование = "Уволенные" Тогда
		СтандартнаяОбработка = Ложь;
		Возврат Ложь;
	Иначе Возврат Истина;
	КонецЕсли;
КонецФункции

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

Критика приветствуется!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот