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