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