Как программно нажать кнопку или вызвать процедуру другой формы в 1С?

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

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

Использование экспортных процедур

Самый простой и надежный способ вызвать функционал другой формы — это обращение к экспортной процедуре или функции. Для этого необходимо, чтобы процедура в модуле формы была объявлена с ключевым словом Экспорт. Это делает её доступной для вызова из любого другого внешнего модуля, в том числе из другой обработки.

Рассмотрим по шагам, как это сделать:

  1. В модуле формы, которую мы открываем, находим процедуру, привязанную к кнопке, или создаем новую.
  2. Добавляем ключевое слово Экспорт в заголовок процедуры.
  3. В вызывающей форме получаем форму и вызываем этот метод напрямую.

Пример реализации в модуле вызываемой формы:


Процедура ВыполнитьДействиеЭкспорт() Экспорт
    // Логика, которую нужно выполнить
    Сообщить("Действие выполнено успешно!");
КонецПроцедуры

Пример вызова из основной обработки:


ФормаОбъекта = ПолучитьФорму("Обработка.ИмяВашейОбработки.Форма.ИмяФормы");
ФормаОбъекта.Открыть();
ФормаОбъекта.ВыполнитьДействиеЭкспорт();

Программная имитация нажатия кнопки

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

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


Форма_1 = ЭтотОбъект.ПолучитьФорму("Форма_1");
ВрмЭлемент = Форма_1.ЭлементыФормы.кВыполнить;
ВрмДействие = ВрмЭлемент.ПолучитьДействие("Нажатие");
Выполнить("Форма_1." + Строка(ВрмДействие) + "(ВрмЭлемент)");

Важное примечание: Данный метод требует наличия процедуры-обработчика нажатия, которая в идеале также должна быть экспортной, чтобы избежать ошибок контекста.

Интерактивное нажатие кнопки через переопределение действия

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


Процедура ИнтерактивноНажатьКнопку(Кнопка, ФормаКнопки) Экспорт
    Действие = Кнопка.ПолучитьДействие("Нажатие");
    буфДействие = ФормаКнопки.ПолучитьДействие("ПриПовторномОткрытии");
    ФормаКнопки.УстановитьДействие("ПриПовторномОткрытии", Действие);
    Попытка
        ФормаКнопки.Открыть();
        ФормаКнопки.УстановитьДействие("ПриПовторномОткрытии", буфДействие);
    Исключение
        ФормаКнопки.УстановитьДействие("ПриПовторномОткрытии", буфДействие);
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

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

Подключение обработчиков изменения данных

Еще один интересный способ — использование метода ПодключитьОбработчикИзмененияДанных. Этот подход полезен, если вам нужно вызвать логику кнопки при изменении конкретного реквизита на форме:


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

Рекомендации по архитектуре

Хотя вышеперечисленные способы позволяют решить задачу программного нажатия, помните, что:

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

← На главную