1с перебрать открытые формы

Обновлено: 26.04.2024

Открыть форму справочника можно несколькими способами:

А. По имени формы

Если требуется открыть основную форму нового элемента справочника или форму списка, достаточно написать следующий код:

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

ФормаОбъекта основная форма элемента справочника
ФормаГруппы основная форма группы справочника
ФормаСписка основная форма списка справочника
ФормаВыбора основная форма выбора справочника
ФормаВыбораГруппы основная форма выбора группы

Чтобы открыть любую другую форму, необходимо указать ее имя после ключевого слова Форма (точно так, как оно задано в конфигураторе):

Б. По ссылке

Если в контексте вызова доступна ссылка на элемент или группу справочника, можно воспользоваться параметрами формы:

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

Получение списка открытых окон и вывод свойств элементов


Похожие FAQ

Еще в этой же категории

Как на управляемой форме разместить список регистра сведений с отбором? 15
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Поле выбора

Программное создание таблицы значений с условным оформлением 6
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Посмотреть все в категории Работа с Формой (Диалог) и её элементами

В 1С есть возможность перебрать все открытые окна и проанализировать их содержимое. Рассмотрим работу с открытыми окнами на примере.

Предположим, что стоит задача при нажатии на кнопку анализировать открыта ли обработка «Моя обработка». Если обработка открыта и в ней не заполнен реквизит «Контрагент», то необходимо активизировать ее форму, в остальных случаях следует создать и открыть новую форму обработки. Данную задачу нельзя решить при помощи параметров метода ОткрытьФорму () .

Ниже представлен код для решения поставленной задачи:

Список открытых окон получается при помощи функции ПолучитьОкна () . Далее происходит обход открытых окон и анализ заголовков. Текст заголовков анализируется не по точному соответствию, а по вхождению необходимых слов, т.к. при изменении реквизитов в форме к заголовку может добавиться признак модифицированности — постфикс » *».

При нахождении нужного заголовка происходит получение управляемой формы и анализ реквизита «Контрагент». Если контрагент пустой, то текущее окно активизируется методом Активизировать () и выполнение процедуры прекращается.

Если нет открытых окон с требуемым заголовком и пустым реквизитом «Контрагент», происходит открытие нового окна при помощи метода ОткрытьФорму () . Четвертым параметром в метод передается уникальный идентификатор; это необходимо для того, чтобы в любом случае было открыто новое окно.

Остались вопросы?
Спросите в комментариях к статье.

2 комментария

Здравствуйте, при написании этого кода:
Процедура СохранитьДанныеКлиенскогоПриложения()
Окна = ПолучитьОкна();
Для каждого Окно Из Окна Цикл
Формы = Окно.Содержимое;
Для каждого Форма из Формы Цикл
Если Форма.Модифицировать Тогда
Файл = Новый ЗаписьXML
ФАйл.ОткрытьФайл0(«D:/Working»+Форма,ИмяФормы».xml»);
СериализаторXDTO.ЗаписатьXML(Файл,Форма.Объект);
Файл.Закрыть();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

После уго запуска высвечивает ошибку:
Поле объекта не обнаружено (Содержимое)

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

(21) Че МДИ.
Ну получишь дескрипторы окон, их элементов.
И?

Сушить их будешь?

(22) ну список окон то получить можно открытых, другое дело для чего это делать, так что ответ на (0) можно
(22) Хочу вынести форму объекта во внешнюю обработку - модуль объекта я вынес без проблем а вот с формой немножко лажово работает метод ВнешниеОтчеты.ПолучтиФорму("ИмяФормы",,Ссылка) - он не ищет среди открытых форм форму с индентификатором а каждый раз создает новую. ну видно делать нечего придется ручками контролить список. Я думал может метод какой нить есть.
(24) уверен в чем? в том что не работает метод - да уверен.
(24) как то верится с трудом. Вообще то первым параметром там идет имя файла, а уже вторым имя формы.
+(29) может еще из за владельца открываться другая форма.
- а владельца исползовать не могу так как оригинальную форму объекта нужно закрыть а в место нее показать из внешнего файла.

(32) сдаётся мне очередная "нетленко" рождается у сережи - удачи тебе коллега!

девиз "вперед на мины"

(32) а что мешает форму получить так:

(31) в таком случае зачем пихать ссылку в качестве ключа уникальности формы?
ИМХО - извращение.
(32) а причем сдесь форма отчета??
Речь идет о замене формы объекта к примеру формы Документа из конфы формой хранящейся во внешнем файле, отсюда и ссылка в качестве ключа уникальности.

(36) не вижу связи. Выдержка из СП:

<Ключ уникальности> (необязательный)
Тип: Произвольный. В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм.
При поиске учитываются значения свойств открытых форм соответствующим значениям параметров метода. Если найдена открытая форма (по совпадению всех параметров), то она будет возвращена вместо новой формы.
ЕСЛИ ИЗ НЕКОЕЙ ФОРМЫ(один и тот же владелец) требуется открывать новые экземпляры другой формы, то при каждом вызове метода значение данного параметра должно быть уникально (в рамках соответствующих значений свойств открытых форм).
Значение параметра присваивается свойству открываемой формы КлючУникальности.

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

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

Сообщить("Не открыта");
КонецЕсли;
вообще возможно ли получить форму открытого документа?

(1) Вы пишите "не могу получить форму открытого документа"
Форма Документа у вас уже открыта.
Надо проверить так ли это и при необходимости активировать.
А если не открыта - открыть.

Удобнее всего использовать подобный код:


