1с получить форму справочника

Обновлено: 04.07.2024

Как открыть форму существующего объекта?

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

Например, если из формы списка организаций нужно открыть форму той организации, на которой находится курсор, сделать это можно следующим способом:

Ссылку на интересующий элемент справочника мы получаем через текущую строку списка:

СсылкаНаЭлементСправочника = Элементы . Список . ТекущаяСтрока ;

Параметры формы передаем в виде структуры, где имя элемента структуры соответствует имени параметра формы, а значение - это то значение, в которое мы хотим установить параметр формы.

Если требуется открыть не основную, а произвольную форму объекта, созданную в конфигураторе, вместо стандартного имени основной формы ( ФормаОбъекта ) указывается слово Форма и через точку за ним - имя формы, созданной в конфигураторе. Например:

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

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

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

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

Открытие форм

Область применения: управляемое приложение, мобильное приложение.

1. Для открытия форм следует применять метод глобального контекста ОткрытьФорму (при использовании версии платформы 1С:Предприятие 8.2 и более ранних версий - также ОткрытьФормуМодально ). Применение альтернативного способа, с получением формы и ее последующим открытием с помощью метода ПолучитьФорму , не рекомендуется.

Рекомендация обусловлена соображениями

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

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

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

Параметры формы из этого набора могут быть указаны в вызывающем коде при открытии формы ( ОткрытьФорму ).

3. Не следует применять другие способы параметризации формы при открытии. Например, нужно избегать обращения к методам и свойствам формы после ее открытия.
Например, вместо

следует по той же причине использовать параметры формы:

ОткрытьФорму("ОбщаяФорма.ПутеводительПоСистеме", Новый Структура("РежимОткрытия", "Приветствие"));

4. Для получения результата работы формы, вместо непосредственного обращения к элементам и реквизитам формы

ФормаВопроса = ПолучитьФорму("ОбщаяФорма.ФормаВопроса");
ФормаВопроса.ОткрытьМодально();
Если ФормаВопроса.БольшеНеПоказыватьНапоминание Тогда
// …

следует использовать процедуры-обработчики оповещений, которые будут вызваны при завершении работы пользователя с формой:

