Форма.Открыта

Методы · IsOpen

Определяет, открыта ли данная форма.

Синтаксис

Открыта()

Примеры платформы

Если Не Форма.Открыта() Тогда
    Форма.Открыть();
КонецЕсли;
Полное описание, параметры и ограничения

Форма.Открыта (Form.IsOpen)

Форма (Form)

Открыта (IsOpen)

Доступен, начиная с версии 8.0.

Синтаксис:
Открыта()
Возвращаемое значение:
Тип: Булево.
Истина - открыта; Ложь - не открыта.
Описание:

Определяет, открыта ли данная форма.

Доступность:

Толстый клиент.

Пример:

Если Не Форма.Открыта() Тогда
Форма.Открыть();
КонецЕсли;

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Открыть только просмотр нового узла в обычном клиенте

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

Где и как запускать

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

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.

  2. Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.

  3. Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.

  4. Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.

  5. Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки, вызывающую ВыполнитьПример() Экспорт. Каждый фрагмент выполняйте отдельно, не склеивайте их в одну процедуру.

  6. В отдельной пустой конфигурации Учебная85 создайте Планы обмена → УчебныйОбмен: длина кода 9, тип Строка, наименование длиной 100. Распределённая информационная база выключена; состав плана пустой.

  7. Добавьте реквизит АдресУчебногоУзла: Строка длиной 100, Проверка заполнения = Показывать ошибку. Модуль объекта и подписки должны быть пустыми; не добавляйте отправку сообщений или внешние действия.

  8. Добавьте макет УчебнаяПамятка типа Текстовый документ, одна строка: Этот узел используется только для учебных примеров. История данных для плана не включена. Обновите конфигурацию базы данных.

  9. Каждый фрагмент запускайте отдельно на сервере в ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи. УчебныйОбмен не является существующим рабочим обменом КА2 или УТ.

  10. Узел каждый раз новый и периферийный. Существующие узлы и текущий узел базы не меняются. Запись, блокировка и удаление далее выполняются только над своим новым UUID в собственной отменяемой транзакции.

  11. Для этого отдельного GUI-урока используйте толстый клиент в режиме Обычное приложение. Серверный общий модуль из других уроков здесь не подходит.

  12. Конфигуратор → Планы обмена → УчебныйОбмен → Формы: добавьте именно обычную форму объекта УчебнаяФормаУзла с основным реквизитом объекта. Добавьте поле Наименование, связанное с основным реквизитом. Кнопки Записать, ОК и Удалить в этой учебной форме не добавляйте; модуль формы пустой.

  13. Фрагмент поместите в обработчик собственной команды обычной внешней обработки. Не смешивайте его с управляемым клиентским модулем. После запуска осмотрите окно и закройте его штатным крестиком, без записи.

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

Разбор по шагам

  1. Создаём только свой новый периферийный узел и задаём учебное имя.

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

  3. Результат проверяется на Неопределено до обращения к форме.

  4. ТолькоПросмотр и отсутствие команд записи ограничивают редактирование именно этой учебной формы, не права всей ИБ.

  5. Открыть показывает окно. Новый статус и пустая ссылка доказывают, что пример не записал узел.

Как проверить результат

  1. Четыре сообщения Истина.

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

Ожидаемый результат

Получена и открыта своя обычная форма нового узла без сохранения.

На что обратить внимание

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

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

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Собственный подбор: открыть окно и принять результат

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

Где и как запускать

Полный модуль собственной обычной формы Пульт обработки УчебныйПодбор85. Только толстый клиент с обычными формами; не запускался.

Подготовка

  1. Создайте НОВУЮ пустую учебную конфигурацию УчебныеФормы85 на платформе 8.5.1.1343. Бизнес-объектов, расширений, подписок и регламентных заданий нет. Для уроков подбора добавьте только собственную обработку УчебныйПодбор85 и две обычные формы Пульт/Подбор. Другие уроки используют отдельные новые внешние обработки. Рабочие УТ, КА, УНФ и БП не изменяйте. Здесь никакие формы или базы не создавались и код не запускался: runtimeVerifiedScenarios=0.

  2. Создайте общий модуль УчебныеФормы85: Клиент (обычное приложение)=Да, Сервер=Да, Глобальный=Нет, Вызов сервера=Нет. Вставьте целиком отдельный модуль проверки стенда ниже. Обычная форма вызывает его в толстом клиенте; управляемая — только из серверного события создания.

  3. В своей конфигурации создайте только обработку УчебныйПодбор85 с обычными формами Пульт и Подбор. Пульт: реквизит ВыбранныйКод (Строка,10), поле отображения и кнопки ОткрытьПодбор/МодальныйПодбор/ЗакрытьПодбор. Подбор: реквизит Товары типа ТаблицаЗначений, табличное поле ТаблицаТоваров с Данные=Товары и кнопки Выбрать/Отмена. Рабочий справочник не нужен.

  4. В Пульт назначьте одноимённые действия кнопок и события ПриОткрытии, ОбработкаВыбора, ОбработкаОповещения. В Подбор назначьте Выбрать/Отмена; обработчик ПриОткрытии программно устанавливает Пульт. Процедура ПриОткрытии в Подбор содержит Экспорт и не имеет параметров — этого требует УстановитьДействие.

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

