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