Как получить список открытых окон 1С

Как получить список открытых окон 1С

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


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

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

&НаКлиенте
Процедура ОткрытьФормуОбработки(Команда)
	
	// Получение всех открытых окон приложения
	ОкнаПриложения = ПолучитьОкна();
	Для каждого ОкноПриложения Из ОкнаПриложения Цикл
		// Анализ заголовка окна
		Если Найти(ОкноПриложения.Заголовок, "Моя обработка") > 0 Тогда
			// Получение формы
			НайденнаяФорма = ОкноПриложения.Содержимое[0];
			// Анализ реквизита формы
			Если НЕ ЗначениеЗаполнено(НайденнаяФорма.Контрагент) Тогда
				ОкноПриложения.Активизировать();
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	// Окон для активизации не нашлось. Открываем новое окно
	ОткрытьФорму("Обработка.МояОбработка.Форма", , , Новый УникальныйИдентификатор);

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

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

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

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

Смотри также:

Программное получение информации о компьютере и конфигурации
Открытие внешней обработки или отчета программно
Срез последних на каждую дату

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

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

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

    1. Author

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

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

Ваш e-mail не будет опубликован.