В процессе разработки часто возникает задача взаимодействия между формами. Например, из одной обработки нам необходимо запустить выполнение действий, которые обычно вызываются нажатием кнопки в другой форме. Рассмотрим подробнее, как реализовать такую задачу программно, какие подходы существуют и какие методы платформы помогут нам в этом деле. В качестве альтернативного интерфейсного подхода для совместной работы форм можно использовать метод встраивания одной формы в другую.
Самый простой и надежный способ вызвать функционал другой формы — это обращение к экспортной процедуре или функции. Для этого необходимо, чтобы процедура в модуле формы была объявлена с ключевым словом Экспорт. Это делает её доступной для вызова из любого другого внешнего модуля, в том числе из другой обработки.
Рассмотрим по шагам, как это сделать:
Экспорт в заголовок процедуры.Пример реализации в модуле вызываемой формы:
Процедура ВыполнитьДействиеЭкспорт() Экспорт
// Логика, которую нужно выполнить
Сообщить("Действие выполнено успешно!");
КонецПроцедуры
Пример вызова из основной обработки:
ФормаОбъекта = ПолучитьФорму("Обработка.ИмяВашейОбработки.Форма.ИмяФормы");
ФормаОбъекта.Открыть();
ФормаОбъекта.ВыполнитьДействиеЭкспорт();
Если по какой-то причине вы не можете изменить исходный код формы и добавить Экспорт к нужной процедуре, можно пойти по пути имитации действия пользователя. Этот метод основан на получении ссылки на действие кнопки через свойства элементов формы.
Разберем пример кода, который позволяет выполнить действие, привязанное к кнопке:
Форма_1 = ЭтотОбъект.ПолучитьФорму("Форма_1");
ВрмЭлемент = Форма_1.ЭлементыФормы.кВыполнить;
ВрмДействие = ВрмЭлемент.ПолучитьДействие("Нажатие");
Выполнить("Форма_1." + Строка(ВрмДействие) + "(ВрмЭлемент)");
Важное примечание: Данный метод требует наличия процедуры-обработчика нажатия, которая в идеале также должна быть экспортной, чтобы избежать ошибок контекста.
Для продвинутых задач, когда требуется имитировать нажатие кнопки так, будто на неё действительно кликнул пользователь, можно воспользоваться техникой переопределения стандартных действий формы. Рассмотрим универсальную процедуру для таких целей:
Процедура ИнтерактивноНажатьКнопку(Кнопка, ФормаКнопки) Экспорт
Действие = Кнопка.ПолучитьДействие("Нажатие");
буфДействие = ФормаКнопки.ПолучитьДействие("ПриПовторномОткрытии");
ФормаКнопки.УстановитьДействие("ПриПовторномОткрытии", Действие);
Попытка
ФормаКнопки.Открыть();
ФормаКнопки.УстановитьДействие("ПриПовторномОткрытии", буфДействие);
Исключение
ФормаКнопки.УстановитьДействие("ПриПовторномОткрытии", буфДействие);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Применяя этот метод, мы временно подменяем обработчик события ПриПовторномОткрытии на действие нашей кнопки, что позволяет запустить логику кнопки в момент открытия формы.
Еще один интересный способ — использование метода ПодключитьОбработчикИзмененияДанных. Этот подход полезен, если вам нужно вызвать логику кнопки при изменении конкретного реквизита на форме:
ФК = Контрагент.ПолучитьФорму();
ФК.ПодключитьОбработчикИзмененияДанных("Наименование", "ЗаполнитьПоИНННажатие", Ложь);
ФК.Открыть();
// При изменении данных сработает нужная процедура
Хотя вышеперечисленные способы позволяют решить задачу программного нажатия, помните, что:
Оповестить() и ОбработкаОповещения(). Это стандартный и наиболее чистый архитектурный путь.Используя эти методы, вы сможете гибко управлять поведением интерфейса в 1С и успешно автоматизировать любые бизнес-процессы.