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

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

1С: как из формы открыть другую форму

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

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

Выбор конкретного метода зависит от нескольких условий: нужно ли дождаться результата работы пользователя с открытой формой, требуется ли передать в неё параметры, должна ли форма блокировать работу с родительским окном. Неправильный выбор приводит к типичным проблемам: форма открывается несколько раз, параметры не доходят, а в тонком и веб-клиенте код с модальными вызовами вообще отказывается работать.

Материал ориентирован на разработчика, который работает в модуле формы управляемого приложения. Все примеры приведены на встроенном языке 1С и применимы к типовым и самописным конфигурациям на платформе 8.3.

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

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

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

Сравнение способов открытия

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

Универсальный вариант для управляемого приложения. Работает во всех клиентах, поддерживает параметры и оповещения. Не блокирует родительскую форму без дополнительных настроек.

ОткрытьФормуМодально()

Блокирует родительское окно и возвращает результат напрямую. Не работает, если в конфигурации запрещены модальные вызовы, и недоступен в веб-клиенте без специальных настроек.

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

Открывает форму по ссылке на объект. Подходит только для просмотра существующих объектов, не позволяет передать произвольные параметры.

ПолучитьФорму() + Открыть()

Даёт доступ к реквизитам формы до показа. Требует аккуратности: при повторном вызове может вернуть уже открытый экземпляр.

Открываем форму методом ОткрытьФорму с параметрами

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

&НаКлиенте

Процедура ОткрытьКарточкуКонтрагента(Команда)

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

ПараметрыФормы.Вставить("Ключ", КонтрагентСсылка);

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

ПараметрыФормы, ЭтотОбъект);

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

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

Порядок открытия формы с параметрами
  1. 1
    Определите полное имя открываемой формы через конфигуратор или синтакс-помощник
  2. 2
    Сформируйте структуру параметров: Ключ для объекта, Отбор для списка, свои параметры при необходимости
  3. 3
    Вызовите ОткрытьФорму() с указанием владельца — обычно ЭтотОбъект
  4. 4
    В открываемой форме обработайте параметры в ПриСозданииНаСервере
  5. 5
    Проверьте результат: форма открывается, данные соответствуют переданным параметрам

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

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

&НаКлиенте

Процедура ПоказатьСчетаПоКонтрагенту(Команда)

Отбор = Новый Структура;

Отбор.Вставить("Контрагент", КонтрагентСсылка);

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

ПараметрыФормы.Вставить("Отбор", Отбор);

ОткрытьФорму("Документ.СчетНаОплатуПокупателю.Форма.ФормаСписка",

ПараметрыФормы, ЭтотОбъект);

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

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

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

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

&НаКлиенте

Процедура ВыбратьКонтрагента(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);

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

, ЭтотОбъект, , , , Оповещение,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте

Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

Контрагент = Результат;

КонецЕсли;

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

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

Открытие формы нового объекта с заполнением

Чтобы из формы открыть форму нового документа или элемента справочника с предзаполненными полями, используется параметр ЗначенияЗаполнения. Платформа передаст его в обработчик ОбработкаЗаполнения модуля объекта, и если там предусмотрено заполнение по переданным данным, поля заполнятся автоматически.

&НаКлиенте

Процедура СоздатьЗаказПоДокументу(Команда)

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Контрагент", Объект.Контрагент);

ЗначенияЗаполнения.Вставить("Организация", Объект.Организация);

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

ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);

ОткрытьФорму("Документ.ЗаказПокупателя.Форма.ФормаДокумента",

ПараметрыФормы, ЭтотОбъект);

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

Дополнительно полезен параметр Копирование — он открывает форму нового объекта как копию существующего: передайте в него ссылку на объект-образец. Учтите, что при копировании срабатывает стандартный механизм копирования платформы, и часть полей (дата, номер, проведение) будет сброшена автоматически.

Типичные ошибки
01
Указание неточного имени формы — платформа выдаёт ошибку «Форма не найдена»; копируйте имя из свойств формы в конфигураторе
02
Передача параметров без обработки в ПриСозданииНаСервере открываемой формы — параметры молча игнорируются
03
Отсутствие владельца при открытии — форма не привязана к родительской, при закрытии родителя остаётся «висячее» окно
04
Неэкспортная процедура-обработчик оповещения — вызов завершается ошибкой после закрытия формы
05
Попытка использовать модальные методы в конфигурации с запрещённой модальностью — код падает в тонком и веб-клиенте
06
Открытие формы в цикле без проверки — пользователь получает десятки одинаковых окон

Как не открывать дубли и проверить результат

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

Если передать в Уникальность, например, ссылку на текущий документ, повторный вызов с тем же значением активирует уже открытую форму вместо создания новой. Это удобно для окон-помощников, которые должны существовать в единственном экземпляре на конкретный объект.

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

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

Форма открывается без ошибок
Норма

Окно появляется, заголовок и данные соответствуют ожиданиям

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

Ошибка «Форма не найдена» или пустая форма — проверьте имя формы и параметр Ключ

Параметры доходят до формы
Норма

В ПриСозданииНаСервере открываемой формы Параметры.Свойство() возвращает Истина для переданных ключей

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

Параметры отсутствуют — проверьте структуру параметров и объявление параметров формы

Результат возвращается в родительскую форму
Норма

Процедура-обработчик оповещения вызывается, Результат содержит значение

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

Обработчик не вызывается — проверьте Экспорт и передачу описания оповещения

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

Активируется уже открытое окно, дублей нет

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

Открываются копии окна — задайте параметр Уникальность

FAQ: частые вопросы об открытии форм в 1С

Как открыть форму из модуля объекта, а не из формы?

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

Чем ОткрытьЗначение() отличается от ОткрытьФорму() с ключом?

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

Почему параметры не видны в открываемой форме?

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

Как открыть форму выбора с множественным выбором?

Передайте в параметры формы выбора ключ МножественныйВыбор со значением Истина и обработайте результат в описании оповещения — он вернётся в виде массива или списка значений, в зависимости от настроек формы. Дополнительно можно передать ЗакрыватьПриВыборе = Ложь, чтобы форма не закрывалась после каждого выбора.

Можно ли открыть форму отчёта с готовыми настройками?

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

Итог

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

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