Как на управляемой форме 1С отследить нажатие на кнопку и изменить её доступность?

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

При переходе с обычных форм или других языков программирования на управляемые формы платформы 1С:Предприятие 8.3 разработчики часто ищут прямое событие нажатия на кнопку (аналог OnClick). Однако модель управляемого интерфейса устроена иначе: элементы формы типа КнопкаФормы не имеют собственных событий нажатия, а связываются с командами формы или стандартными командами платформы.

Рассмотрим подробнее архитектурные особенности управляемых форм, разберем способы обработки нажатия кнопок и выясним, как решить задачу отключения кнопки (например, стандартной команды «Перечитать») после клика пользователя.

Особенности работы кнопок и команд в управляемых формах

Проанализируем ключевые принципы взаимодействия элементов интерфейса в управляемом приложении:

  1. Разделение кнопки и действия: Кнопка на форме выступает лишь визуальным отображением команды. Логика действия привязана не к самому элементу, а к объекту КомандаФормы через свойство ИмяКоманды.
  2. Стандартные команды: У стандартных команд формы (таких как «Перечитать», «Записать», «Записать и закрыть») нет прямого клиентского обработчика в модуле формы, который можно было бы переопределить в свойствах.
  3. Управление доступностью: Свойство Доступность можно изменять как у конкретного элемента формы (Элементы.ИмяКнопки.Доступность), так и у всей команды (Команды.ИмяКоманды.Доступность). При отключении доступности команды автоматически блокируются все связанные с ней кнопки и пункты меню.

Способ 1. Замена стандартной команды на пользовательскую команду формы

Разберем по шагам наиболее универсальный и рекомендуемый способ, когда необходимо выполнить произвольный код при нажатии (например, заблокировать кнопку от повторного клика и выполнить перечитывание данных):

  1. Откроем редактор управляемой формы в конфигураторе и перейдем на вкладку Команды.
  2. Создадим новую команду формы, например ПеречитатьДанные.
  3. В свойствах команды нажмем на лупу возле поля Действие и создадим клиентский обработчик процедуры.
  4. Перейдем на вкладку Элементы, скроем стандартную кнопку (установим свойство Видимость = Ложь у стандартной кнопки или отключим автозаполнение командной панели) и перетащим нашу команду ПеречитатьДанные на форму.
  5. В модуле формы опишем отключение доступности и вызов метода Прочитать():

&НаКлиенте
Процедура ПеречитатьДанные(Команда)
    
    // Отключаем доступность команды для предотвращения повторных нажатий
    Команды.ПеречитатьДанные.Доступность = Ложь;
    
    // Вызываем стандартный метод формы для перечитывания объекта из базы данных
    Прочитать();
    
КонецПроцедуры

Способ 2. Блокировка кнопки через серверное событие ПриЧтенииНаСервере

Если на форме используется стандартная кнопка «Перечитать» и создавать отдельную команду нежелательно, проанализируем поведение платформы. При выполнении стандартной команды «Перечитать» всегда инициируется событие формы ПриЧтенииНаСервере. Мы можем использовать этот момент для изменения состояния элементов формы.

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


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    // Блокируем элемент стандартной кнопки на командной панели
    Элементы.ФормаПеречитать.Доступность = Ложь;
    
КонецПроцедуры

Способ 3. Отслеживание нажатия произвольной пользовательской кнопки

Когда требуется обработать нажатие любой произвольной кнопки и заблокировать ее на время выполнения операции, создаем команду формы и управляем доступностью элемента напрямую:


&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
    
    // Блокируем конкретную кнопку на форме
    Элементы.КнопкаВыполнитьОбработку.Доступность = Ложь;
    
    // Выполняем требуемые прикладные действия на сервере
    ВыполнитьДействиеНаСервере();
    
КонецПроцедуры

Важный нюанс: Если требуется снова вернуть доступность кнопке после завершения длительной операции или при изменении пользователем данных на форме, используйте обработчики событий элементов ПриИзменении, события формы ПослеЗаписи или фоновые задания с методом ПодключитьОбработчикОжидания.

← На главную