Как передать параметры между обычными формами в 1С?

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

При переходе с управляемых форм на обычные или при поддержке типовых конфигураций на обычном приложении (например, 1С:УПП 1.3 или 1С:КА 1.1) разработчики часто сталкиваются с ошибкой при попытке передать параметры в форму. Попробуем разобраться, почему привычный механизм передачи структуры в метод ПолучитьФорму() не срабатывает в толстом клиенте обычного приложения, и рассмотрим правильные варианты реализации этой задачи.

В чем причина ошибки при передаче структуры параметров

В управляемом интерфейсе метод ПолучитьФорму() принимает вторым параметром структуру параметров формы. Однако в обычном приложении сигнатура функции выглядит иначе:

ПолучитьФорму(ИмяФормы, Владелец, КлючУникальности)

Второй параметр здесь предназначен для указания владельца открываемой формы (например, другой формы или элемента управления). Если передать туда структуру, платформа воспримет её как некорректно заданного владельца, а свойства структуры не попадут в открываемое окно. Кроме того, в обычных формах отсутствует стандартная системная коллекция Параметры, поэтому обращение к ней вызывает ошибку Поле объекта не обнаружено (Параметры).

Рассмотрим по шагам основные и наиболее удобные способы передачи данных в форму обычного приложения.

Способ 1. Использование экспортной переменной формы

Самый простой и распространенный способ — объявить экспортную переменную в модуле открываемой формы и присвоить ей значение после получения формы, но до ее открытия.

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

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

Код, расположенный между вызовом ПолучитьФорму() и методом Открыть() (или ОткрытьМодально()), выполняется до срабатывания обработчиков событий ПередОткрытием и ПриОткрытии. Поэтому переданные данные гарантированно будут доступны уже на этапе инициализации интерфейса.

Способ 2. Использование экспортной процедуры инициализации

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

Посмотрим на пример кода:

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

Способ 3. Передача данных через объект обработки

Если передаваемые данные требуются не только в логике элементов формы, но и в методах модуля объекта обработки (например, для проведения сложных фоновых расчетов или формирования отчетов), правильнее создать сам объект обработки и заполнить его реквизиты.

Проанализируем этот подход:

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

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

Возврат результата из открытой формы

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

  1. В открываемой форме при нажатии кнопки выбора или завершения операции вызываем метод закрытия с передачей значения:
    
    Процедура КнопкаВыбратьНажатие(Элемент)
        Результат = Новый Структура("ВыбранноеЗначение", ПолеВвода);
        Закрыть(Результат);
    КонецПроцедуры
    
  2. В вызывающей форме считываем возвращенный результат работы:
    
    Форма = Обработки.Новая.ПолучитьФорму("Форма");
    Форма.мПараметры = СтруктураПараметров;
    РезультатВыбора = Форма.ОткрытьМодально();
    
    Если РезультатВыбора <> Неопределено Тогда
        // Обрабатываем возвращенные данные
        Сообщить(РезультатВыбора.ВыбранноеЗначение);
    КонецЕсли;
    

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

← На главную