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