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