Как программно заблокировать кнопку действия или пункт меню в обычных формах 1С

Программист 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с «обычными формами» (в конфигурациях вроде УТ 10.3, УПП или УТП) разработчики часто сталкиваются с проблемой: попытка изменить свойство Доступность кнопки через коллекцию ЭтаФорма.ЭлементыФормы не дает результата или вызывает ошибку «Поле объекта не обнаружено». Это происходит потому, что архитектура элементов управления в обычных формах существенно отличается от управляемого интерфейса.

В этой статье мы подробно разберем, как правильно обращаться к кнопкам командных панелей, как блокировать вложенные подменю и как управлять контекстным меню в списках документов.

Разбор основной ошибки: почему цикл по элементам формы не видит кнопки

Рассмотрим ситуацию, с которой столкнулся автор темы. Он пытался перебрать элементы формы и найти среди них кнопку с именем Подменю1:


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

Проанализируем причину неудачи. В обычных формах объект ЭлементыФормы содержит только «высокоуровневые» элементы: табличные поля, поля ввода, надписи и — что важно — Командные панели. Сами кнопки не являются самостоятельными элементами формы; они принадлежат конкретной командной панели. Следовательно, искать их нужно внутри коллекции Кнопки соответствующей панели.

Правильный доступ к кнопкам командной панели

Чтобы изменить доступность кнопки, нам нужно сначала обратиться к панели, на которой она расположена. Допустим, на форме есть стандартная панель с именем ОсновныеДействия. Рассмотрим, как программно отключить кнопку на этой панели:


// Правильный способ обращения к кнопке
ЭтаФорма.ЭлементыФормы.ОсновныеДействия.Кнопки.Действия.Доступность = Ложь;

Если же кнопка находится внутри выпадающего списка (подменю), структура вложенности становится еще глубже. Выясним, как достучаться до конкретного пункта в меню «Действия». Каждая кнопка типа «Подменю» сама обладает коллекцией Кнопки.


// Пример блокировки пункта внутри подменю
// Иерархия: Панель -> Кнопка-Подменю -> Вложенная кнопка
ЭлементыФормы.ОсновныеДействия.Кнопки.Действия.Кнопки.УстановитьПометкуУдаления.Доступность = Ложь;

Как найти имя кнопки с помощью отладчика

Часто разработчик не знает точного программного имени кнопки, особенно если панель заполнена автоматически (свойство Автозаполнение). В этом случае перебор коллекции в коде — не самый эффективный путь. Проанализируем, как использовать отладчик для поиска нужного пути:

  1. Установим точку останова в процедуре ПриОткрытии или ПередОткрытием.
  2. Запустим выполнение и, когда программа остановится, откроем окно «Вычислить выражение» (Shift+F9).
  3. Введем ЭлементыФормы.ИмяВашейПанели.Кнопки и нажмем «Рассчитать».
  4. В дереве значений мы увидим все кнопки. Раскрывая их свойства, можно найти Имя и Текст, чтобы точно идентифицировать целевой элемент.

Блокировка контекстного меню и кнопок «Ввод на основании»

Отдельный вопрос касается контекстного меню (вызываемого правой кнопкой мыши) в списках документов. Автор темы справедливо заметил, что даже если скрыть кнопку на форме, она может остаться доступной в меню по правой кнопке или через подменю «Заполнить» / «Ввод на основании».

Разберем, как запретить ввод на основании для завершенных документов в списке. Для этого лучше всего использовать событие табличного поля ПриАктивизацииСтроки. Рассмотрим пример реализации:


Процедура СписокПриАктивизацииСтроки(Элемент)
    ТекущиеДанные = Элемент.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Проверяем условие, например, стадию заказа
    Если ТекущиеДанные.Стадия = Перечисления.Стадии.Завершен Тогда
        // Блокируем кнопку на основной панели
        ЭлементыФормы.ДействияСписка.Кнопки.ВвестиНаОсновании.Доступность = Ложь;
    Иначе
        ЭлементыФормы.ДействияСписка.Кнопки.ВвестиНаОсновании.Доступность = Истина;
    КонецЕсли;
КонецПроцедуры

Важный нюанс: В обычных формах контекстное меню табличного поля часто привязано к командной панели через свойство ИсточникДействий. Если вы программно отключаете кнопку на панели-источнике, она автоматически становится недоступной и в контекстном меню этого списка.

Радикальный способ: свойство ТолькоПросмотр

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

Посмотрим на применение свойства ТолькоПросмотр:


Если Объект.Завершен Тогда
    ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;

Установка ТолькоПросмотр = Истина для всей формы автоматически блокирует все элементы редактирования и большинство командных кнопок, связанных с изменением данных. Это самый надежный способ защиты от несанкционированных действий пользователя, так как он блокирует и горячие клавиши, которые могли бы сработать, если бы мы просто скрыли кнопку.

Резюме по шагам

Подведем итог наших действий для успешной блокировки кнопок в обычных формах:

  1. Определяем владельца: Кнопка всегда принадлежит КоманднойПанели.
  2. Проверяем вложенность: Если кнопка в подменю, обращаемся через Панель.Кнопки.Подменю.Кнопки.ИмяНужнойКнопки.
  3. Используем события: Для динамических списков используем ПриАктивизацииСтроки, чтобы менять доступность кнопок «на лету» в зависимости от данных строки.
  4. Не забываем про контекст: Убеждаемся, что у табличного поля заполнен ИсточникДействий, чтобы блокировка на панели синхронизировалась с меню правой кнопки мыши.
  5. Отладка — наш друг: Если имя кнопки неизвестно, используем табло отладчика для исследования коллекции Кнопки.

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

← На главную