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