Как открыть форму
Перейти к содержимому

Как открыть форму

Программное открытие форм в управляемом приложении 1С

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

Это самый медленный метод открытия форм. Тем не менее, он позволяет программно обработать форму перед открытием. Для обработки код нужно немного изменить:

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

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

1. Как открыть форму объекта в управляемом приложении, если есть ссылка на него.

В этом случае все предельно просто.

2. Как открыть форму выбора и получить потом выбранное значение.

Для этого существует функция ВвестиЗначение(). У функции 3 параметра:

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

В результате выполнения функции откроется форма выбора по умолчанию для объекта указанного типа.

Перем Значение ;
Массив = новый массив ;
Массив . Добавить ( Тип ( "СправочникСсылка.Номенклатура" ) ) ;
Массив . Добавить ( Тип ( "СправочникСсылка.Контрагенты" ) ) ;

ОписаниеТипов = новый ОписаниеТипов ( Массив ) ;

Рез = ВвестиЗначение ( Значение , "Подсказка" , ОписаниеТипов ) ;

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

Эта функция имеет довольно много параметров. Рассмотрим некоторые из них:

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

Рассмотрим, как применяется функция ОткрытьФорму() в различных ситуациях.

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

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

&НаКлиенте
Процедура Команда 1 ( Команда )
Параметр = новый структура ;
Параметр . Вставить ( "Ключ" , НайтиС ( ) ) ;
ОткрытьФорму ( "Справочник.Контрагенты.ФормаОбъекта" , Параметр ) ;
КонецПроцедуры

&НаСервере
Функция НайтиС ( ) ;
Возврат Справочники . Контрагенты . НайтиПоРеквизиту ( "ИНН" , "745107734623" )
КонецФункции

4. Как открыть форму нового объекта

Тут подойдет просто функция ОткрытьФорму() без всяких параметров.

5. Как открыть форму нового объекта и заполнить ее на основании чего-либо

Нужно передать параметр Основание, значением которого будет являться ссылка на объект-основание заполнения. При этом будет запущена процедура ОбработкаЗаполнения().

В этом примере будет создан документ Реализация товаров и услуг и заполнен на основании счета на оплату покупателю, ссылка на который была передана.

6. Как открыть форму и задать на ней отбор

Отбор на формах 1С может быть простым и сложным. Простой отбор предусматривает выражения типа Организация = ООО «Рога и копыта». Сложный отбор предполагает и другие типы сравнения, например, В списке. В данной статье рассмотрим организацию простого отбора, а сложному будет посвящена отдельная статья.

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

Например, откроем форму списка справочника НомераГТД и сделаем там отбор по владельцу — элементу справочника Номенклатура.

&НаКлиенте
Процедура Команда 1 ( Команда )
Параметр = новый структура ;

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

Параметр . Вставить ( "Отбор" , Отбор ) ;

ОткрытьФорму ( "Справочник.НомераГТД.ФормаСписка" , Параметр ) ;
КонецПроцедуры

7. Как открыть форму записи регистра сведений

Для этого понадобится ключ записи регистра сведений.

Ключ записи — это значения всех измерений и период (если регистр периодический). То есть ключ записи — это параметры, по которым можно однозначно идентифицировать запись.

Алгоритм открытия следующий:

  1. Заносим в структуру данные ключа записи с необходимыми значениями.
  2. Помещаем полученную структуру в массив.
  3. Из массива создаем ключ записи.
  4. Передаем в открываемую форму параметр Ключ с ключом записи из п.3 в качестве значения.

&НаКлиенте
Процедура Команда 1 ( Команда )
Параметр = новый структура ;

ПараметрыКлюча = новый Структура ;
ПараметрыКлюча . Вставить ( "Номенклатура" , СсылкаНаНоменклатуру ) ;
ПараметрыКлюча . Вставить ( "ТипЦены" , СсылкаНаТипЦен ) ;
ПараметрыКлюча . Вставить ( "Период" , Дата ) ;

МассивКлюча = Новый Массив ;
МассивКлюча . Добавить ( ПараметрыКлюча ) ;

КлючЗаписи = Новый ( "РегистрСведенийКлючЗаписи.ЦеныНоменклатуры" , МассивКлюча ) ;

Параметр . Вставить ( "Ключ" , КлючЗаписи ) ;

ОткрытьФорму ( "РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи" , Параметр ) ;
КонецПроцедуры

Как в 1с открыть форму программно

В статье будет рассказано о том, как в 1с открыть форму программно. Все описанное ниже, касается только управляемого приложения. Подробно рассмотрим метод глобального контекста ОткрытьФорму.

Также можете ознакомиться с более простыми, но менее гибкими способами открыть форму по ссылке: Как в 1с открыть ссылку.

