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

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

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

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

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

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

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

Какие способы открытия формы существуют и когда какой выбрать

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

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

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

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

ОткрытьФорму()

Стандартный выбор: открывает форму с параметрами, владельцем, блокировкой окна владельца. Не даёт доступа к объекту формы до открытия.

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

Возвращает объект формы до показа — можно заполнить реквизиты программно. Форма создаётся сразу, ресурсоёмко.

ОткрытьЗначение()

Только показ объекта по ссылке, без параметров. Подходит для простой навигации.

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

Минимальный вызов выглядит так: первый аргумент — полное имя формы, второй — структура параметров. Имя формы строится по шаблону ВидОбъекта.ИмяОбъекта.ИмяФормы, например Справочник.Номенклатура.Форма.ФормаСписка или Документ.РеализацияТоваровУслуг.ФормаОбъекта.

bsl
&НаКлиенте
Процедура ОткрытьСписокПоКонтрагенту(Команда)

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

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

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

Структура параметров — обычный объект Структура, где ключ — имя параметра, а значение — произвольные данные: примитивы, ссылки, структуры, массивы. Ограничение важно: значения должны быть сериализуемыми для передачи между клиентом и сервером. Передать, например, ТабличныйДокумент или COM-объект напрямую не получится.

Дополнительные аргументы ОткрытьФорму() позволяют указать владельца формы (для связанного закрытия), ключ уникальности (предотвращает открытие дублей), окно, режим блокировки и описание оповещения о закрытии. Например, ОткрытьФорму(ИмяФормы, ПараметрыФормы, ЭтотОбъект, Новый УникальныйИдентификатор) гарантирует, что каждый вызов откроет новую форму.

Как форма получает переданные параметры

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

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

	Если Параметры.Свойство("Отбор") И Параметры.Отбор.Свойство("Контрагент") Тогда
		ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ЭлементОтбора.ПравоеЗначение = Параметры.Отбор.Контрагент;
	КонецЕсли;

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

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

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

Типовые сценарии передачи параметров

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

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

Предзаполнение нового объекта

Для формы нового документа или элемента справочника используйте стандартный параметр ЗначенияЗаполнения: структура с именами реквизитов и их значениями. Платформа заполнит объект при создании. Если нужна более сложная логика (например, заполнение табличной части), передайте свои параметры и обработайте их в ПриСозданииНаСервере после проверки Параметры.Ключ.Пустая(), чтобы логика срабатывала только для нового объекта.

Форма выбора с ограничениями

Чтобы открыть форму выбора и получить результат обратно, передайте параметр РежимВыбора = Истина, владельца и описание оповещения о закрытии. Результат выбора придёт в указанную процедуру через обработчик оповещения — это правильная альтернатива устаревшим модальным вызовам ОткрытьФормуМодально(), которые заблокированы в веб-клиенте и отключены в современных режимах совместимости.

Порядок действий: открыть форму выбора с отбором
  1. 1
    Сформируйте структуру параметров: Отбор, РежимВыбора = Истина
  2. 2
    Создайте ОписаниеОповещения с именем процедуры-обработчика результата
  3. 3
    Вызовите ОткрытьФорму с параметрами, владельцем и описанием оповещения
  4. 4
    В процедуре-обработчике проверьте, что результат не Неопределено, и используйте выбранное значение

Ключ уникальности и повторное открытие форм

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

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

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

Как проверить, что параметры дошли до формы

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

Второй приём — временное сообщение: в начале обработчика выведите Сообщить(Параметры.Свойство(\"Отбор\")). Если форма открывается, но отбор не применяется, убедитесь, что имя поля в структуре отбора совпадает с именем поля динамического списка, а не с синонимом колонки на форме.

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

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

Параметры в отладчике
Норма

В ПриСозданииНаСервере Параметры содержит все переданные ключи

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

Ключа нет — проверить структуру в вызывающем коде

Отбор списка
Норма

Список открывается с установленным отбором, в панели отборов видно условие

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

Отбор пуст — имя поля не совпадает с полем динамического списка

Повторное открытие
Норма

Открывается нужное число экземпляров формы

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

Активируется старая форма — не задан ключ уникальности

Ограничения и безопасные границы

Не передавайте через параметры большие объёмы данных: параметры сериализуются и хранятся, пока жива форма. Если нужно передать таблицу значений с сервера на форму, используйте ПоместитьВоВременноеХранилище() и передавайте только адрес хранилища — это стандартный приём для обмена данными между формами.

Учитывайте права пользователя: программное открытие формы не отменяет проверку прав на объект. Если у пользователя нет права просмотра документа, ОткрытьФорму() завершится ошибкой нарушения прав доступа. В общих модулях, вызываемых из интерфейса, предусмотрите обработку такой ситуации.

Изменения в типовых формах делайте через расширения конфигурации, а не прямую правку — иначе при обновлении конфигурации доработки придётся переносить вручную, а при ошибке слияния есть риск потерять обработку параметров.

FAQ

Чем ОткрытьФорму отличается от ПолучитьФорму?

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

Можно ли передать таблицу значений в открываемую форму?

Напрямую таблицу значений в структуре параметров передавать не стоит. Поместите её во временное хранилище методом ПоместитьВоВременноеХранилище на сервере и передайте форме адрес хранилища — форма загрузит данные методом ПолучитьИзВременногоХранилища.

Почему параметр Отбор не срабатывает в форме списка?

Чаще всего имя поля в структуре отбора не совпадает с именем поля основной таблицы динамического списка, либо список построен на произвольном запросе и платформа не может применить стандартный отбор. Во втором случае устанавливайте отбор вручную в ПриСозданииНаСервере.

Как получить результат из открытой формы обратно?

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

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

Передайте в структуре параметров стандартный ключ Ключ со ссылкой на элемент плюс свои параметры: ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", Новый Структура("Ключ, МойПараметр", Ссылка, Значение)). Форма откроет объект, а ваш параметр обработайте в ПриСозданииНаСервере.

Работает ли передача параметров в веб-клиенте?

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

Итог

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

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