К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как из одной формы вызвать другую форму в 1С

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

Вызов одной формы из другой — базовый приём при разработке на платформе 1С:Предприятие. Чаще всего задача решается методом ОткрытьФорму(), который умеет открывать формы объектов, списков, выбора и произвольные формы, передавать в них параметры и указывать форму-владельца. В управляемом приложении это единственный штатный механизм — прямого доступа к элементам чужой формы из кода нет и не должно быть.

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

Ниже разобраны основные способы вызова с примерами кода для управляемых форм, нюансы передачи параметров, возврат значения выбора и ошибки, которые чаще всего мешают механизму работать.

Основной способ: метод ОткрытьФорму

Метод ОткрытьФорму() доступен на клиенте и принимает имя формы, параметры, владельца, уникальность и другие аргументы. Имя формы строится по шаблону: вид объекта, имя объекта, назначение формы. Например, Справочник.Контрагенты.Форма.ФормаЭлемента или Документ.РеализацияТоваров.Форма.ФормаСписка.

Минимальный вызов выглядит так:

&НаКлиенте

Процедура ОткрытьКарточку(Команда)

ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента");

КонецПроцедуры

Для форм обработок и отчётов путь аналогичен: Обработка.ЗагрузкаДанных.Форма.Форма. Если форма не указана явно, платформа откроет форму по умолчанию для данного объекта, поэтому для надёжности имя лучше указывать полностью — это избавляет от сюрпризов при смене основных форм в конфигураторе.

Передача параметров в открываемую форму

Почти всегда открываемой форме нужны исходные данные: ссылка на редактируемый объект, отбор для списка, признак режима работы. Параметры передаются структурой вторым аргументом метода:

&НаКлиенте

