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