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