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