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