Метод ОткрытьФорму по имени

Самый гибкий и настраиваемый способ программного открытия формы в 1с 8. Рассмотрим подробно его параметры, а также разберем несколько примеров его использования.

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

Рассмотрим параметры метода и приведем необходимые примеры.

ИмяФормы

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

  • ТипОбъекта. Наименование типа объекта метаданных, например: Справочник, Документ, РегистрСведений и т. д.;
  • ИмяОбъекта. Наименование объекта метаданных. Например для справочника: Пользователи, Номенклатура;
  • ИмяФормыПоУмолчанию. Стандартное имя формы, набор имен по умолчанию различается для различных объектов метаданных. Например для документа: ФормаВыбора, ФормаОбъекта, ФормаСписка. Полный набор имен по умолчанию можно найти в синтаксис помощнике, в описании метода ОткрытьФорму;
  • ИмяФормы. Произвольное имя формы, заданное при ее создании. Например у справочника Пользователи, форма СменаПочты.

Пример 1. Путь к форме выбора по умолчанию, справочника Номенклатура.

Пример 2. Путь к форме СменаПочты справочника Пользователи, по ее имени.

Параметры

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

Подробнее прочитать описание всех возможных стандартных параметров можно в синтаксис помощнике, в ветке Интерфейс (управляемый) -> Форма клиентского приложения (в старых версиях платформы Управляемая форма). Далее в ветках Расширение объектов, Расширение справочника и т. д., можно найти Параметры формы. Там дается полный список возможных стандартных параметров с описаниями.

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

Рассмотрим примеры открытия различных форм с использованием параметров.

Пример 3. Открыть форму объекта справочника Пользователи, используя ссылку на объект.

Пример 4. Открыть форму списка справочника Номенклатура с отбором по реквизиту ВидНоменклатуры и по списку родителей.

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

Данным способом можно отобрать значения, используя вид сравнения Равно или ВСписке. Для отбора ВСписке следует добавить в структуру Массив, ФиксированныйМассив, либо СписокЗначений. Следует заметить, что отбор ВИерархии установить данным способом не выйдет.

Владелец

В данный параметр передается элемент формы или форма клиентского приложения (управляемая форма) полностью. Используется для указания подчинения открываемой формы.

Это может потребоваться для многих целей, например для:

  • Анализа владельца и выполнения определенных действий в открываемой форме;
  • Корректной работы события ОбработкаЗаписиНового, в форме владельце;
  • Самостоятельной реализации выбора в поле формы.

Пример 5. Реализовать программный выбор элемента Номенклатура, в поле ввода.

В данном случае необходимо:

  • Создать обработчик события НачалоВыбора, для поля ввода;
  • Отменить стандартную обработку выбора;
  • В параметр Владелец передать элемент формы (поле).

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

Уникальность

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

По умолчанию, платформа сама генерирует ключ уникальности. Поэтому помимо использования собственного ключа, в параметре Уникальность, можно регулировать использование стандартного. Если передать в него значение Ложь, то будет использован стандартный ключ, если значение Истина, то ключ не будет использоваться совсем. Т.е. будет создаваться новая форма, при каждом использовании метода ОткрытьФорму. Значением по умолчанию является Ложь, поэтому специально задавать его не требуется.

Пример 6. Одновременно открыть две формы объекта справочника Пользователи, по одной и той же ссылке.

В параметре можно указать окно, в котором будет открыта новая форма. Тип параметра ОкноКлиентскогоПриложения.

Пример 7. Реализовать программный выбор элемента Номенклатура, в поле ввода. Реализовать выбор в окне формы, на которой расположено поле.

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

НавигационнаяСсылка

Позволяет установить собственную навигационную ссылку для открываемой формы. Устанавливаемая навигационная ссылка должна иметь тип Строка. Значение по умолчанию: Неопределено, при использовании этого значения, навигационная ссылка задается автоматически.

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

В параметр передается описание процедуры, которая будет вызвана после закрытия открываемой формы. Тип параметра: ОписаниеОповещения.

Пример 8. В 1с открыть форму программно. Использовать форму объекта справочника Пользователи. После ее закрытия сообщить, что карточка пользователя закрыта.

Используемые в примере параметры описания оповещения:

  • Первый: имя процедуры;
  • Второй: модуль, в котором она расположена (в данном случае текущая форма);
  • Третий: структура дополнительных параметров, которая будет передана в процедуру;

Описанная процедура обязательно должна иметь два параметра:

  • Результат. Значение, которое возвращает форма при закрытии. Форма объекта не возвращает значений (если это специально не прописать), поэтому в данном случае значение параметра будет Неопределено. А вот форма выбора, например, вернет массив выбранных значений.
  • ДопПараметры. Структура параметров, созданная в описании оповещения.

