Показать возвращает управление сразу; callback получает Текст и собственное Состояние.
Где и как запускать
Полный модуль собственной управляемой формы. Диалог только редактирует учебный черновик.
Подготовка
Собственная учебная конфигурация УчебнаяКонфигурацияСинтаксиса, платформа 8.5.1.1343. Создайте новую внешнюю обработку с пустой управляемой основной формой.
В форме создайте команду ОткрытьУчебныйКонструктор, её кнопку и назначьте действие одноимённой процедуре. Назначьте событие ПриОткрытии обработчику из кода. Каждый урок — отдельный полный модуль формы.
Асинхронный и callback-уроки выполняются на клиенте Windows; модальный вариант — только толстый клиент собственной базы, где модальные вызовы уже разрешены. Режим рабочей конфигурации ради урока не меняйте.
Черновик из двух параметров не содержит ИЗ и не читает таблицы базы. Диалог может показывать структуру вашей учебной конфигурации, но этот код не выполняет даже принятый текст.
Первый опыт: измените состав полей в редакторе и нажмите Отмена. Второй опыт: снова откройте, измените псевдоним поля и нажмите ОК. Сверяйте сообщение с черновиком, показанным перед открытием.
Учебный черновик хранится в переменной этого экземпляра формы; закрытие формы его теряет. Записи базы, файлов, рабочих настроек и автоматического запуска полученного запроса нет.
Перем СобственныйЧерновик;
Перем КонструкторЗанят;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СобственныйЧерновик = "ВЫБРАТЬ &Название КАК Наименование, &Количество КАК Количество";
КонструкторЗанят = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьУчебныйКонструктор(Команда)
Если КонструкторЗанят Тогда
Сообщить("Сначала завершите уже открытый собственный конструктор");
Возврат;
КонецЕсли;
Если ТипЗнч(СобственныйЧерновик) <> Тип("Строка") Тогда
ВызватьИсключение "Назначьте событие ПриОткрытии обработчику урока";
КонецЕсли;
ИсходныйТекст = СобственныйЧерновик;
Сообщить("Исходный черновик: " + ИсходныйТекст);
Конструктор = Новый КонструкторЗапроса(ИсходныйТекст);
Конструктор.АвтоДобавлениеПредставлений = Ложь;
Конструктор.РежимКомпоновкиДанных = Ложь;
Сообщить(Конструктор.Текст = ИсходныйТекст);
Сообщить(НЕ Конструктор.АвтоДобавлениеПредставлений);
Сообщить(НЕ Конструктор.РежимКомпоновкиДанных);
Состояние = Новый Структура("Маркер,ИсходныйТекст,Конструктор", "guide-owned-query-designer", ИсходныйТекст, Конструктор);
Оповещение = Новый ОписаниеОповещения("УчебныйКонструкторЗакрыт", ЭтотОбъект, Состояние,
"УчебныйКонструкторОшибка", ЭтотОбъект);
КонструкторЗанят = Истина;
Попытка
Конструктор.Показать(Оповещение);
Исключение
КонструкторЗанят = Ложь;
ВызватьИсключение "Учебный конструктор не открыт: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура УчебныйКонструкторЗакрыт(ПолученныйТекст, Состояние) Экспорт
КонструкторЗанят = Ложь;
Если Состояние.Маркер <> "guide-owned-query-designer" Тогда
ВызватьИсключение "Ожидалось состояние собственного конструктора";
КонецЕсли;
ИсходныйТекст = Состояние.ИсходныйТекст;
Если ТипЗнч(ПолученныйТекст) = Тип("Строка") Тогда
Если ПустаяСтрока(ПолученныйТекст) Тогда
Сообщить("Пустой текст не принят; собственный черновик сохранён");
Сообщить(СобственныйЧерновик = ИсходныйТекст);
Иначе
СобственныйЧерновик = ПолученныйТекст;
Сообщить("Принятый черновик, без выполнения: " + СобственныйЧерновик);
Сообщить(СобственныйЧерновик = ПолученныйТекст);
КонецЕсли;
Иначе
Сообщить("Текст не получен; собственный черновик сохранён");
Сообщить(СобственныйЧерновик = ИсходныйТекст);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УчебныйКонструкторОшибка(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
КонструкторЗанят = Ложь;
СтандартнаяОбработка = Истина;
Сообщить("Ошибка собственного конструктора: " + Ошибка.Описание);
Сообщить(СобственныйЧерновик = Состояние.ИсходныйТекст);
КонецПроцедурыРазбор по шагам
Состояние содержит маркер, исходный текст и ссылку на собственный конструктор до завершения диалога.
ОписаниеОповещения связывает точное имя экспортной процедуры с этим состоянием.
Callback имеет два параметра: текст/Неопределено и дополнительные параметры; это не bool/результат запроса.
Ошибка оповещения обрабатывается отдельной экспортной процедурой с тремя параметрами; стандартная обработка сохраняется.
ОК принимает непустую строку, Отмена оставляет свой черновик. После любой ветки разрешено снова открыть редактор.
Как проверить результат
До открытия три Истина. Отмена вызывает callback без принятого текста и даёт Истина проверки исходного черновика.
ОК с изменённым непустым текстом выводит этот текст и Истина его принятия.
Повторная кнопка при открытом диалоге показывает сообщение занятости.
Ожидаемый результат
Показана безопасная callback-последовательность без преждевременного чтения результата.
На что обратить внимание
Не читайте окончательный Текст сразу после Показать: пользователь ещё не завершил редактирование.
Назначьте ПриОткрытии: иначе собственный черновик не инициализирован.
Не подставляйте обработчик другого открытого конструктора в состояние урока.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.