ФормаКлиентскогоПриложения.ЗакрыватьПриВыборе

Свойства · CloseOnChoice

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

Полное описание, параметры и ограничения

ФормаКлиентскогоПриложения.ЗакрыватьПриВыборе (ClientApplicationForm.CloseOnChoice)

ФормаКлиентскогоПриложения (ClientApplicationForm)

ЗакрыватьПриВыборе (CloseOnChoice)

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

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

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

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

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

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

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

ОповеститьОВыборе: вернуть свой выбор событием владельца

Отдельный механизм выбора не использует ОписаниеОповещенияОЗакрытии. Владельцу передаётся ВыбранноеЗначение и действительная форма ИсточникВыбора.

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

Полный модуль собственной общей управляемой формы УчебныеОкна85. Два экземпляра одной формы, тонкий клиент Windows; создание реквизитов на сервере, открытие/выбор/закрытие на клиенте.

Подготовка

  1. Используйте отдельную пустую учебную конфигурацию 8.5.1.1343 без рабочих данных и тонкий управляемый клиент Windows. Создайте общую управляемую форму УчебныеОкна85; имя в дереве Общие → Общие формы должно совпадать с кодом.

  2. На вкладке Параметры формы создайте Дочерняя, СтартовоеКоличество и КлючЗапроса. Значения передаются как Булево, Число и Строка. У всех трёх снимите Ключевой: пользовательский ключ уникальности задаётся отдельно четвёртым аргументом открытия.

  3. Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставьте весь приведённый модуль выбранного урока. Реквизиты, поле количества, команду и кнопку вручную не создавайте: их добавляет код.

  4. Для запуска добавьте в свою учебную обработку пустую управляемую форму и команду ОткрытьУчебноеОкно. Через конструктор обработчика создайте клиентскую процедуру команды и поместите в её тело ровно ОткрытьФорму("ОбщаяФорма.УчебныеОкна85");. Эта внешняя кнопка открывает главное окно, а кнопки внутри урока открывают его дочерний экземпляр.

  5. В каждом уроке используйте отдельную копию своей конфигурации/формы. Все экземпляры создаются из одного полного модуля: главное окно имеет Дочерняя=Ложь, второе получает Дочерняя=Истина и собственные параметры.

  6. Количество главного окна первоначально 3, цена книги 250. В дочернем поле можно выбрать целое количество 1–10; никакой номенклатуры, документов, регистров, файлов, сети и печати не используется.

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

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

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

&НаКлиенте
Процедура ПроверитьСвоёКоличество(Знач Количество)
    Если ТипЗнч(Количество) <> Тип("Число") Тогда
        ВызватьИсключение "Количество должно быть числом";
    КонецЕсли;
    Если Количество < 1 Или Количество > 10 Или Количество <> Цел(Количество) Тогда
        ВызватьИсключение "Выберите целое количество от 1 до 10";
    КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура ПринятьСвойРезультат(Результат, Знач ОжидаемыйКлюч)
    Если ТипЗнч(Результат) <> Тип("Структура") Тогда
        ВызватьИсключение "Результат собственного окна должен быть структурой";
    КонецЕсли;
    Если Не Результат.Свойство("КлючЗапроса") Или Не Результат.Свойство("Количество") Или Не Результат.Свойство("Сумма") Тогда
        ВызватьИсключение "Неполный собственный результат";
    КонецЕсли;
    Если Результат.КлючЗапроса <> ОжидаемыйКлюч Тогда
        ВызватьИсключение "Результат относится к другому собственному запросу";
    КонецЕсли;
    ПроверитьСвоёКоличество(Результат.Количество);
    Если ТипЗнч(Результат.Сумма) <> Тип("Число") Тогда
        ВызватьИсключение "Сумма собственного результата должна быть числом";
    КонецЕсли;
    Если Результат.Сумма <> Результат.Количество * 250 Тогда
        ВызватьИсключение "Сумма собственного результата не соответствует цене 250";
    КонецЕсли;
    УчебноеКоличество = Результат.Количество;
    Сообщить(УчебноеКоличество = Результат.Количество);
    Сообщить(Результат.Сумма = УчебноеКоличество * 250);
    Сообщить(СтрШаблон("Принято своих книг: %1, сумма: %2", УчебноеКоличество, Результат.Сумма));
КонецПроцедуры

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

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

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

  3. ЗакрыватьПриВыборе=Истина означает, что ОповеститьОВыборе после передачи результата закроет дочернюю форму.

  4. Дочерняя кнопка передаёт структуру выбранного количества и суммы; не вызывает отдельно Закрыть(Результат) и не устанавливает описание закрытия.

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

  6. Для 5 книг владелец получает выбор и проверяет сумму 1250. Закрытие крестиком не является выбором, событие подтверждения не возникает.

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

  1. При подтверждении 5 дочернее окно закрывается, главный реквизит становится 5 и выводятся два контроля Истина плюс сумма 1250.

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

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

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

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

  1. Не подключайте в этом опыте одновременно обработчик закрытия, который тоже принимает выбор: можно получить двойную обработку.

  2. Если владелец — поле ввода, его ОбработкаВыбора имеет другую сигнатуру. Здесь владелец — собственная форма.

  3. Свойство ЗакрыватьПриВыборе=Ложь подходит для отдельного сценария подбора; этот пример очищает ключ после одного подтверждения и не является многократным подбором.

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

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

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

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

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