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