1с закрыть форму по ключу уникальности
В статье будет рассказано о том, как в 1с открыть форму программно. Все описанное ниже, касается только управляемого приложения. Подробно рассмотрим метод глобального контекста ОткрытьФорму.
Также можете ознакомиться с более простыми, но менее гибкими способами открыть форму по ссылке: Как в 1с открыть ссылку.
Метод ОткрытьФорму по имени
Самый гибкий и настраиваемый способ программного открытия формы в 1с 8. Рассмотрим подробно его параметры, а также разберем несколько примеров его использования.
Следует заметить, что метод ОткрытьФорму является клиентским. Т.е его можно использовать либо в общих модулях с установленным флагом Клиент, либо в процедурах (функциях) форм с директивой &НаКлиенте.
Рассмотрим параметры метода и приведем необходимые примеры.
ИмяФормы
Содержит полный путь к форме. Можно указать, как путь к форме по умолчанию, так и путь к произвольной форме объекта метаданных. Имя формы указывается в следующих двух форматах:
- ТипОбъекта. Наименование типа объекта метаданных, например: Справочник, Документ, РегистрСведений и т. д.;
- ИмяОбъекта. Наименование объекта метаданных. Например для справочника: Пользователи, Номенклатура;
- ИмяФормыПоУмолчанию. Стандартное имя формы, набор имен по умолчанию различается для различных объектов метаданных. Например для документа: ФормаВыбора, ФормаОбъекта, ФормаСписка. Полный набор имен по умолчанию можно найти в синтаксис помощнике, в описании метода ОткрытьФорму;
- ИмяФормы. Произвольное имя формы, заданное при ее создании. Например у справочника Пользователи, форма СменаПочты.
Пример 1. Путь к форме выбора по умолчанию, справочника Номенклатура.
Пример 2. Путь к форме СменаПочты справочника Пользователи, по ее имени.
Параметры
Содержит Структуру параметров, которые передаются в открываемую форму. Для каждого типа формы, существует набор стандартных параметров, которые не нужно дополнительно обрабатывать в самой форме. Также набор параметров может различаться и для объектов метаданных. Например, параметр Ключ, для форм объектов. В него можно передать ссылку на открываемый объект (если его не передать, будет открыта форма нового объекта).
Подробнее прочитать описание всех возможных стандартных параметров можно в синтаксис помощнике, в ветке Интерфейс (управляемый) -> Форма клиентского приложения (в старых версиях платформы Управляемая форма). Далее в ветках Расширение объектов, Расширение справочника и т. д., можно найти Параметры формы. Там дается полный список возможных стандартных параметров с описаниями.
Также в структуру можно передавать произвольные параметры, которые можно обрабатывать программно, в открываемой форме. Например в обработчике события ПриСозданииНаСервере.
Рассмотрим примеры открытия различных форм с использованием параметров.
Пример 3. Открыть форму объекта справочника Пользователи, используя ссылку на объект.
Пример 4. Открыть форму списка справочника Номенклатура с отбором по реквизиту ВидНоменклатуры и по списку родителей.
Данным способом можно отобрать значения, используя вид сравнения Равно или ВСписке. Для отбора ВСписке следует добавить в структуру Массив, ФиксированныйМассив, либо СписокЗначений. Следует заметить, что отбор ВИерархии установить данным способом не выйдет.
Владелец
В данный параметр передается элемент формы или форма клиентского приложения (управляемая форма) полностью. Используется для указания подчинения открываемой формы.
Это может потребоваться для многих целей, например для:
- Анализа владельца и выполнения определенных действий в открываемой форме;
- Корректной работы события ОбработкаЗаписиНового, в форме владельце;
- Самостоятельной реализации выбора в поле формы.
Пример 5. Реализовать программный выбор элемента Номенклатура, в поле ввода.
В данном случае необходимо:
- Создать обработчик события НачалоВыбора, для поля ввода;
- Отменить стандартную обработку выбора;
- В параметр Владелец передать элемент формы (поле).
Параметр ТекущаяСтрока, позволяет выделять ранее выбранный элемент в форме выбора. Стоит заменить, что в обычной ситуации такой метод выбора значений не применяется. Его применяют только тогда, когда нет возможности настроить форму выбора под условия задачи.
Уникальность
В параметре можно задать ключ уникальности формы произвольного типа. При открытии формы, платформа будет анализировать, есть в текущем сеансе уже открытая форма, с таким же ключом уникальности. Если такая форма будет найдена, то она будет активизирована, а новая не откроется. Этот механизм работает только для одинаковых форм. Если вы будете открывать формы объекта разных документов с одинаковым ключом, то откроются обе.
По умолчанию, платформа сама генерирует ключ уникальности. Поэтому помимо использования собственного ключа, в параметре Уникальность, можно регулировать использование стандартного. Если передать в него значение Ложь, то будет использован стандартный ключ, если значение Истина, то ключ не будет использоваться совсем. Т.е. будет создаваться новая форма, при каждом использовании метода ОткрытьФорму. Значением по умолчанию является Ложь, поэтому специально задавать его не требуется.
Пример 6. Одновременно открыть две формы объекта справочника Пользователи, по одной и той же ссылке.
В параметре можно указать окно, в котором будет открыта новая форма. Тип параметра ОкноКлиентскогоПриложения.
Пример 7. Реализовать программный выбор элемента Номенклатура, в поле ввода. Реализовать выбор в окне формы, на которой расположено поле.
В этом примере мы получаем окно текущей формы и используем его для открытия формы выбора справочника.
НавигационнаяСсылка
Позволяет установить собственную навигационную ссылку для открываемой формы. Устанавливаемая навигационная ссылка должна иметь тип Строка. Значение по умолчанию: Неопределено, при использовании этого значения, навигационная ссылка задается автоматически.
ОписаниеОповещенияОЗакрытии
В параметр передается описание процедуры, которая будет вызвана после закрытия открываемой формы. Тип параметра: ОписаниеОповещения.
Пример 8. В 1с открыть форму программно. Использовать форму объекта справочника Пользователи. После ее закрытия сообщить, что карточка пользователя закрыта.
Используемые в примере параметры описания оповещения:
- Первый: имя процедуры;
- Второй: модуль, в котором она расположена (в данном случае текущая форма);
- Третий: структура дополнительных параметров, которая будет передана в процедуру;
Описанная процедура обязательно должна иметь два параметра:
- Результат. Значение, которое возвращает форма при закрытии. Форма объекта не возвращает значений (если это специально не прописать), поэтому в данном случае значение параметра будет Неопределено. А вот форма выбора, например, вернет массив выбранных значений.
- ДопПараметры. Структура параметров, созданная в описании оповещения.
Также описанная процедура должна быть экспортной.
РежимОткрытияОкна
Позволяет указать режим открытия управляемой формы. По умолчанию Неопределено, вручную можно задать одно из значений системного перечисления РежимОткрытияОкнаФормы:
- БлокироватьВеcьИнтерфейс;
- БлокироватьОкноВладельца;
- Независимый.
Метод ОткрытьФорму по форме
Существует еще один вариант синтаксиса метода ОткрытьФорму.
Используется, если вы уже получили форму, произвели с ней какие-то действия и теперь ее необходимо открыть.
Пример 9. Получить форму списка справочника Номенклатура, а затем в 1с открыть форму программно.
В форме размещаем кнопку "Подбор". Это может быть кнопка панели инструментов или отдельно стоящая кнопка.
В обработчике события Нажатие для кнопки пишем:
При этом происходят довольно интересные вещи:
1. В первой строке получаем форму выбора. Это особая форма, которая может не совпадать с формой списка (а может совпадать). Форму выбора можно создать самому, или она будет сгенерирована системой автоматически, или форма списка может работать в режиме выбора.
Если вы получили не форму подбора, а обычную форму (методом ПолучитьФорму или ПолучитьФормуСписка), то по умолчанию у нее не установлено свойство РежимВыбора. Нужно или установить это свойство в Истина, или оповещать о выборе элемента самостоятельно (см. метод формы ОповеститьОВыборе).
а) Первым параметром можно передать имя формы или объект описания метаданных типа формы. Если у объекта несколько форм выбора, то здесь можно указать, какую форму нужно использовать.
б) Вторым параметр указывается владелец формы - форма или элемент управления, из которого производится вызов формы выбора. После совершения выбора именно владельцу формы будет послано оповещение о выборе, которое инициирует событие "ОбработкаВыбора" (у формы или элемента формы).
в) Третьим параметром можно указать ключ уникальности для поиска среди уже открытых форм. Если форма с таким ключом уникальности будет найдена, то будет возвращена именно она. Это удобно, если не нужно открывать новых форм выбора.
2. Вторая строка устанавливает режим, при котором после выбора значения форма не будет закрываться, т.е. это и и есть основная функция подбора. При множественном выборе это свойство имеет смысл установить в Истина, но об этом ниже. Здесь же можно присвоить и другие свойства открываемой формы, например, расположение на экране, задать значения реквизитов формы или экспортных переменных модуля формы.
3. Третья строка открывает форму выбора. После первой строки форма еще не была открыта, но ее модуль уже был скомпилирован и инициализирован.
В свойствах формы должен быть назначен обработчик события "ОбработкаВыбора".
2. Множественный выбор
При таком выборе пользователь может выделить сразу несколько элементов (например, с помощью клавиши Ctrl) и после нажатия кнопки "Выбрать" система вернет массив выбранных элементов, а не один элемент, как в первом случае.
Тогда обработчик события ОбработкаВыбора можно написать так:
Примечание: Для ручной генерации события выбора из формы подбора нужно использовать функцию ОповеститьОВыборе.
Механизм уникальности форм
В платформе "1С:Предприятие 8" реализован механизм, позволяющий найти ранее созданный экземпляр формы. Поиск уже существующего экземпляра формы производится каждый раз при попытке получения формы. Контроль уникальности форм производится на основе анализа различных факторов. Состав данных факторов определяется расширением формы, зависящим от типа основного реквизита формы. Если же основной реквизит формы не установлен или имеет тип, для которого нет расширения формы, то уникальность экземпляров данной формы будет определяться значением владельца формы. Таким образом, в платформе реализована некая стратегия подбора экземпляра формы, зависящая от типа, редактируемого в форме значения.
Например: для расширения формы списка справочника при подборе формы проверяется владелец формы, далее анализируется признак режима выбора. Для расширения формы элемента справочника производится анализ экземпляра объекта, затем значение ссылки, если же получается форма нового элемента, то, дополнительно, осуществляется проверка признака ЭтоГруппа . Таким образом, получение формы элемента справочника путем вызова метода объекта приводит к получению экземпляра формы именно данного объекта. Вызов метода у ссылки приведет к получению формы элемента справочника, обладающего данной ссылкой (если в памяти имеется два экземпляра объекта с данным значением ссылки, то форма будет получена у одного из них, причем конкретный порядок выбора неопределен). Вследствие этого можно рекомендовать получать форму элемента справочника посредством вызова метода у ссылки, а не у объекта.
Однако в некоторых случаях необходимо получить новый экземпляр формы (вне зависимости от наличия существующих экземпляров) или же получить определенный экземпляр формы, созданный ранее. Для этих целей предназначен параметр <Ключ уникальности> различных методов получения формы ( ПолучитьФорму (), ПолучитьФормуВыбора() , ПолучитьФормуНовогоДокумента() и т.д.). Ключ уникальности выделяет экземпляр формы внутри подмножества экземпляров, определяемого стандартным механизмом уникальности форм.
Значением ключа может являться значение произвольного типа.
Например: если необходимо открывать различные экземпляры формы списка справочника сотрудников с установленным отбором по подразделению, то в качестве ключа уникальности (при открытии формы списка) можно передавать ссылку на подразделение, устанавливаемую в качестве отбора. Это позволит иметь различные экземпляры форм списка для различных подразделений и, одновременно, не открывать лишних форм списка для уже просматриваемых списков сотрудников подразделения.
Удобно в качестве ключа использовать значение типа УникальныйИдентификатор . Передача в качестве ключа нового значения данного типа - гарантирует получение нового экземпляра формы.
Есть структура (может быть пустой) и есть независимая форма, необходимо открыть эту форму и отобразить в ней данные структуры.
Загвоздка в том, что если форма уже открыта с такой структурой, то при повторном открытии - она должна быть активирована, а не создана новая форма с такой же структурой.
Форма открывается вот так:
"Ключ" - ключевой параметр формы.
Перепробовал кажется уже всё что можно, ставил ключевой параметр, выключал его, ставил "Неопределенно" в поле Владелец, ставил Ложь в поле "Уникальность", ничего не помогает, либо открывается новая форма, либо уже открытая, но со старой структурой (а передается новая структура).
У меня подозрение что ключом уникальности для формы может выступать только УникальныйИдентификатор и Ссылка, но информации об это я нигде не нашел.
(1) Вы ведь в качестве уникальности используете, скорее всего, разные объекты структур? Пусть и с одинаковыми значениями полей, но для формирования уникальности вы каждый раз используете Новый Структура() . Поэтому и открываются разные формы.В вашем случае можно тогда в качестве Уникальности передавать значение ЗначениеВСтрокуВнутр(. ). Но тут тоже нюансик - этот метод в тонком клиенте не работает, его заранее сформировать на сервере.
Либо можете как-то кешировать структуры уникальности. (1) Вы ведь в качестве уникальности используете, скорее всего, разные объекты структур? Пусть и с одинаковыми значениями полей, но для формирования уникальности вы каждый раз используете Новый Структура() . Поэтому и открываются разные формы.
В вашем случае можно тогда в качестве Уникальности передавать значение ЗначениеВСтрокуВнутр(. ). Но тут тоже нюансик - этот метод в тонком клиенте не работает, его заранее сформировать на сервере.
Либо можете как-то кешировать структуры уникальности. (6) Больше спасибо, теперь всё встало на свои места, код выполняется на сервере, так что думаю что "ЗначениеВСтрокуВнутр()" подойдет.
(7) У структуры параметры не упорядочены, как результат, одинаковая структура по логике может формировать разные строки.
можно сделать так:
в модулеПовтИсп формировать Фиксированную Структуру, параметров простых типов: Неопределено, Null, Булево, Дата, Строка, Число, Ссылка.
(модуль должен вызываться из клиента, что бы работало то что написано далее)
если эту процедуру вызывать из модуля клиента, то в течении 20 минут будет возвращаться одна и таже структура.
(при условии, что хватает памяти на кеш этой структуры)
PS я один раз сделал именно так, т.е. логика 100% рабочая.
но я расширил эту логику - открытая форма сама, с какой-то периодичностью вызывала эту процедуру, и сравнивала полученную Фиксированную структуру с той что у неё есть, и если она разная, то самозакрывалась.
Читайте также: