Отдельный механизм выбора не использует ОписаниеОповещенияОЗакрытии. Владельцу передаётся ВыбранноеЗначение и действительная форма ИсточникВыбора.
Где и как запускать
Полный модуль собственной общей управляемой формы УчебныеОкна85. Два экземпляра одной формы, тонкий клиент Windows; создание реквизитов на сервере, открытие/выбор/закрытие на клиенте.
Подготовка
Используйте отдельную пустую учебную конфигурацию 8.5.1.1343 без рабочих данных и тонкий управляемый клиент Windows. Создайте общую управляемую форму УчебныеОкна85; имя в дереве Общие → Общие формы должно совпадать с кодом.
На вкладке Параметры формы создайте Дочерняя, СтартовоеКоличество и КлючЗапроса. Значения передаются как Булево, Число и Строка. У всех трёх снимите Ключевой: пользовательский ключ уникальности задаётся отдельно четвёртым аргументом открытия.
Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставьте весь приведённый модуль выбранного урока. Реквизиты, поле количества, команду и кнопку вручную не создавайте: их добавляет код.
Для запуска добавьте в свою учебную обработку пустую управляемую форму и команду ОткрытьУчебноеОкно. Через конструктор обработчика создайте клиентскую процедуру команды и поместите в её тело ровно ОткрытьФорму("ОбщаяФорма.УчебныеОкна85");. Эта внешняя кнопка открывает главное окно, а кнопки внутри урока открывают его дочерний экземпляр.
В каждом уроке используйте отдельную копию своей конфигурации/формы. Все экземпляры создаются из одного полного модуля: главное окно имеет Дочерняя=Ложь, второе получает Дочерняя=Истина и собственные параметры.
Количество главного окна первоначально 3, цена книги 250. В дочернем поле можно выбрать целое количество 1–10; никакой номенклатуры, документов, регистров, файлов, сети и печати не используется.
Запуск в 1С не проверялся. Статические проверки не доказывают появление окна, возврат событий или фактическое поведение темы: выполните контрольные действия только на своём учебном стенде.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Новые = Новый Массив;
ЧисловойТип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
Новые.Добавить(Новый РеквизитФормы("УчебноеКоличество", ЧисловойТип));
Новые.Добавить(Новый РеквизитФормы("ЭтоДочерняяФорма", Новый ОписаниеТипов("Булево")));
Новые.Добавить(Новый РеквизитФормы("УчебныйКлючЗапроса", Новый ОписаниеТипов("Строка")));
ЭтаФорма.ИзменитьРеквизиты(Новые);
ЭтаФорма.ЭтоДочерняяФорма = Ложь;
ЭтаФорма.УчебноеКоличество = 3;
ЭтаФорма.УчебныйКлючЗапроса = "";
Если ЭтаФорма.Параметры.Свойство("Дочерняя", ПризнакДочерней) Тогда
Если ТипЗнч(ПризнакДочерней) = Тип("Булево") Тогда
ЭтаФорма.ЭтоДочерняяФорма = ПризнакДочерней;
КонецЕсли;
КонецЕсли;
Если ЭтоДочерняяФорма Тогда
Если Не ЭтаФорма.Параметры.Свойство("СтартовоеКоличество", ПереданноеКоличество) Тогда
ВызватьИсключение "Нет собственного параметра СтартовоеКоличество";
КонецЕсли;
Если ТипЗнч(ПереданноеКоличество) <> Тип("Число") Тогда
ВызватьИсключение "СтартовоеКоличество должно быть числом";
КонецЕсли;
Если ПереданноеКоличество < 1 Или ПереданноеКоличество > 10 Или ПереданноеКоличество <> Цел(ПереданноеКоличество) Тогда
ВызватьИсключение "СтартовоеКоличество должно быть целым от 1 до 10";
КонецЕсли;
Если Не ЭтаФорма.Параметры.Свойство("КлючЗапроса", ПереданныйКлюч) Тогда
ВызватьИсключение "Нет собственного параметра КлючЗапроса";
КонецЕсли;
Если ТипЗнч(ПереданныйКлюч) <> Тип("Строка") Тогда
ВызватьИсключение "КлючЗапроса должен быть собственной строкой";
КонецЕсли;
Если ПустаяСтрока(ПереданныйКлюч) Тогда
ВызватьИсключение "Собственный ключ запроса не задан";
КонецЕсли;
ЭтаФорма.УчебноеКоличество = ПереданноеКоличество;
ЭтаФорма.УчебныйКлючЗапроса = ПереданныйКлюч;
КонецЕсли;
Поле = Элементы.Добавить("ПолеУчебногоКоличества", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "УчебноеКоличество";
Поле.Заголовок = "Своих книг от 1 до 10";
Команда = Команды.Добавить("УчебноеДействие");
Команда.Действие = "ВыполнитьУчебноеДействие";
Команда.ИзменяетСохраняемыеДанные = Ложь;
Кнопка = Элементы.Добавить("КнопкаУчебногоДействия", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = Команда.Имя;
Если ЭтоДочерняяФорма Тогда
ЭтаФорма.Заголовок = "Собственное дочернее окно";
Команда.Заголовок = "Завершить собственный выбор";
Иначе
ЭтаФорма.Заголовок = "Главное учебное окно";
Команда.Заголовок = "Открыть собственное дочернее окно";
КонецЕсли;
ЭтаФорма.УстановитьДействие("ОбработкаВыбора", "ПослеУчебногоВыбора");
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьУчебноеДействие(Команда)
ПроверитьСвоёКоличество(УчебноеКоличество);
Если ЭтоДочерняяФорма Тогда
Результат = Новый Структура("КлючЗапроса,Количество,Сумма",
УчебныйКлючЗапроса, УчебноеКоличество, УчебноеКоличество * 250);
ЭтаФорма.ОповеститьОВыборе(Результат);
Возврат;
КонецЕсли;
УчебныйКлючЗапроса = Строка(Новый УникальныйИдентификатор);
ПараметрыДочерней = Новый Структура("Дочерняя,СтартовоеКоличество,КлючЗапроса", Истина, УчебноеКоличество, УчебныйКлючЗапроса);
ДочерняяФорма = ПолучитьФорму("ОбщаяФорма.УчебныеОкна85", ПараметрыДочерней, ЭтаФорма, Истина);
Если ДочерняяФорма = Неопределено Тогда
ВызватьИсключение "Своя общая форма не была получена";
КонецЕсли;
Если ТипЗнч(ДочерняяФорма) <> Тип("ФормаКлиентскогоПриложения") Тогда
ВызватьИсключение "Ожидалась своя управляемая форма";
КонецЕсли;
ДочерняяФорма.ЗакрыватьПриВыборе = Истина;
ДочерняяФорма.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца;
ДочерняяФорма.Открыть();
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоёКоличество(Знач Количество)
Если ТипЗнч(Количество) <> Тип("Число") Тогда
ВызватьИсключение "Количество должно быть числом";
КонецЕсли;
Если Количество < 1 Или Количество > 10 Или Количество <> Цел(Количество) Тогда
ВызватьИсключение "Выберите целое количество от 1 до 10";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеУчебногоВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ЭтоДочерняяФорма Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(ИсточникВыбора) <> Тип("ФормаКлиентскогоПриложения") Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Если Не ВыбранноеЗначение.Свойство("КлючЗапроса") Тогда
Возврат;
КонецЕсли;
Если ВыбранноеЗначение.КлючЗапроса <> УчебныйКлючЗапроса Тогда
Сообщить("Выбор старого собственного окна пропущен");
Возврат;
КонецЕсли;
Если ИсточникВыбора.УчебныйКлючЗапроса <> УчебныйКлючЗапроса Тогда
Возврат;
КонецЕсли;
ОжидаемыйКлюч = УчебныйКлючЗапроса;
УчебныйКлючЗапроса = "";
ПринятьСвойРезультат(ВыбранноеЗначение, ОжидаемыйКлюч);
КонецПроцедуры
&НаКлиенте
Процедура ПринятьСвойРезультат(Результат, Знач ОжидаемыйКлюч)
Если ТипЗнч(Результат) <> Тип("Структура") Тогда
ВызватьИсключение "Результат собственного окна должен быть структурой";
КонецЕсли;
Если Не Результат.Свойство("КлючЗапроса") Или Не Результат.Свойство("Количество") Или Не Результат.Свойство("Сумма") Тогда
ВызватьИсключение "Неполный собственный результат";
КонецЕсли;
Если Результат.КлючЗапроса <> ОжидаемыйКлюч Тогда
ВызватьИсключение "Результат относится к другому собственному запросу";
КонецЕсли;
ПроверитьСвоёКоличество(Результат.Количество);
Если ТипЗнч(Результат.Сумма) <> Тип("Число") Тогда
ВызватьИсключение "Сумма собственного результата должна быть числом";
КонецЕсли;
Если Результат.Сумма <> Результат.Количество * 250 Тогда
ВызватьИсключение "Сумма собственного результата не соответствует цене 250";
КонецЕсли;
УчебноеКоличество = Результат.Количество;
Сообщить(УчебноеКоличество = Результат.Количество);
Сообщить(Результат.Сумма = УчебноеКоличество * 250);
Сообщить(СтрШаблон("Принято своих книг: %1, сумма: %2", УчебноеКоличество, Результат.Сумма));
КонецПроцедуры
Разбор по шагам
Серверная подготовка назначает ОбработкаВыбора своей клиентской процедуре ПослеУчебногоВыбора. Сигнатура события два параметра, не четыре параметра поля ввода.
Получить собственное дочернее окно, владелец — именно главная форма, не ячейка таблицы. Создать новый строковый ключ запроса.
ЗакрыватьПриВыборе=Истина означает, что ОповеститьОВыборе после передачи результата закроет дочернюю форму.
Дочерняя кнопка передаёт структуру выбранного количества и суммы; не вызывает отдельно Закрыть(Результат) и не устанавливает описание закрытия.
Обработчик владельца проверяет тип источника, ключ структуры и собственный ключ источника перед принятием результата.
Для 5 книг владелец получает выбор и проверяет сумму 1250. Закрытие крестиком не является выбором, событие подтверждения не возникает.
Как проверить результат
При подтверждении 5 дочернее окно закрывается, главный реквизит становится 5 и выводятся два контроля Истина плюс сумма 1250.
При крестике главное количество не меняется, но сообщения обработчика закрытия нет: этот механизм к уроку не подключён. Следующая попытка создаёт новый собственный ключ.
Ожидаемый результат
ОбработкаВыбора и оповещение закрытия показаны как разные законченные протоколы, а не взаимозаменяемые процедуры.
На что обратить внимание
Не подключайте в этом опыте одновременно обработчик закрытия, который тоже принимает выбор: можно получить двойную обработку.
Если владелец — поле ввода, его ОбработкаВыбора имеет другую сигнатуру. Здесь владелец — собственная форма.
Свойство ЗакрыватьПриВыборе=Ложь подходит для отдельного сценария подбора; этот пример очищает ключ после одного подтверждения и не является многократным подбором.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.