Перем Подбор;
Перем КлючПодбора;

Процедура ПриОткрытии()
    УчебныеФормы85.ПроверитьСвойПустойСтенд();
    Если Метаданные.Обработки.Количество() <> 1 Или Метаданные.Обработки[0].Имя <> "УчебныйПодбор85" Тогда
        ВызватьИсключение "Подготовьте только собственную обработку УчебныйПодбор85";
    КонецЕсли;
    КлючПодбора = Новый УникальныйИдентификатор;
    Подбор = Неопределено;
    ВыбранныйКод = "";
КонецПроцедуры

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

Процедура ОткрытьПодбор(Кнопка)
    ФормаПодбора = ПодготовитьПодбор();
    Если Не ФормаПодбора.Открыта() Тогда
        ФормаПодбора.Открыть();
    Иначе
        ФормаПодбора.Активизировать();
    КонецЕсли;
    Сообщить("Доступность ввода в своём подборе: " + Строка(ФормаПодбора.ВводДоступен()));
КонецПроцедуры

Процедура МодальныйПодбор(Кнопка)
    ФормаПодбора = ПодготовитьПодбор();
    Если ФормаПодбора.Открыта() Тогда
        Сообщить("Закройте свой немодальный подбор перед отдельным модальным опытом");
        Возврат;
    КонецЕсли;
    Код = ФормаПодбора.ОткрытьМодально(120);
    Если Код = Неопределено Тогда
        Сообщить("Отмена или таймаут; прежний код сохранён");
        Возврат;
    КонецЕсли;
    ПринятьКод(Код);
КонецПроцедуры

Процедура ЗакрытьПодбор(Кнопка)
    Если Подбор <> Неопределено И Подбор.Открыта() Тогда
        Подбор.Закрыть();
    КонецЕсли;
КонецПроцедуры

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

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия <> "УчебныйПодбор85.ПозицияВыбрана" Или ТипЗнч(Параметр) <> Тип("Структура") Тогда
        Возврат;
    КонецЕсли;
    Если Не Параметр.Свойство("Ключ", Ключ) Или Ключ <> КлючПодбора
        Или Не Параметр.Свойство("Код", Код) Или ТипЗнч(Источник) <> Тип("Форма")
        Или Источник.КлючУникальности <> КлючПодбора Тогда
        Возврат;
    КонецЕсли;
    Если ТипЗнч(Код) = Тип("Строка") И (Код = "A-01" Или Код = "B-02") Тогда
        Сообщить("Общее оповещение о своей позиции: " + Код);
    КонецЕсли;
КонецПроцедуры

Процедура ПринятьКод(Код)
    Если ТипЗнч(Код) <> Тип("Строка") Или (Код <> "A-01" И Код <> "B-02") Тогда
        ВызватьИсключение "Подбор должен вернуть только собственный A-01 или B-02";
    КонецЕсли;
    ВыбранныйКод = Код;
    Сообщить("Принят код: " + ВыбранныйКод);
КонецПроцедуры
УчебныйПодбор85.Подбор

Своя обработка УчебныйПодбор85 → Формы → Подбор → Модуль

Полный отдельный модуль второй обычной формы; не вставлять в основной модуль этого урока. Не выполнялся.

Процедура ПриОткрытии() Экспорт
    УчебныеФормы85.ПроверитьСвойПустойСтенд();
    Товары = Новый ТаблицаЗначений;
    Товары.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Товары.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Товары.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    Товары.Колонки.Добавить("Выбран", Новый ОписаниеТипов("Булево"));
    Книга = Товары.Добавить();
    Книга.Код = "A-01";
    Книга.Наименование = "Книга";
    Книга.Количество = 3;
    Книга.Выбран = Ложь;
    Ручка = Товары.Добавить();
    Ручка.Код = "B-02";
    Ручка.Наименование = "Ручка";
    Ручка.Количество = 1;
    Ручка.Выбран = Ложь;
    Таблица = ЭтаФорма.ЭлементыФормы.ТаблицаТоваров;
    Таблица.СоздатьКолонки();
    Таблица.АвтоВводНовойСтроки = Ложь;
    Если Товары.Количество() <> 2 Тогда
        ВызватьИсключение "Ожидались два собственных учебных товара";
    КонецЕсли;
    Таблица.ТекущаяСтрока = Товары[0];
    Если Не ЭтаФорма.РежимВыбора Или ЭтаФорма.МножественныйВыбор
        Или ТипЗнч(ЭтаФорма.ВладелецФормы) <> Тип("Форма") Тогда
        ВызватьИсключение "Откройте собственный одиночный подбор только из Пульта";
    КонецЕсли;
    Начальная = Товары.Найти(ЭтаФорма.НачальноеЗначениеВыбора, "Код");
    Если Начальная = Неопределено Тогда
        ВызватьИсключение "Начальный код не принадлежит своей таблице";
    КонецЕсли;
    Таблица.ТекущаяСтрока = Начальная;
    Таблица.ТолькоПросмотр = Истина;
КонецПроцедуры

Процедура Выбрать(Кнопка)
    Таблица = ЭтаФорма.ЭлементыФормы.ТаблицаТоваров;
    Строка = Таблица.ТекущаяСтрока;
    Если Строка = Неопределено Тогда
        Сообщить("Выберите собственную строку");
        Возврат;
    КонецЕсли;
    Если Товары.Количество() <> 2 Или (Строка.Код <> "A-01" И Строка.Код <> "B-02") Тогда
        ВызватьИсключение "Изменился собственный источник подбора";
    КонецЕсли;
    Пакет = Новый Структура("Ключ,Код", ЭтаФорма.КлючУникальности, Строка.Код);
    Оповестить("УчебныйПодбор85.ПозицияВыбрана", Пакет, ЭтаФорма);
    Если ЭтаФорма.МодальныйРежим Тогда
        ЭтаФорма.Закрыть(Строка.Код);
    Иначе
        ЭтаФорма.ОповеститьОВыборе(Строка.Код);
    КонецЕсли;
КонецПроцедуры

Процедура Отмена(Кнопка)
    ЭтаФорма.Закрыть();
КонецПроцедуры
УчебныеФормы85.ПроверкаСтенда

Своя пустая конфигурация УчебныеФормы85 → Общие → Общие модули → УчебныеФормы85

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

Процедура ПроверитьСвойПустойСтенд() Экспорт
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

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

  2. ВладелецФормы, КлючУникальности и ЗакрыватьПриЗакрытииВладельца задают связь двух своих окон. ЭтаФорма.ЭтаФорма в аргументе владельца показывает документированное свойство, возвращающее саму обычную форму; обычно достаточно контекстного ЭтаФорма.

  3. Пульт задаёт одиночный режим, авто-закрытие после выбора и НачальноеЗначениеВыбора=B-02. Подбор вручную находит этот код в собственной таблице и выбирает Ручку: автоматическое позиционирование главного списка здесь не обещается.

  4. РежимВыбора проверяется собственным обработчиком; фактический результат передаёт отдельная кнопка. Сам по себе флаг не превращает произвольную таблицу в стандартный главный список выбора. МножественныйВыбор=Ложь оставляет одиночный опыт.

  5. УстановитьДействие связывает событие ПриОткрытии с экспортной процедурой именно модуля Подбор. ПолучитьДействие проверяет тип назначенного действия, но не выдумывает недокументированное поле с именем обработчика.

  6. Немодальный результат поступает в ОбработкаВыбора владельца через ОповеститьОВыборе; форма закрывается по ЗакрыватьПриВыборе. Модальный опыт возвращает код через Закрыть(Код) → ОткрытьМодально(120), поэтому тот же код не посылается вторично через событие выбора.

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

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

Как проверить результат

  1. В будущем ручном опыте ОткрытьПодбор показывает две собственные строки, начальная — Ручка. Выберите Книгу: Пульт получает A-01, Подбор закрывается. Повторное нажатие при открытом подборе должно активизировать это окно, не создать лишнее.

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

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

  4. Закройте свой Пульт при немодальном Подбор: дочернее окно должно закрыться по своему флагу. Владельца открытой модальной формы нельзя закрыть до окончания дочернего выбора; не подменяйте этот запрет успешной проверкой.

  5. Здесь формы, таймаут, активация, события и закрытие не запускались; это проверки для будущего ручного протокола, не утверждение о runtime.

Ожидаемый результат

Подготовлены два полных модуля Пульт/Подбор и проверка собственного стенда. Ожидается одиночный выбор, сохранение кода при отмене и корректный жизненный цикл собственных окон. runtimeVerifiedScenarios=0.

На что обратить внимание

  1. Обычная Форма не равна ФормаКлиентскогоПриложения. Метод менеджера ПолучитьФорму из этого урока относится к толстому клиенту, не к тонкому/веб-клиенту.

  2. UUID используется только для своих экземпляров в данном опыте, не для поиска или закрытия произвольных чужих окон.

  3. Модальный и немодальный результат идут разными путями. Не посылайте один результат одновременно через Закрыть(Код) и ОповеститьОВыборе.

  4. Оповестить — широковещательное сообщение, не адресное и не граница безопасности. Наш фильтр предназначен для собственного пустого стенда; произвольным внешним данным нельзя доверять.

  5. ЗакрыватьПриЗакрытииВладельца влияет на окна, не записывает бизнес-объекты. Урок не обещает отсутствия внутренних операций интерфейса или сохранения его положения.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.