Как правильно передать данные и команды между формами в 1С:Управляемые формы?

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

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

Способ 1: Использование механизма оповещений

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

Разберем реализацию этого метода по шагам:

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

Способ 2: Передача параметров при открытии формы

Если нам необходимо передать данные (например, Объект.Ссылка) из основной формы в открываемую, мы используем второй параметр метода ОткрытьФорму. Это позволяет новой форме сразу получить доступ к необходимым объектам.

Посмотрим, как организовать передачу данных:

  1. При открытии формы из основной:
    
    &НаКлиенте
    Процедура ОткрытьДополнительнуюФорму(Команда)
        ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка);
        ОткрытьФорму("Документ.ТелефонныйЗвонок.Форма.ВтораяФорма", ПараметрыФормы);
    КонецПроцедуры
    
  2. Использование зарезервированного параметра Ключ позволяет платформе автоматически найти объект и заполнить соответствующие данные в открываемой форме, если она является формой объекта.

Способ 3: Использование временного хранилища

В случаях, когда данные имеют большой объем или представляют собой сложную структуру, которую нецелесообразно передавать через параметры открытия, мы используем ПоместитьВоВременноеХранилище.

Алгоритм действий:

Способ 4: Использование реквизитов формы

Если форма уже открыта или мы управляем её жизненным циклом, можно использовать реквизиты. После открытия формы мы можем программно установить значение в реквизит с помощью ЗначениеВРеквизитФормы. Это позволяет динамически наполнять открытую форму данными из основной.

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

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

  1. Не пытайтесь вызывать код одной формы из другой напрямую — это нарушает принципы инкапсуляции.
  2. Вынесите бизнес-логику (например, создание сделки) в общий модуль.
  3. В этом случае и основная, и вторая форма будут обращаться к одной и той же серверной функции общего модуля, что исключит необходимость сложных «сигнальных» схем между формами.

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

← На главную