К статье
Практический материал

Разработка и Конфигурация · 14 мин

Как передать параметры между формами 1С

Способы передачи параметров между формами 1С: структура параметров, ОткрытьФорму, ОписаниеОповещения, обработчики ПриСозданииНаСервере, примеры кода и типичные ошибки.

Передача параметров между формами — одна из базовых операций при разработке на платформе 1С:Предприятие. Она нужна везде: при открытии формы элемента справочника с фильтром, при выборе значения в подчинённой форме, при открытии отчёта с предустановленными отборами, при организации мастеров и диалогов. Понимание механизма параметров избавляет от «костылей» с глобальными переменными и обращениями напрямую к реквизитам чужой формы.

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

Ниже разобраны все основные способы: передача параметров при открытии формы, получение результата при закрытии, обмен между уже открытыми формами, а также типичные ошибки и ограничения каждого подхода.

Как устроен механизм параметров формы

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

Важное следствие: если нужно хранить переданное значение в течение всей жизни формы, его необходимо либо объявить в параметрах формы с установленным признаком «Ключевой параметр» или без него, либо вручную скопировать в реквизит формы в обработчике ПриСозданииНаСервере. Иначе при следующем обращении к Параметры.ИмяПараметра вы получите ошибку или пустое значение.

Передача параметров при открытии формы

Основной инструмент — метод ОткрытьФорму. Вторым аргументом он принимает структуру параметров. Типичный код на клиенте выглядит так:

&НаКлиенте

Процедура ОткрытьПодбор(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Организация", Объект.Организация);

ПараметрыФормы.Вставить("Склад", Объект.Склад);

ПараметрыФормы.Вставить("РежимПодбора", Истина);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора", ПараметрыФормы, ЭтотОбъект);

КонецПроцедуры

Третий аргумент — владелец формы. Он важен по двум причинам: во-первых, при закрытии владельца закроется и подчинённая форма; во-вторых, именно владелец получит оповещения о выборе, если открытая форма работает в режиме выбора. В качестве владельца обычно указывают ЭтотОбъект или конкретный элемент формы (например, поле ввода), если выбор должен попасть в это поле стандартным образом.

Принимающая сторона обрабатывает параметры так:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Организация") Тогда

ОтборОрганизация = Параметры.Организация;

КонецЕсли;

Если Параметры.Свойство("РежимПодбора") Тогда

УстановитьРежимПодбора();

КонецЕсли;

КонецПроцедуры

Всегда проверяйте наличие параметра через Свойство() — форма может быть открыта и без параметров, например из интерфейса пользователя. Обращение к несуществующему свойству структуры вызовет ошибку.

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

Стандартные параметры: Ключ, Отбор, ЗначенияЗаполнения

Для объектных форм (элементы справочников, документы) платформа автоматически понимает ряд стандартных параметров, и объявлять их вручную не нужно. Параметр «Ключ» открывает существующий объект по ссылке, «ЗначенияЗаполнения» — структура для заполнения реквизитов нового объекта, «Основание» — объект-основание для ввода на основании, «Отбор» — отбор динамического списка для форм списка.

// Открыть список с отбором

Отбор = Новый Структура("Контрагент", ВыбранныйКонтрагент);

ПараметрыФормы = Новый Структура("Отбор", Отбор);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы);

// Создать новый документ с заполненными реквизитами

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);

ЗначенияЗаполнения.Вставить("Склад", ОсновнойСклад);

ОткрытьФорму("Документ.ПоступлениеТоваров.ФормаОбъекта",

Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения));

У параметра «Отбор» есть ограничение: отбирать можно только по тем полям, для которых в динамическом списке разрешён отбор, а сам отбор носит фиксированный характер — пользователь не сможет его снять, если не предусмотреть это отдельно. Для гибких отборов, которые пользователь может менять, передавайте значения и устанавливайте отбор программно через настройки компоновки данных списка.

Сравнение способов передачи

Структура параметров в ОткрытьФорму

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