Оповещение = Новый ОписаниеОповещения("БольшеНеПоказыватьНапоминаниеЗавершение", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.ФормаВопроса". Оповещение, РежимОткрытияОкнаФормы.БлокироватьВеcьИнтерфейс);
.

&НаКлиенте
Процедура БольшеНеПоказыватьНапоминаниеЗавершение(БольшеНеПоказыватьНапоминание, Параметры) Экспорт

Если БольшеНеПоказыватьНапоминание = Неопределено Тогда
Возврат;
КонецЕсли;

Если БольшеНеПоказыватьНапоминание Тогда
// …

При этом возвращаемое значение формы формируется в коде модуля формы с помощью метода формы Закрыть .

5. Другие ограничения:

  • Обработчик события формы ПриОткрытии не должен содержать код по открытию какой-либо другой формы, так как это может привести к нарушению порядка отображения окон. В этом случае рекомендуется использовать обработчик ожидания на короткий интервал или открывать другие формы интерактивно, например, по нажатию на кнопку.
  • Не рекомендуется выполнять программное открытие и закрытие формы в одном обработчике. Такие действия должны быть разнесены по времени. Например, закрытие формы можно выполнять в обработчике ожидания.
  • При использовании в конфигурации Библиотека стандартных подсистем и разработке форм (рабочих мест), предназначенных только для внешних пользователей, следует явно блокировать открытие таких форм в сеансах "обычных" пользователей. Для этого следует устанавливать параметр Отказ при создании формы на сервере с помощью функции ЭтоСеансВнешнегоПользователя общего модуля Пользователи или ПользователиКлиент :

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Не ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;

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

6. Следующие виды форм должны быть всегда доступны пользователю в режиме 1С:Предприятия из меню "Все функции" вне зависимости от того, размещены ли соответствующие объекты в командном интерфейсе приложения или нет:


Процедура ПоказатьФорму ( ОповещениеОЗакрытие = Неопределено, ПарФормы = Неопределено, ПарОткрытия = Неопределено) Экспорт

ПараметрыОткрытияФормы = Новый Структура ( "УУИД, ОкноФормы, СсылкаФормы, ВладелецФормы" , Ложь);
Если ПарОткрытия <> Неопределено Тогда
//( , , необяз., необяз.)
ЗаполнитьЗначенияСвойств ( ПараметрыОткрытияФормы , ПарОткрытия );
КонецЕсли;

ОткрытьФорму ( "РегистрСведений.КлассификаторСтранМира.Форма.ЗагрузкаКлассификатора" ,
ПарФормы , ПараметрыОткрытияФормы . ВладелецФормы , ПараметрыОткрытияФормы . УУИД ,
ПараметрыОткрытияФормы . ОкноФормы , ПараметрыОткрытияФормы . СсылкаФормы , ОповещениеОЗакрытие );

Процедура ПоказатьФормуСОтбором ( ОповещениеОЗакрытие = Неопределено, ПарФормы = Неопределено, ПарОткрытия = Неопределено)

ПараметрыОтбора = Новый Структура ( "Спелый" , Истина);
ПарФормы = Новый Структура ( "Отбор" , ПараметрыОтбора );
ОткрытьФорму ( "Справочник.Фрукты.Форма.ФормаВыбора" , ПарФормы );

&НаСервереБезКонтекста
Функция ПолучитьИмяФормыПоСсылке ( Ссылка )

ИмяФормы = "ФормаУправленияНастройками" ;
Возврат Ссылка . Метаданные (). ПолноеИмя () + "." + ИмяФормы ;

&НаКлиенте
Процедура Подбор ( Команда )

//Открытие формы выбора с отбором по цвету(равно), массе(равно или больше) и периоду (в пределах)
НастройкиКД = Новый НастройкиКомпоновкиДанных ;

ОтборКД = НастройкиКД . Отбор . Элементы . Добавить ( Тип ( "ГруппаЭлементовОтбораКомпоновкиДанных" ));
ОтборКД . ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных . ГруппаИ ;
// 1)
Если ЗначениеЗаполнено ( Объект . Цвет ) И НЕ Объект . Цвет . Пустая () Тогда
ОтборКД = ОтборКД . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ОтборКД . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Цвет" );
ОтборКД . ВидСравнения = ВидСравненияКомпоновкиДанных . Равно ;
ОтборКД . Использование = Истина;
ОтборКД . ПравоеЗначение = Объект . Цвет ;
КонецЕсли;
// 2)
Если ЗначениеЗаполнено ( Объект . Масса ) И НЕ Объект . Масса . Пустая () Тогда
ОтборКД = ОтборКД . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ОтборКД . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Масса" );
ОтборКД . ВидСравнения = ВидСравненияКомпоновкиДанных . БольшеИлиРавно ;
ОтборКД . Использование = Истина;
ОтборКД . ПравоеЗначение = Объект . Масса ;
КонецЕсли;
// 3)
Если ЗначениеЗаполнено ( Объект . Период ) Тогда
ОтборКД = ОтборКД . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ОтборКД . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Дата" );
ОтборКД . ВидСравнения = ВидСравненияКомпоновкиДанных . БольшеИлиРавно ;
ОтборКД . Использование = Истина;
ОтборКД . ПравоеЗначение = Объект . Период . ДатаНачала ;

ОтборКД = ОтборКД . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ОтборКД . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Дата" );
ОтборКД . ВидСравнения = ВидСравненияКомпоновкиДанных . МеньшеИлиРавно ;
ОтборКД . Использование = Истина;
ОтборКД . ПравоеЗначение = Объект . Период . ДатаОкончания ;
КонецЕсли;
//Настройки
фПараметры = Новый Структура ;
фПараметры . Вставить ( "ФиксированныеНастройки" , НастройкиКД );
фПараметры . Вставить ( "РежимВыбора" ,Истина);
фПараметры . Вставить ( "МножественныйВыбор" ,Истина);

// Элементы.СписокПроизвДок - Табличная часть формы, в которой будет отрабатывать событие "ОбработкаВыбора"
// после того как будут выбраны документы из формы выбора.
ОткрытьФорму ( "Документ.Производство.ФормаВыбора" , фПараметры , Элементы . СписокПроизвДок );

Читайте также: