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