Процедура РедактироватьКонтрагента(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Ключ", ТекущийКонтрагент);

ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента", ПараметрыФормы, ЭтаФорма);

КонецПроцедуры

Параметр Ключ — стандартный: он указывает, какой объект открыть на редактирование. Для формы списка полезен параметр Отбор — тоже структура, где ключи совпадают с именами полей динамического списка. Произвольные параметры (например, РежимВыбора или свои собственные) обрабатываются в открываемой форме в обработчике ПриСозданииНаСервере через коллекцию Параметры.

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

Открытие формы с параметрами
  1. 1
    В вызывающей форме сформируйте структуру параметров: Ключ, Отбор или произвольные значения
  2. 2
    Вызовите ОткрытьФорму с именем формы, структурой и указанием ЭтаФорма как владельца
  3. 3
    В открываемой форме в ПриСозданииНаСервере прочитайте параметры и настройте поведение
  4. 4
    Проверьте, что форма открывается и данные отображаются корректно

Получение результата: выбор и оповещения

Открыть форму — половина задачи. Часто нужно получить из неё результат: выбранный элемент справочника, введённые настройки, подтверждение действия. Штатный механизм — метод ОповеститьОВыборе() в открываемой форме и обработчик ОбработкаВыбора в форме-владельце.

// В открываемой форме (форме выбора)

&НаКлиенте

Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ОповеститьОВыборе(ВыбраннаяСтрока);

КонецПроцедуры

// В форме-владельце

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

Контрагент = ВыбранноеЗначение;

КонецПроцедуры

Условие работы механизма — при открытии обязательно указать владельца (третий параметр ЭтаФорма). Без владельца оповещению о выборе некуда возвращаться, и ОбработкаВыбора не сработает. Для форм выбора справочников и документов также нужно установить параметр РежимВыбора = Истина, иначе форма будет вести себя как обычный список.

Альтернатива: ОписаниеОповещения

Более гибкий способ — передать в открываемую форму описание оповещения с именем процедуры обратного вызова. Тогда результат обрабатывается в произвольной процедуре, а не только в ОбработкаВыбора, и можно различать несколько вызовов из одной формы. Этот подход удобен, когда из одной формы открываются разные диалоги с разной логикой обработки результата.

Блокирующие и модальные вызовы

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

&НаКлиенте

Процедура ОткрытьНастройки(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияНастроек", ЭтотОбъект);

ОткрытьФорму("Обработка.НастройкиОбмена.Форма.Форма", , ЭтаФорма, , , , Оповещение,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте

Процедура ПослеЗакрытияНастроек(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

ПрименитьНастройки(Результат);

КонецЕсли;

КонецПроцедуры

Здесь результат возвращается через Закрыть(ЗначениеРезультата) в открываемой форме и попадает в процедуру оповещения первым аргументом. Это асинхронный аналог старого модального вызова: пользователь видит блокирующее окно, а код продолжает выполнение в обратном вызове.

Способы получения результата

ОповеститьОВыборе + ОбработкаВыбора

Стандартный механизм для форм выбора. Простой, но привязан к владельцу и одному обработчику на форму

ОписаниеОповещения при открытии

Гибкий обратный вызов при закрытии формы. Позволяет разные процедуры для разных вызовов, работает с блокирующим режимом

Оповестить + ОбработкаОповещения

Широковещательное сообщение по имени события. Подходит для уведомления нескольких форм, но требует контроля источника

Открытие формы нового объекта и независимые формы

Чтобы открыть форму создания нового элемента, достаточно вызвать форму элемента без параметра Ключ — платформа поймёт, что объект новый. Дополнительно можно передать ЗначенияЗаполнения — структуру с реквизитами, которые подставятся в новый объект, и Основание для ввода на основании.

Четвёртый параметр Уникальность управляет повторным открытием. Если передать Истина, каждый вызов создаст новый экземпляр формы. Если передать конкретное значение (например, ссылку), повторный вызов с тем же ключом активирует уже открытую форму вместо создания дубликата. По умолчанию формы объектов уникальны по ссылке, а прочие формы открываются в одном экземпляре.

Для открытия формы независимо, без владельца, третий параметр просто опускают. Так делают для отчётов, обработок и рабочих мест, которым не нужно возвращать результат: форма живёт своей жизнью и закрывается пользователем самостоятельно.

bsl
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", Новый Структура("ЗначенияЗаполнения", Новый Структура("ВидНоменклатуры", ВидТовар)), ЭтаФорма, Истина);

Типичные ошибки и их диагностика

Самая частая проблема — ошибка «Форма не найдена». Причины: опечатка в имени объекта, форма не создана в конфигураторе (а автоматически генерируемая форма по имени недоступна), либо перепутан вид формы — например, запрошена ФормаСписка там, где создана только ФормаВыбора. Проверяется просто: имя в строке вызова должно символ в символ совпадать с именем формы в дереве конфигурации.

Вторая группа ошибок — потерянный результат выбора. Симптом: форма выбора открывается, элемент выбирается, но в исходной форме ничего не происходит. Причины почти всегда одни и те же: не указан владелец, не установлен РежимВыбора, обработчик ОбработкаВыбора объявлен без директивы &НаКлиенте или назван с опечаткой.

Третья группа — ошибки параметров. Обращение Параметры.МойПараметр к необъявленному параметру роняет форму при открытии. Безопасный шаблон: Если Параметры.Свойство("МойПараметр", Значение) Тогда ... КонецЕсли;. Также помните, что через параметры нельзя передать несериализуемые данные — только простые типы, ссылки, структуры и массивы из них.

Типичные ошибки
01
Открытие формы без владельца — ОбработкаВыбора не вызывается, результат выбора теряется
02
Опечатка в полном имени формы — ошибка открытия, которая проявляется только в момент вызова
03
Попытка обратиться к элементам чужой формы напрямую — в управляемом приложении это невозможно, нужен обмен через параметры и оповещения
04
Использование ОткрытьФормуМодально при запрещённой модальности — код не выполняется, замените на блокирующий режим с оповещением
05
Передача мутабельных данных через параметры и изменение их после открытия — открытая форма не увидит изменений
Маршрут решения

Как выбрать способ вызова

Нужно выбрать элемент справочника или документаОткрытьФорму формы выбора с РежимВыбора=Истина и владельцем, результат через ОбработкаВыбора
Нужно отредактировать существующий объектОткрытьФорму формы элемента с параметром Ключ
Нужно получить настройки или подтверждение перед продолжениемОткрытьФорму с ОписаниеОповещения и режимом БлокироватьОкноВладельца
Нужно просто показать отчёт или обработкуОткрытьФорму без владельца и параметров результата

Частые вопросы

Как открыть форму списка с отбором по конкретному значению?

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

Можно ли открыть форму из серверной процедуры?

Нет. Открытие форм — клиентская операция, метод ОткрытьФорму доступен только в контексте &НаКлиенте. Если данные для параметров готовятся на сервере, сначала выполните серверный вызов, получите результат, а затем откройте форму из клиентского контекста.

Как закрыть открытую форму из вызвавшей формы?

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

Почему ОбработкаВыбора не срабатывает, хотя владелец указан?

Проверьте три вещи: процедура объявлена с директивой &НаКлиенте и точным именем ОбработкаВыбора; у формы выбора установлен РежимВыбора; в форме выбора вызов ОповеститьОВыборе действительно выполняется (для стандартных форм выбора это происходит автоматически при двойном щелчке).

Как передать в форму таблицу значений?

Через параметры напрямую таблицу значений передать нельзя. Варианты: поместить данные во временное хранилище на сервере и передать адрес хранилища строкой, либо передать массив структур с простыми типами, если объём данных невелик.

Чем отличается Оповестить от ОповеститьОВыборе?

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

Итог

Что важно запомнить

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