Как передать параметры из одной формы в другую в обычных формах 1С?

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

В практике разработки на платформе «1С:Предприятие 8» при использовании обычных форм часто возникает задача передать данные (например, номер документа, дату или ссылку) из одной формы в другую. Это необходимо для того, чтобы во второй форме при её инициализации автоматически выполнялись запросы или заполнялись реквизиты на основании полученных данных. Рассмотрим подробнее, как реализовать этот механизм различными способами, разберем по шагам логику взаимодействия объектов и проанализируем возможные ошибки.

Способ 1. Прямое присвоение значений реквизитам формы

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


// В исходной форме (например, форме списка)
ФормаПриемник = РегистрыСведений.ПланОтгрузки.ПолучитьФорму("ФормаВыбораПриСозданииСертификата");

// Передаем данные напрямую в реквизиты формы-приемника
ФормаПриемник.НомерДокумента = ТекущиеДанные.Номер;
ФормаПриемник.ДатаДокумента  = ТекущиеДанные.Дата;

// Теперь, когда данные переданы, открываем форму
ФормаПриемник.ОткрытьМодально();

Проанализируем ситуацию: в данном случае ФормаВыбораПриСозданииСертификата должна иметь соответствующие реквизиты (НомерДокумента и ДатаДокумента), добавленные на закладке «Реквизиты» в редакторе формы. Обратите внимание, что после вызова метода Открыть() или ОткрытьМодально() в форме-приемнике сработает событие ПриОткрытии, где эти данные уже будут доступны для использования в запросах.

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

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

Шаг 1. Подготовка в форме-приемнике:

В самом верху модуля формы объявим переменную или создадим процедуру:


Перем ЭкспортныйПараметр Экспорт;

Процедура ИнициализироватьФорму(ПараметрыЗапроса) Экспорт
    // Здесь можно сразу настроить запрос или фильтры
    НомерДока = ПараметрыЗапроса.Номер;
    ДатаДока  = ПараметрыЗапроса.Дата;
КонецПроцедуры

Шаг 2. Вызов из исходной формы:


Форма = ПолучитьФорму("ИмяНужнойФормы");
// Можно присвоить значение переменной
Форма.ЭкспортныйПараметр = "Значение";
// Или вызвать экспортную процедуру
СтруктураДанных = Новый Структура("Номер, Дата", ТекущийНомер, ТекущаяДата);
Форма.ИнициализироватьФорму(СтруктураДанных);
Форма.Открыть();

Способ 3. Передача данных через «Владельца формы»

Рассмотрим ситуацию, когда форма-приемник должна сама «уметь» забирать данные из той формы, которая её открыла. В 1С существует понятие ВладелецФормы. Когда мы открываем форму, мы можем явно указать, какая форма является для неё родительской.

  1. При открытии указываем владельца: Форма = ПолучитьФорму("ФормаПриемник", ЭтаФорма);
  2. В модуле формы-приемника обращаемся к данным через свойство ВладелецФормы.

Пример кода в форме-приемнике:


Процедура ПриОткрытии()
    Если ВладелецФормы <> Неопределено Тогда
        // Пытаемся получить данные из элементов формы владельца
        Попытка
            НомерИзРодителя = ВладелецФормы.НомерДокумента;
        Исключение
            // Обработка случая, если у владельца нет такого реквизита
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

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

Особенности событийного цикла: ПередОткрытием и ПриОткрытии

При реализации передачи параметров крайне важно понимать порядок инициализации объектов в платформе. Посмотрим на последовательность действий:

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

Часто требуется не только передать данные «туда», но и получить результат выбора обратно. Если вы используете ОткрытьМодально(), форма-приемник может возвращать значение. Рассмотрим пример:

В форме-приемнике при нажатии кнопки «Ок»:


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

В основной форме получение этого результата выглядит так:


Ответ = ФормаПриемник.ОткрытьМодально();
Если ТипЗнч(Ответ) = Тип("Структура") Тогда
    Сообщить(Ответ.Сообщение);
КонецЕсли;

Подведем итог: для работы в обычных формах наиболее надежным и гибким методом является прямое обращение к реквизитам или экспортным процедурам полученной формы перед её открытием. Это обеспечивает прозрачность кода и позволяет легко отлаживать процесс передачи данных.

← На главную