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