Стандартные параметры (Ключ, Отбор, ЗначенияЗаполнения)

Для объектных форм и списков. Работают без объявления, но набор фиксирован

ОписаниеОповещения

Для получения результата после закрытия. Требует асинхронного мышления, нельзя получить значение синхронно

Оповестить / ОбработкаОповещения

Для обмена между уже открытыми формами. Не гарантирует, что форма-получатель существует

Параметры сеанса / ХранилищеНастроек

Для глобальных данных сеанса. Не подходит для разовой передачи между двумя формами

Получение результата из открытой формы

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

&НаКлиенте

Процедура ВыбратьКонтрагента(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);

ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , ЭтотОбъект, , , ,

Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте

Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

Объект.Контрагент = Результат;

КонецЕсли;

КонецПроцедуры

Чтобы результат дошёл до вызывающей стороны, открытая форма должна либо вызвать ОповеститьОВыборе(Значение) — это стандартный путь для форм выбора, либо закрыться с параметром: Закрыть(РезультатРаботы). Значение, переданное в Закрыть(), попадёт в обработчик оповещения как аргумент Результат.

Возврат сложного результата

Если нужно вернуть не одно значение, а набор данных, передавайте в Закрыть() структуру. Учтите, что для толстого клиента и веб-клиента состав передаваемых типов ограничен: ссылки, примитивные типы, структуры, массивы и таблицы значений передаются, а вот объекты типа ДанныеФормыСтруктура — нет, их нужно предварительно преобразовать.

&НаКлиенте

Процедура КомандаГотово(Команда)

Результат = Новый Структура;

Результат.Вставить("Контрагент", ВыбранныйКонтрагент);

Результат.Вставить("Договор", ВыбранныйДоговор);

Результат.Вставить("Комментарий", КомментарийВыбора);

Закрыть(Результат);

КонецПроцедуры

Обмен данными между уже открытыми формами

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

// Форма-источник

Оповестить("ПодобранаНоменклатура",

Новый Структура("Номенклатура,Количество", Товар, 5), ЭтотОбъект);

// Форма-приёмник

&НаКлиенте

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ПодобранаНоменклатура" Тогда

ДобавитьСтрокуТовара(Параметр.Номенклатура, Параметр.Количество);

КонецЕсли;

КонецПроцедуры

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

Ограничение подхода: Оповестить работает по принципу «выстрелил и забыл». Если форма-приёмник в этот момент закрыта, сообщение просто потеряется. Для надёжного обмена используйте оповещение о выборе с владельцем или запись данных в базу с последующим ОповеститьОбИзменении.

Типичные ошибки
01
Обращение к Параметры.Имя без проверки Свойство() — ошибка при открытии формы без параметров
02
Использование параметра после создания формы, хотя он не объявлен и не сохранён в реквизит — значение теряется
03
Ожидание результата сразу после ОткрытьФорму — форма открывается асинхронно, результат доступен только в обработчике оповещения
04
Передача мутабельных объектов формы между окнами вместо ссылок и примитивов — ошибки сериализации
05
Одинаковые имена событий Оповестить в разных механизмах без проверки Источника — форма реагирует на чужие сообщения
06
Забытый Экспорт у процедуры-обработчика оповещения — платформа не сможет её вызвать

Передача параметров в отчёты и динамические списки

Отдельный частый сценарий — открыть отчёт с уже установленными параметрами и отборами. Для отчётов на СКД параметры передаются через стандартные ключи структуры: «Отбор» и «СформироватьПриОткрытии». Признак СформироватьПриОткрытии = Истина заставляет отчёт выполниться сразу, без нажатия кнопки «Сформировать».

Отбор = Новый Структура("Номенклатура", ТекущаяНоменклатура);

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Отбор);

ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);

ПараметрыФормы.Вставить("КлючВарианта", "ОстаткиПоСкладам");

ОткрытьФорму("Отчет.ОстаткиТоваров.Форма", ПараметрыФормы);

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

Контрольные точки

Как проверить результат

