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