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