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