Форма открылась с параметрами
Норма

Реквизиты заполнены переданными значениями, список отфильтрован

Тревожный признак

Поля пустые или отбор не применён — параметры не дошли или не обработаны

Форма без параметров
Норма

Открывается в режиме по умолчанию без ошибок

Тревожный признак

Ошибка обращения к свойству структуры — нет проверки Свойство()

Возврат результата
Норма

Обработчик оповещения вызывается, Результат содержит ожидаемое значение

Тревожный признак

Обработчик не вызывается — форма закрыта без Закрыть(Результат) или ОповеститьОВыборе

Особые случаи и ограничения платформы

Ключевая уникальность формы определяется её ключевыми параметрами. Если вы открываете форму с тем же набором ключевых параметров, что и у уже открытой, платформа не создаст новое окно, а активирует существующее. Это удобно для форм элементов (один элемент — одно окно), но мешает, когда нужно открыть несколько одинаковых форм с разными произвольными параметрами. Решение — добавить в структуру уникальный ключ: Новый УникальныйИдентификатор передаётся в параметр «КлючУникальности» или просто как произвольный уникальный параметр.

Ещё одна граница — толщина клиента. В веб-клиенте и тонком клиенте между клиентом и сервером передаются только сериализуемые значения. Нельзя передать в параметры формы, например, объект СправочникОбъект — только ссылку. Если нужно передать набор строк, используйте массив структур или таблицу значений, помещённую во временное хранилище с передачей адреса.

Для больших объёмов данных (например, подобранная таблица из тысяч строк) правильный паттерн такой: на сервере открываемой формы данные помещаются во временное хранилище методом ПоместитьВоВременноеХранилище с указанием УникальныйИдентификатор формы, а вызывающей форме возвращается только адрес хранилища. Вызывающая форма забирает данные через ПолучитьИзВременногоХранилища.

Итог

Что важно запомнить

Передача при открытии — структура параметров в ОткрытьФорму и обработка в ПриСозданииНаСервере с проверкой Свойство(). Возврат результата — ОписаниеОповещения и Закрыть(Результат) или ОповеститьОВыборе. Обмен между открытыми формами — Оповестить и ОбработкаОповещения с фильтрацией по источнику. Долгоживущие значения сохраняйте в реквизиты формы, большие данные — во временное хранилище.

Частые вопросы

Как передать параметр в форму, которая уже открыта?

Используйте метод Оповестить с уникальным именем события и параметром, а в целевой форме обработайте событие в ОбработкаОповещения. Чтобы не перепутать источники, передавайте третьим аргументом ссылку на форму-источник и проверяйте её в приёмнике.

Почему параметр доступен в ПриСозданииНаСервере, но теряется потом?

Коллекция Параметры очищается после создания формы, если параметр не объявлен в редакторе формы. Решение: объявите параметр в палитре свойств формы либо скопируйте значение в реквизит формы в обработчике ПриСозданииНаСервере.

Как открыть форму списка с отбором, который пользователь сможет снять?

Стандартный параметр «Отбор» делает отбор фиксированным. Для снимаемого отбора передайте значение как произвольный параметр и в ПриСозданииНаСервере установите отбор через элементы настроек компоновки данных динамического списка — такой отбор пользователь сможет изменить или отключить.

Можно ли получить результат из формы синхронно, без оповещения?

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

Как передать таблицу значений между формами?

Поместите таблицу во временное хранилище методом ПоместитьВоВременноеХранилище с указанием уникального идентификатора формы-получателя, а саму форму откройте с параметром-адресом хранилища. Получатель заберёт данные через ПолучитьИзВременногоХранилища в ПриСозданииНаСервере.

Почему вместо нового окна активируется уже открытая форма?

Платформа объединяет формы с одинаковыми ключевыми параметрами. Чтобы открыть независимый экземпляр, передайте в структуре параметров ключ «КлючУникальности» со значением Новый УникальныйИдентификатор — тогда каждая форма будет открываться в отдельном окне.