Как ограничить или отключить подменю «Ввод на основании» в форме документа 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейса в обычных формах 1С часто возникает необходимость ограничить пользователю доступ к определенным функциям. Например, требуется заблокировать или полностью скрыть подменю «Ввод на основании» в командной панели документа (например, в заказе покупателя).

Типичная ошибка разработчиков — попытка обойти все кнопки подменю в цикле при открытии формы и программно установить для них свойство Доступность = Ложь. Разберем, почему этот подход не приносит результата и какими способами можно успешно решить эту задачу.

Выясним причину: почему не работает Доступность = Ложь

Рассмотрим стандартный код, который часто пытаются использовать в событии ПриОткрытии:


Для каждого Кнопка Из ЭлементыФормы.ДействияФормы.Кнопки.Подменю2.Кнопки Цикл
    Кнопка.Доступность = Ложь;
КонецЦикла;

В обычных формах платформа 1С обрабатывает свойство Доступность у объектов типа КнопкаКоманднойПанели корректно только для одиночных кнопок с типом Действие. Если элемент является подменю (тип Подменю) с автозаполнением, платформа динамически управляет его составом при отрисовке интерфейса. В результате изменение доступности дочерних элементов игнорируется, и кнопки остаются активными.

Решение 1. Отключение автозаполнения командной панели

Самый простой и эффективный способ убрать лишние элементы из подменю — настроить командную панель вручную в конфигураторе:

  1. Откроем форму документа в конфигураторе.
  2. Выделим элемент ДействияФормы (командную панель).
  3. В палитре свойств снимем флаг «Автозаполнение».
  4. Сформируем состав командной панели вручную, добавив только те действия и подменю, которые действительно должны быть доступны пользователю.

Этот способ позволяет полностью контролировать состав кнопок и исключить автоматическое добавление подчиненных документов.

Решение 2. Программное удаление или очистка подменю

Если требуется скрыть подменю динамически в зависимости от условий, проанализируем варианты программной работы с коллекцией кнопок в обработчиках ПриОткрытии или ПередОткрытием.

Для полного удаления кнопки подменю из командной панели применимый код выглядит следующим образом:


ЭлементыФормы.ДействияФормы.Кнопки.Удалить(ЭлементыФормы.ДействияФормы.Кнопки.Подменю2);

Если необходимо оставить само название подменю, но сделать его пустым, используем очистку подчиненных элементов:

ЭлементыФормы.ДействияФормы.Кнопки.Подменю2.Кнопки.Очистить();

Пустое подменю перестанет разворачиваться при клике, и пользователи не смогут выбрать документ для ввода на основании.

Решение 3. Настройка списка оснований в конфигураторе и ролях

Посмотрим на административные методы ограничения ввода на основании, которые не требуют написания кода в форме:

  1. Редактирование состава оснований в объекте: В конфигураторе у вводимого документа в дереве метаданных можно открыть вкладку «Ввод на основании» и исключить исходный документ из списка Является основанием для.
  2. Настройка прав доступа (Роли): В ролях пользователей можно отключить право Интерактивный ввод на основании для конкретных типов документов. Платформа 1С автоматически скрывает из подменю те документы, на создание которых у текущего пользователя нет прав.

Решение 4. Блокировка ввода на стороне вводимого документа

Если необходимо запретить ввод на основании по определенному логическому условию (например, в зависимости от статуса или суммы заказа-основания), лучшей практикой является проверка в модуле объекта создаваемого документа.

В событии ОбработкаЗаполнения создаваемого документа проверяем условие и при необходимости отменяем операцию:


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

Вызов исключения гарантированно заблокирует создание нового документа как при вызове из интерактивного подменю, так и при программном вводе на основании.

← На главную