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

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

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

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

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

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

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

Базовый синтаксис: ОткрытьФорму со структурой параметров

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

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

СтруктураПараметров.Вставить("Контрагент", ВыбранныйКонтрагент);

СтруктураПараметров.Вставить("ТолькоПросмотрСогласования", Истина);

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

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

1c
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Организация", ТекущаяОрганизация);
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы, ЭтаФорма, Новый УникальныйИдентификатор);

Как принять параметр в открываемой форме

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

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

&НаСервере

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

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

УстановитьОтборПоКонтрагенту(Параметры.Контрагент);

КонецЕсли;

Если Параметры.Свойство("ТолькоПросмотрСогласования")

И Параметры.ТолькоПросмотрСогласования Тогда

ЭтаФорма.ТолькоПросмотр = Истина;

КонецЕсли;

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

Какие типы данных можно передавать

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

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

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

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

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

// Открыть карточку конкретного контрагента

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

Новый Структура("Ключ", СсылкаНаКонтрагента));

// Форма списка с отбором по организации

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

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

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

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

Альтернативные способы открытия формы с параметрами

Метод ПолучитьФорму

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

Открытие через Оповестить и обработчики ожидания

Если форма уже открыта и нужно передать в неё данные, используется механизм оповещений: Оповестить("ИмяСобытия", Параметр, Источник), а в целевой форме — обработчик ОбработкаОповещения(ИмяСобытия, Параметр, Источник). Это не замена параметрам при открытии, а дополнение для обмена данными между уже существующими формами.

Сравнение вариантов

ОткрытьФорму со структурой

Универсальный способ для разовой передачи параметров при открытии; подходит в большинстве сценариев

ПолучитьФорму

Когда нужно дозаполнить форму программно перед показом; требует отдельного вызова Открыть()

Оповестить

Для передачи данных в уже открытую форму; не работает как способ передачи параметров при создании

Проверка результата и отладка

После внедрения передачи параметров проверьте три сценария: открытие с параметром, открытие без параметра и повторное открытие. Форма должна корректно работать во всех трёх случаях, не выдавая ошибок и не теряя стандартное поведение.

Для отладки удобно в начале ПриСозданииНаСервере временно вывести состав параметров через Сообщить() или точку останова в конфигураторе. Убедитесь, что тип переданного значения совпадает с ожидаемым: например, в отбор передаётся именно ссылка, а не строка с наименованием.

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

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

Открытие формы с параметром
Норма

Форма открывается, отбор или режим применён

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

Форма открывается, но параметр игнорируется

Открытие без параметра
Норма

Форма работает в стандартном режиме

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

Ошибка «Поле объекта не обнаружено»

Повторный вызов с тем же ключом уникальности
Норма

Активируется уже открытая форма

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

Открывается второй экземпляр формы

Часто задаваемые вопросы

Можно ли передать параметр в форму, открываемую из командного интерфейса?

Напрямую — нет, команда интерфейса открывает форму без пользовательских параметров. Обходной путь: создать свою команду в модуле менеджера объекта (обработчик ОбработкаПолученияФормы) либо заменить стандартную команду своей кнопкой с кодом ОткрытьФорму.

Как передать несколько значений одним параметром?

Передайте массив, структуру или список значений как значение одного ключа структуры параметров. В открываемой форме обойдите коллекцию циклом. Для отбора списка по нескольким значениям используйте вид сравнения «В списке» программно.

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

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

Как открыть форму модально с параметрами?

Используйте ОткрытьФорму с параметром РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца, либо метод ОткрытьМодально у формы, полученной через ПолучитьФорму. В тонком клиенте предпочтителен неблокирующий вариант с описанием оповещения о закрытии.

Работает ли передача параметров в обычных формах (8.2)?

Да, синтаксис ОткрытьФорму и ПолучитьФорму с параметрами поддерживается и в обычном приложении, но обработка выполняется в обработчике ПриОткрытии через свойство Параметры, без серверного события ПриСозданииНаСервере.

Итог

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

Параметры передаются структурой через ОткрытьФорму, принимаются через Параметры в ПриСозданииНаСервере с обязательной проверкой Свойство(). Передавайте ссылки и простые типы, избегайте несериализуемых объектов и больших таблиц. Стандартные параметры Ключ, Отбор и Основание обрабатываются платформой автоматически.