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