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