При Ссылка.ПолучитьОбъект().ПолучитьФорму() - вы получаете форму нового экземпляра объекта. мне не надо получать форму нового экземпляра объекта - мне надо проверить открыт ли документ чтобы не потерялись данные в форме документа мне надо проверить открыт ли документ чтобы не потерялись данные в форме документа

Курите в сторону ЗаблокироватьДанныеДляРедактирования.
Т.к. я очень сильно сомневаюсь, что вы получите формы, открытые в других сеансах

т.е код примерно такой:

(5) Вы пишите "мне не надовы получать форму нового экземпляра объекта - мне надо проверить открыт ли документ"

Смотрите код внимательно.

: Ошибка при вызове метода контекста (ПолучитьФорму)
ФормаДок = Док.ПолучитьФорму( , "ФормаДокумента");
по причине:
Элемент не выбран!
А второй параметр где? У Заказа нумератор периодический. Поэтому ссылку не находит. + проверку нужно обязательно, на то что ссылка пустая.

(8) Очень сложно отлаживать программу не видя всего кода.
Ситуация как "у трёх слепых, изучающих одного слона"

Я исхожу из того, что код

Адекватный и там данные верные.

В отладчике посмотрите Объект - это конкретно документ?

По идее, можно сразу получить форму

(10) CaptainMorgan, в контексте основной задачи, которая звучит как мне надо проверить открыт ли документ чтобы не потерялись данные в форме документа - данный код неверен, т.к. вы не сможете, к примеру, получить формы, открытые в других сеансах.
Более того, даже в контексте темы этот код неверен, т.к. получается форма нового экземпляра объекта, т.е. гарантированно новая форма.

Исправил
Номер = Объект.ссылка.Номер;
ДатаД =Объект.ссылка.Дата;
Сообщить("номер "+ номер+ " " +датаД);
Док=Документы.ЗаказПокупателя.НайтиПоНомеру(Номер,ДатаД);
Сообщить("Док "+ Док.ссылка);

ФормаДок = Док.ссылка.ПолучитьФорму( , "ФормаДокумента",номер);
Если ФормаДок.Открыта() Тогда

Сообщить(" открыта");
иначе
Сообщить("не открыта");
КонецЕсли;

все равно не видит форму - документ открыт

(11) German_Tagil,
читай (6)
зы. И Док.ссылка - не нужно. У тебя в Док - уже ссылка. Док.Ссылка - работает как Док.ПолучитьОбъект().Ссылка да я до этого раньше от безисходности додумался
Если Не Объект.Заблокирован() Тогда
Объект.Заблокировать();
Объект.Записать();
Объект.Разблокировать();
иначе
оповестить("Нужно освободить документ " + Объект.ссылка);
КонецЕсли;
вот как-то так Нет у меня таких функций ЗаблокироватьДанныеДляИзменения(Ссылка) (17) German_Tagil, в синтакс-помощнике нет такой ф-ии? Синтаксический контроль на нее ругается? Платформа 8.1?
ЗаблокироватьДанныеДляРедактирования(), сорряй (19) German_Tagil, короче, попробуй код из (6) Мне в свое время этот метод очень помог в решении подобной задачи. ЗаблокироватьДанныеДляРедактирования() и что в данном случае блокируется там я конкретно только один документ блокирую (20) German_Tagil, блокируется объект по ключу Ссылка(отбор регистра) /идентификатор формы.
Данная блокировка - возникает при открытии формы. То есть если пользователь открыл форму существующего документа - он неявно заблокировал этот объект для редактирования. Когда ты в своей обработке - пытаешься заблокировать этот же объект (ту же ссылку по сути) - у тебя вылетает исключение, т.к. объект уже заблокирован открытой формой другого пользователя. Причем про эту форму тебе ничего знать не нужно.

тут другое интересно
ДатаСв=Док.ссылка.ПолучитьФорму("ФормаДокумента").Дата;
Сообщить("ДатаСв открыта"+ДатаСв);

ДатаСв открыта08.06.2015 12:57:28

те данные формы он видит

(23) German_Tagil, это данные не формы, а основного объекта формы. Т.е фактически ("ДокументОбъект" - по умолчанию) - Форма.ДокументОбъект.Дата ну муть-то блин неужели никак нельзя мне сегодня что-то подобное попадалось и вроде они запустили

вот нашел но тоже не работает
Док1 = ТекДок.ПолучитьОбъект();
ФормаДок1 = Док1.ПолучитьФорму(«ФормаДокумента»);
Если ФормаДок1.Открыта() Тогда

ФормаДок1 = ТекДок.ПолучитьФорму(«ФормаДокумента»);
не надо объект получать
issyk23
7 - 13.03.07 - 17:37
Да, так все получилось. Спасибо.
а у меня неполучилось

(27) ПолучитьФорму(<ПолноеИмяФайла>, <ИмяФормы>, <Владелец>, <КлючУникальности>)

<ПолноеИмяФайла> (обязательный)
Тип: Строка.
Путь к файлу внешней обработки.
<ИмяФормы> (необязательный)

Тип: Строка; ОбъектМетаданных: Форма .
Имя формы, как оно задано в конфигураторе.
Если параметр не указан, то используется форма, заданная в качестве основной.

<Владелец> (необязательный)
Тип: Форма.
Форма, которая будет являться владельцем открываемой формы. Если параметр не указан, то используется основная форма , заданная в конфигураторе.

<КлючУникальности> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм. Если будет найдена форма с таким же ключом уникальности, вместо открытия новой формы будет активизирована найденная форма.
Если параметр не указан, сначала всегда будет искаться уже открытая форма.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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