Также описанная процедура должна быть экспортной.

РежимОткрытияОкна

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

  • БлокироватьВеcьИнтерфейс;
  • БлокироватьОкноВладельца;
  • Независимый.

Метод ОткрытьФорму по форме

Существует еще один вариант синтаксиса метода ОткрытьФорму.

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

Пример 9. Получить форму списка справочника Номенклатура, а затем в 1с открыть форму программно.

Как открыть и закрыть форму из другой формы в C# (правильное решение)

Как открыть и закрыть форму из другой формы в C# (правильное решение)

C# изучаю не так давно и встала передо мной недавно задача:
— открыть Form2 при нажатии на кнопку в Form1;
— спрятать Form1;
— открыть Form1 при закрытии Form2.
На первый взгляд задача показалась элементарной, но… возникли нюансы — при закрытии приложения оно не выгружалось и в диспетчере задач мы наблюдали его работу, хотя визуально оно как бы закрылось.

В чём же причина такого поведения? Об этом расскажу дальше. Рассмотрим открытие и закрытие форм на примерах.

Открываем и закрываем форму из другой формы

У нас в приложении есть две формы Form1 — главная, которая открывается сразу при запуске приложения и Form2, которую открываем по нажатию на кнопку.

Чтобы открыть Form2 нам необходим следующий код, который будет срабатывать при нажатии на кнопку:

Теперь у нас открылась Form2 и спряталась Form1. Поработав с Form2 мы её закрываем и при этом нам надо после этого отобразить Form1. Многие начинающие, включая меня начинают писать следующий код, который помещаем в событие, которое происходит после закрытия Form2:

Вроде всё логично: Form2 закрылась, Form1 открылась. Однако используя этот метод, мы можем заметить, что после того как мы закрываем приложение оно продолжает висеть в памяти. Многие, не зная почему это происходит дописывают в метод «Form1_FormClosed» дописывают принудительное закрытие приложения:

Это работает, однако правильно ли это? Решать вам.

А теперь ответим на вопрос «почему приложение висит в памяти» и рассмотрим простое и правильное решение.

Первая часть кода: мы отображаем Form2 и скрываем Form1. Не закрываем, а именно скрываем, т.е. экземпляр Form1 продолжает существовать.

Закрыть Form1 вместо скрытия не получится, так как это главная форма приложения и при её закрытии мы закроем всё приложение.

Вторая часть кода: строкой «Form ifrm = new Form1();» мы создаём второй экземпляр Form1 и далее его и отображаем, а первый экземпляр Form1 продолжает жить в памяти. И когда мы закрываем приложение (Form1), то первый экземпляр при этом не закрываем он так и «сидит» в памяти, поэтому приложение не выгружается из памяти. В связи с этим многие и закрывают принудительно приложение при закрытии главной формы (Form1).

Сейчас мы с вами рассмотрим правильный код, который не будет создавать второй экземпляр Form1 и отображать его, а будет отображать скрытую до этого Form1.

OpenForms — получает коллекцию открытых форм приложения. В нашем случае мы сразу обратились к главной форме приложения (OpenForms[0]).

Теперь при закрытии Form2 у нас будет вызываться и отображаться та форма, которая породила закрывающуюся.

Учитываем координаты форм при открытии

Представьте ситуацию. Открыта Form1 вы её перемещаете в правый верхний угол экрана. Потом нажимаете на кнопку и… Form2 открывается по центру экрана или в другом месте, но не в том месте, где была Form1. Многие улыбнуться и скажут, что в свойствах Form2 надо прописать/указать следующее «StartPosition -> CenterParent» и открывать Form2 следующим методом:

Form ifrm = new Form2();
ifrm.ShowDialog();

Это правильное решение, которое всегда будет открывать Form2 поверх Form1 и всегда по центру Form1. Однако этот код не применим, если вам надо скрывать Form1, так как Form1 не будет скрываться.

Сейчас приведу полное решение, которое позволит открывать Form1 и Form2 в той же точке, где находилась до этого форма, вызывающая другую форму. Код включает всё вышеописанное. В свойствах форм надо прописать следующее (прямо в студии выбираете эти значения):

— свойство Form1: «StartPosition -> CenterScreen»
— свойство Form2: «StartPosition -> Manual»

Как открыть и закрыть форму из другой формы в C# (правильное решение)

Теперь вы не создаёте второго экземпляра Form1 и приложение всегда будет закрываться, не оставаясь в памяти.

Открываем форму поверх другой формы, как модальное окно

Чтобы открыть Form2 поверх Form1, как модальное окно, не скрывая Form1, вам хватит этого кода:

В итоге Form2 будет открыта поверх Form1. В этом случае пользователь не сможет переключиться на Form1 не закрыв Form2.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *