Форма.ОповеститьОВыборе

Методы · NotifyChoice

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

Синтаксис

ОповеститьОВыборе(<ЗначениеВыбора>)

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

ОповеститьОВыборе(ТекущаяСтрока);
Полное описание, параметры и ограничения

Форма.ОповеститьОВыборе (Form.NotifyChoice)

Форма (Form)

ОповеститьОВыборе (NotifyChoice)

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

Синтаксис:
ОповеститьОВыборе(<ЗначениеВыбора>)
Параметры:

<ЗначениеВыбора> (обязательный)
Тип: Произвольный.
Результат выбора.
Описание:

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

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

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

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

ОповеститьОВыборе(ТекущаяСтрока);

См. также:
Форма, событие ОбработкаВыбора

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

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

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

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

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

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

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

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

Подготовка

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

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

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

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

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

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

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

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

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

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

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

Процедура ПриОткрытии()
    УчебныеФормы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

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

Процедура ПроверитьСвойПустойСтенд() Экспорт
    Если Метаданные.Справочники.Количество() <> 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С» и не аффилирован с ней.