Разработка и Конфигурация · 14 мин
Как передать параметры между формами 1С
Способы передачи параметров между формами 1С: структура параметров, ОткрытьФорму, ОписаниеОповещения, обработчики ПриСозданииНаСервере, примеры кода и типичные ошибки.
Передача параметров между формами — одна из базовых операций при разработке на платформе 1С:Предприятие. Она нужна везде: при открытии формы элемента справочника с фильтром, при выборе значения в подчинённой форме, при открытии отчёта с предустановленными отборами, при организации мастеров и диалогов. Понимание механизма параметров избавляет от «костылей» с глобальными переменными и обращениями напрямую к реквизитам чужой формы.
В управляемом приложении формы существуют на клиенте и на сервере, и прямой доступ из одной формы к данным другой ограничен. Поэтому платформа предлагает формальный контракт: передающая сторона формирует структуру параметров, открывающая сторона объявляет, какие параметры принимает, а возврат результата выполняется через оповещения или методы закрытия.
Ниже разобраны все основные способы: передача параметров при открытии формы, получение результата при закрытии, обмен между уже открытыми формами, а также типичные ошибки и ограничения каждого подхода.
Как устроен механизм параметров формы
Каждая форма в 1С имеет набор параметров, который складывается из двух частей: стандартные параметры, определяемые типом основного реквизита формы (например, «Ключ» для формы элемента справочника), и произвольные параметры, которые разработчик объявляет на закладке «Параметры» в редакторе формы. Если параметр с таким именем не объявлен, но передан при открытии, он всё равно доступен через коллекцию Параметры в обработчике ПриСозданииНаСервере — однако после создания формы неучтённые параметры удаляются.
Важное следствие: если нужно хранить переданное значение в течение всей жизни формы, его необходимо либо объявить в параметрах формы с установленным признаком «Ключевой параметр» или без него, либо вручную скопировать в реквизит формы в обработчике ПриСозданииНаСервере. Иначе при следующем обращении к Параметры.ИмяПараметра вы получите ошибку или пустое значение.
Передача параметров при открытии формы
Основной инструмент — метод ОткрытьФорму. Вторым аргументом он принимает структуру параметров. Типичный код на клиенте выглядит так:
&НаКлиенте
Процедура ОткрытьПодбор(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Организация", Объект.Организация);
ПараметрыФормы.Вставить("Склад", Объект.Склад);
ПараметрыФормы.Вставить("РежимПодбора", Истина);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
Третий аргумент — владелец формы. Он важен по двум причинам: во-первых, при закрытии владельца закроется и подчинённая форма; во-вторых, именно владелец получит оповещения о выборе, если открытая форма работает в режиме выбора. В качестве владельца обычно указывают ЭтотОбъект или конкретный элемент формы (например, поле ввода), если выбор должен попасть в это поле стандартным образом.
Принимающая сторона обрабатывает параметры так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Организация") Тогда
ОтборОрганизация = Параметры.Организация;
КонецЕсли;
Если Параметры.Свойство("РежимПодбора") Тогда
УстановитьРежимПодбора();
КонецЕсли;
КонецПроцедуры
Всегда проверяйте наличие параметра через Свойство() — форма может быть открыта и без параметров, например из интерфейса пользователя. Обращение к несуществующему свойству структуры вызовет ошибку.
- 1Сформируйте структуру с нужными ключами и значениями на передающей стороне
- 2Вызовите ОткрытьФорму, указав имя формы, структуру параметров и владельца
- 3В открываемой форме в ПриСозданииНаСервере проверьте параметры через Параметры.Свойство()
- 4Сохраните нужные значения в реквизиты формы для дальнейшего использования
- 5Проверьте открытие формы и без параметров — она не должна падать
Стандартные параметры: Ключ, Отбор, ЗначенияЗаполнения
Для объектных форм (элементы справочников, документы) платформа автоматически понимает ряд стандартных параметров, и объявлять их вручную не нужно. Параметр «Ключ» открывает существующий объект по ссылке, «ЗначенияЗаполнения» — структура для заполнения реквизитов нового объекта, «Основание» — объект-основание для ввода на основании, «Отбор» — отбор динамического списка для форм списка.
// Открыть список с отбором
Отбор = Новый Структура("Контрагент", ВыбранныйКонтрагент);
ПараметрыФормы = Новый Структура("Отбор", Отбор);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы);
// Создать новый документ с заполненными реквизитами
ЗначенияЗаполнения = Новый Структура;
ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);
ЗначенияЗаполнения.Вставить("Склад", ОсновнойСклад);
ОткрытьФорму("Документ.ПоступлениеТоваров.ФормаОбъекта",
Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения));
У параметра «Отбор» есть ограничение: отбирать можно только по тем полям, для которых в динамическом списке разрешён отбор, а сам отбор носит фиксированный характер — пользователь не сможет его снять, если не предусмотреть это отдельно. Для гибких отборов, которые пользователь может менять, передавайте значения и устанавливайте отбор программно через настройки компоновки данных списка.
Сравнение способов передачи
Универсальный способ при открытии. Ограничение: параметры живут только до конца создания формы
Для объектных форм и списков. Работают без объявления, но набор фиксирован
Для получения результата после закрытия. Требует асинхронного мышления, нельзя получить значение синхронно
Для обмена между уже открытыми формами. Не гарантирует, что форма-получатель существует
Для глобальных данных сеанса. Не подходит для разовой передачи между двумя формами
Получение результата из открытой формы
В управляемом приложении нельзя открыть форму модально и сразу получить возвращённое значение в той же строке кода, как это было в обычных формах. Вместо этого используется асинхронная модель: при открытии формы передаётся описание оповещения — указание, какую процедуру вызвать, когда форма закроется с результатом.
&НаКлиенте
Процедура ВыбратьКонтрагента(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);
ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , ЭтотОбъект, , , ,
Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
Объект.Контрагент = Результат;
КонецЕсли;
КонецПроцедуры
Чтобы результат дошёл до вызывающей стороны, открытая форма должна либо вызвать ОповеститьОВыборе(Значение) — это стандартный путь для форм выбора, либо закрыться с параметром: Закрыть(РезультатРаботы). Значение, переданное в Закрыть(), попадёт в обработчик оповещения как аргумент Результат.
Возврат сложного результата
Если нужно вернуть не одно значение, а набор данных, передавайте в Закрыть() структуру. Учтите, что для толстого клиента и веб-клиента состав передаваемых типов ограничен: ссылки, примитивные типы, структуры, массивы и таблицы значений передаются, а вот объекты типа ДанныеФормыСтруктура — нет, их нужно предварительно преобразовать.
&НаКлиенте
Процедура КомандаГотово(Команда)
Результат = Новый Структура;
Результат.Вставить("Контрагент", ВыбранныйКонтрагент);
Результат.Вставить("Договор", ВыбранныйДоговор);
Результат.Вставить("Комментарий", КомментарийВыбора);
Закрыть(Результат);
КонецПроцедуры
Обмен данными между уже открытыми формами
Если обе формы уже открыты и нужно передать данные без закрытия, используются методы Оповестить и ОповеститьОбИзменении. Первая форма вызывает Оповестить с именем события и параметром, а вторая получает его в обработчике ОбработкаОповещения:
// Форма-источник
Оповестить("ПодобранаНоменклатура",
Новый Структура("Номенклатура,Количество", Товар, 5), ЭтотОбъект);
// Форма-приёмник
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ПодобранаНоменклатура" Тогда
ДобавитьСтрокуТовара(Параметр.Номенклатура, Параметр.Количество);
КонецЕсли;
КонецПроцедуры
Третий аргумент Оповестить — источник — позволяет приёмнику фильтровать события: например, реагировать только на оповещения от конкретной формы подбора. Это критично, когда одно и то же имя события могут генерировать разные окна. Имена событий лучше выносить в общий модуль как функции-константы, чтобы избежать расхождений из-за опечаток в строковых литералах.
Ограничение подхода: Оповестить работает по принципу «выстрелил и забыл». Если форма-приёмник в этот момент закрыта, сообщение просто потеряется. Для надёжного обмена используйте оповещение о выборе с владельцем или запись данных в базу с последующим ОповеститьОбИзменении.
Передача параметров в отчёты и динамические списки
Отдельный частый сценарий — открыть отчёт с уже установленными параметрами и отборами. Для отчётов на СКД параметры передаются через стандартные ключи структуры: «Отбор» и «СформироватьПриОткрытии». Признак СформироватьПриОткрытии = Истина заставляет отчёт выполниться сразу, без нажатия кнопки «Сформировать».
Отбор = Новый Структура("Номенклатура", ТекущаяНоменклатура);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Отбор);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыФормы.Вставить("КлючВарианта", "ОстаткиПоСкладам");
ОткрытьФорму("Отчет.ОстаткиТоваров.Форма", ПараметрыФормы);
Если нужно установить не отбор, а параметр СКД (например, период отчёта), стандартного ключа нет — параметр устанавливают в обработчике ПриСозданииНаСервере формы отчёта через КомпоновщикНастроек. Для этого передают произвольный параметр (например, «ПериодОтчета») и в форме отчёта программно находят элемент настроек и присваивают значение. В типовых конфигурациях часто есть готовые процедуры для этого в модулях менеджеров отчётов.
Как проверить результат
Реквизиты заполнены переданными значениями, список отфильтрован
Поля пустые или отбор не применён — параметры не дошли или не обработаны
Открывается в режиме по умолчанию без ошибок
Ошибка обращения к свойству структуры — нет проверки Свойство()
Обработчик оповещения вызывается, Результат содержит ожидаемое значение
Обработчик не вызывается — форма закрыта без Закрыть(Результат) или ОповеститьОВыборе
Особые случаи и ограничения платформы
Ключевая уникальность формы определяется её ключевыми параметрами. Если вы открываете форму с тем же набором ключевых параметров, что и у уже открытой, платформа не создаст новое окно, а активирует существующее. Это удобно для форм элементов (один элемент — одно окно), но мешает, когда нужно открыть несколько одинаковых форм с разными произвольными параметрами. Решение — добавить в структуру уникальный ключ: Новый УникальныйИдентификатор передаётся в параметр «КлючУникальности» или просто как произвольный уникальный параметр.
Ещё одна граница — толщина клиента. В веб-клиенте и тонком клиенте между клиентом и сервером передаются только сериализуемые значения. Нельзя передать в параметры формы, например, объект СправочникОбъект — только ссылку. Если нужно передать набор строк, используйте массив структур или таблицу значений, помещённую во временное хранилище с передачей адреса.
Для больших объёмов данных (например, подобранная таблица из тысяч строк) правильный паттерн такой: на сервере открываемой формы данные помещаются во временное хранилище методом ПоместитьВоВременноеХранилище с указанием УникальныйИдентификатор формы, а вызывающей форме возвращается только адрес хранилища. Вызывающая форма забирает данные через ПолучитьИзВременногоХранилища.
Что важно запомнить
Передача при открытии — структура параметров в ОткрытьФорму и обработка в ПриСозданииНаСервере с проверкой Свойство(). Возврат результата — ОписаниеОповещения и Закрыть(Результат) или ОповеститьОВыборе. Обмен между открытыми формами — Оповестить и ОбработкаОповещения с фильтрацией по источнику. Долгоживущие значения сохраняйте в реквизиты формы, большие данные — во временное хранилище.
Частые вопросы
Как передать параметр в форму, которая уже открыта?
Используйте метод Оповестить с уникальным именем события и параметром, а в целевой форме обработайте событие в ОбработкаОповещения. Чтобы не перепутать источники, передавайте третьим аргументом ссылку на форму-источник и проверяйте её в приёмнике.
Почему параметр доступен в ПриСозданииНаСервере, но теряется потом?
Коллекция Параметры очищается после создания формы, если параметр не объявлен в редакторе формы. Решение: объявите параметр в палитре свойств формы либо скопируйте значение в реквизит формы в обработчике ПриСозданииНаСервере.
Как открыть форму списка с отбором, который пользователь сможет снять?
Стандартный параметр «Отбор» делает отбор фиксированным. Для снимаемого отбора передайте значение как произвольный параметр и в ПриСозданииНаСервере установите отбор через элементы настроек компоновки данных динамического списка — такой отбор пользователь сможет изменить или отключить.
Можно ли получить результат из формы синхронно, без оповещения?
В управляемом приложении — нет, модальные вызовы с возвратом значения запрещены режимом использования модальности в большинстве конфигураций. Используйте ОписаниеОповещения: логика продолжения размещается в процедуре-обработчике, которая получит результат при закрытии формы.
Как передать таблицу значений между формами?
Поместите таблицу во временное хранилище методом ПоместитьВоВременноеХранилище с указанием уникального идентификатора формы-получателя, а саму форму откройте с параметром-адресом хранилища. Получатель заберёт данные через ПолучитьИзВременногоХранилища в ПриСозданииНаСервере.
Почему вместо нового окна активируется уже открытая форма?
Платформа объединяет формы с одинаковыми ключевыми параметрами. Чтобы открыть независимый экземпляр, передайте в структуре параметров ключ «КлючУникальности» со значением Новый УникальныйИдентификатор — тогда каждая форма будет открываться в отдельном окне.