Как в 1С программно открыть другую форму по нажатию кнопки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки пользовательских интерфейсов в 1С часто возникает задача перехода с одной формы на другую: например, вызов карточки создания нового элемента, открытие настроек или переход к мастеру регистрации. Разберем, как правильно реализовать открытие формы по нажатию кнопки в управляемом приложении, какие нюансы синтаксиса следует учитывать и как избежать распространенных ошибок.

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

В управляемом интерфейсе 1С (тонкий и веб-клиент) устаревший метод обычных форм ПолучитьФорму() не используется. Вместо него применяется глобальный метод платформы ОткрытьФорму().

Проанализируем ключевое правило контекста: метод ОткрытьФорму() является чисто клиентским. Попытка вызвать его в серверных процедурах (с директивами &НаСервере или &НаСервереБезКонтекста) вызовет ошибку компиляции. Обработчик нажатия кнопки обязательно должен выполняться с директивой &НаКлиенте.

Рассмотрим минимальный пример обработчика команды для формы:


&НаКлиенте
Процедура ОткрытьФормуПоИмени(Команда)
    ОткрытьФорму("ОбщаяФорма.ФормаРегистрации", , ЭтаФорма);
КонецПроцедуры

Обратите внимание на третий параметр: ЭтаФорма указывает форму-владельца. Передача владельца связывает жизненный цикл открываемой формы с текущей, что позволяет корректно передавать оповещения и управлять блокировкой окон при необходимости.

Правила указания пути к форме в метаданных

Одной из самых частых причин ошибки «Форма не найдена» является некорректное составление строкового имени формы. Платформа строго разделяет стандартные предопределенные формы и произвольные формы, созданные разработчиком вручную. Разберем правила формирования строки адресации:

  1. Стандартные формы объектов: если открывается основная форма объекта, списка или выбора, ключевое слово Форма не дублируется. Путь формируется так: "Справочник.Бегуны.ФормаОбъекта", "Справочник.Бегуны.ФормаСписка" или "Документ.Заявка.ФормаВыбора".
  2. Произвольные (дополнительные) формы объекта: если в справочнике или документе создана нестандартная форма (например, форма регистрации или форма редактирования профиля), в строке обязательно указывается разделитель .Форма.: "Справочник.Бегуны.Форма.ФормаРегистрация".
  3. Общие формы конфигурации: для форм, расположенных в ветке метаданных «Общие формы», путь всегда строится по шаблону: "ОбщаяФорма.ИмяОбщейФормы".

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

Открытие существующего объекта и создание нового с заполнением

Посмотрим на практические сценарии, когда нужно не просто открыть пустую форму, а передать в нее конкретные данные через структуру параметров.

Сценарий 1. Открытие существующего элемента справочника:

Для открытия конкретного объекта в структуру параметров передается ключ Ключ со ссылкой на нужный элемент:


&НаКлиенте
Процедура ОткрытьКарточкуБегуна(Команда)
    ПараметрыФормы = Новый Структура("Ключ", ВыбраннаяСсылка);
    ОткрытьФорму("Справочник.Бегуны.ФормаОбъекта", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

Сценарий 2. Открытие формы для создания нового элемента с предзаполнением:

Если требуется открыть форму нового элемента и сразу подставить в нее начальные значения реквизитов, используется предопределенный параметр ЗначениеЗаполнения:


&НаКлиенте
Процедура ЗарегистрироватьНовогоБегуна(Команда)
    ЗначенияПоУмолчанию = Новый Структура;
    ЗначенияПоУмолчанию.Вставить("Город", ТекущийГород);
    ЗначенияПоУмолчанию.Вставить("Статус", ПредопределенноеЗначение("Перечисление.СтатусыУчастников.Новый"));

    ПараметрыФормы = Новый Структура("ЗначениеЗаполнения", ЗначенияПоУмолчанию);
    ОткрытьФорму("Справочник.Бегуны.ФормаОбъекта", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

Реализация всплывающего блокирующего окна

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

Разберем, как решить задачу современным асинхронным способом с помощью параметра РежимОткрытияОкнаФормы:


&НаКлиенте
Процедура ОткрытьОкноПодтверждения(Команда)
    ПараметрыФормы = Новый Структура;
    ОткрытьФорму("ОбщаяФорма.ФормаПодтвержденияДанных",
                 ПараметрыФормы,
                 ЭтаФорма,
                 Истина,
                 ,
                 ,
                 ,
                 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

Получение результата после закрытия открытой формы

Когда после закрытия вспомогательной формы требуется обработать введенный результат на стороне вызывающей формы, создаем описание оповещения через ОписаниеОповещения:


&НаКлиенте
Процедура НачатьРегистрацию(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияРегистрации", ЭтаФорма);
    ОткрытьФорму("Справочник.Бегуны.Форма.ФормаРегистрация", , ЭтаФорма, , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияРегистрации(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    Если РезультатЗакрытия <> Неопределено Тогда
        // Обрабатываем возвращенные данные
    КонецЕсли;
КонецПроцедуры

В самой открытой форме для возврата результата достаточно вызвать метод Закрыть(ЗначениеРезультата).

Альтернативный вариант: пошаговый интерфейс на одной форме

Если перед нами стоит задача сделать «мастер» (wizard) с переходом между шагами (например, «Шаг 1: Ввод данных», «Шаг 2: Профиль», «Шаг 3: Подтверждение»), плодить множество отдельных форм не всегда оправдано. В 1С такой интерфейс удобно реализовывать в пределах одного окна с помощью элемента формы с видом Страницы (панель вкладок). Отключив видимость самих закладок, мы можем программно переключать отображаемые блоки по нажатию кнопок:


&НаКлиенте
Процедура КнопкаДалееНажатие(Команда)
    Элементы.ПанельШагов.ТекущаяСтраница = Элементы.СтраницаРегистрации;
КонецПроцедуры

Такой подход избавляет от нагромождения открытых окон и ускоряет работу интерфейса для конечного пользователя.

← На главную