Открывает форму или форму клиентского приложения. В тонком и веб-клиенте только форму клиентского приложения.
Синтаксис
ОткрытьФормуМодально(<ИмяФормы>, <Параметры>, <Владелец>, <НавигационнаяСсылка>)ОткрытьФормуМодально(<Форма>)Полное описание, параметры и ограничения
Глобальный контекст.ОткрытьФормуМодально (Global context.OpenFormModal)
Глобальный контекст (Global context)
ОткрытьФормуМодально (OpenFormModal)
Доступен, начиная с версии 8.2.
Вариант синтаксиса: По имени
Синтаксис:
ОткрытьФормуМодально(<ИмяФормы>, <Параметры>, <Владелец>, <НавигационнаяСсылка>)
Параметры:
<ИмяФормы> (обязательный)
Тип: Строка.
Имя формы. Образуется как полный путь к объекту метаданных Форма (например, "Справочник.Контрагенты.Форма.ФормаОбъекта") или как полный путь к прикладному объекту, дополненный именем формы по умолчанию (например, "Справочник.Товары.ФормаВыбора").
Имена форм по умолчанию:
ФормаОбъекта (ObjectForm) - форма объекта по умолчанию;
ФормаГруппы (FolderForm) - форма группы по умолчанию;
ФормаЗаписи (RecordForm) - форма записи регистра по умолчанию;
ФормаСписка (ListForm) - форма списка по умолчанию;
ФормаВыбора (ChoiceForm) - форма выбора по умолчанию;
ФормаВыбораГруппы (FolderChoiceForm) - форма выбора группы по умолчанию;
ФормаКонстант (ConstantsForm) - форма констант по умолчанию для обычного режима, установленная как форма констант для конфигурации;
Форма (Form) - форма константы, отчета и обработки по умолчанию;
ФормаНастроек (SettingsForm) - форма настроек отчета по умолчанию;
ФормаЗагрузки (LoadForm) - форма загрузки настроек;
ФормаСохранения (SaveForm) - форма сохранения настроек;
ФормаВарианта (VariantForm) - форма редактирования варианта отчета;
ФормаПоиска (SearchForm) - форма полнотекстового поиска в данных;
ФормаИсторииИзмененийИсторииДанных (DataHistoryChangeHistoryForm) - форма истории данных, содержащая версии данных;
ФормаДанныхВерсииИсторииДанных (DataHistoryVersionDataForm) - форма данных версии истории, содержащая отчет по версии данных;
ФормаРазличийВерсийИсторииДанных (DataHistoryVersionDifferencesForm) - форма различий версий истории данных, отображает отчет различий версий.
<Параметры> (необязательный)
Тип: Структура.
Параметры формы. Ключ структуры - имя параметра, а значение - значение параметра формы. Имя элемента должно совпадать с именем параметра структуры.
П = Новый Структура("Ключ", Поставщик);
Форма = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", П);
Форма.Открыть();
<Владелец> (необязательный)
Владелец формы - форма или элемент управления другой формы.
<НавигационнаяСсылка> (необязательный)
Тип: Строка, Неопределено.
Если содержит значение, отличное от Неопределено, то это значение присваивается свойству НавигационнаяСсылка формы, полученной в результате вызова данного метода, и свойство АвтоНавигационнаяСсылка этой формы устанавливается в Ложь.
Значение по умолчанию: Неопределено.
Вариант синтаксиса: По форме
Синтаксис:
ОткрытьФормуМодально(<Форма>)
Параметры:
<Форма> (обязательный)
Тип: Форма, ФормаКлиентскогоПриложения.
Форма или форма клиентского приложения.
В режимах тонкого и веб-клиента только ФормаКлиентскогоПриложения.
Возвращаемое значение:
Тип: Произвольный.
Описание:
Открывает форму или форму клиентского приложения.
В тонком и веб-клиенте только форму клиентского приложения.
Доступность:
Тонкий клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
Вызов метода выполняет обращение к серверу.
Примечание:
Обычные формы внешних обработок не поддерживаются.
В управляемом приложении не следует выполнять программное открытие и закрытие одной и той же формы в одном вызове встроенного языка.
В процессе выполнения может быть несколько обращений к серверу. Часть из них кэшируются. Как минимум одно обращение к серверу есть всегда и оно не кэшируется. Кэширование зависит от версии платформы и версии конфигурации в целом. Если установлена низкая скорость соединения и не указывается текущая строка, то кэшируется форма выбора. Очистка кэша осуществляется с периодичностью в 20 мин. Удаляются формы, которые не использовались в этот период времени.
См. также:
Глобальный контекст, метод ОткрытьФормуМодально
Глобальный контекст, метод ПолучитьФорму
Глобальный контекст, метод ПолучитьОбщуюФорму
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Обычный клиент: показать счет75, принять предпросмотр50 или отменить
Свой счет состоит только из трех чисел в памяти. Показываем значение в реальном контексте клиента и проверяем числа после диалога; формы получаются штатной фабрикой, а не передаются как неизвестный объект.
Где и как запускать
Windows8.5.1.1343, только собственный новый File-стенд: ordinary либо managed толстый клиент. Фактических runtime/UI/DB действий не было.
Подготовка
Здесь только исходники будущего опыта. 1С, создание CF, UI, база, сеть и файлы не запускались. Рабочие конфигурации не используйте. Вручную создайте новую пустую File-базу строго C:\1c-labs\OwnDisplayValues85_75a4c79f-9402-42d3-8c08-90f7bedde32f\IB; UUID обозначает свой каталог, не идентификатор информационной базы.
Конфигурация УчебныйПоказСчета85, Windows платформа8.5.1.1343, РежимСовместимости=НеИспользовать, поддерживаемые режимы Управляемое приложение и обычное приложение, ОсновнойРежимЗапуска=ОбычноеПриложение. РежимИспользованияМодальности=Использовать задайте явно: обычный опыт намеренно изучает разрешенные модальные вызовы. Для управляемого опыта выберите интерфейсТакси и запускайте именно толстый управляемый клиент, не тонкий/веб/мобильный.
Своя одна учебная роль с полными правами и один собственный пользователь Показ85Ученик. Никаких документов, справочников, констант, регистров, отчетов, обработок, расширений базы/сеанса, подписок и фоновых заданий. Не загружайте чужую CF. Этот счет — три числа в памяти, не объект базы.
ОбщийМодуль СтендПоказа85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеДа, СерверНет, ВызовСервераНет, ВнешнееСоединениеНет. Полный GUARD_MODULE в его модуль. Препроцессор разрешает его проверку metadata только двум толстым клиентам; остальные ветви отказывают без вызовов чужих контекстов.
Создайте ровно три общие формы: СчетОбычный85 и Количество85 обычные, СчетТакси85 управляемая. Никакого основного реквизита объекта базы у них нет. Вставляйте каждый полный модуль в указанную форму, не отдельными фрагментами.
СчетОбычный85: ORDINARY_MODULE в ОбщиеФормы.СчетОбычный85.Модуль. Реквизиты Количество85 Число10,0; Цена85 Число12,2; ИсходнаяСумма85 и Предпросмотр85 Число15,2; Состояние85 Строка2000. Для всех полей установите ТолькоПросмотрДа. Кнопки Показать75 и ИзменитьКоличество85: Нажатие→одноименный handler(Элемент). События формы ПриОткрытии()0 и ПередЗакрытием(Отказ,СтандартнаяОбработка)2.
Количество85: CHILD_MODULE в ОбщиеФормы.Количество85.Модуль. Реквизит НовоеКоличество85 Число10,0 редактируемый; Цена85 Число12,2 ТолькоПросмотрДа. Кнопки Принять85/Отменить85: Нажатие→одноименный handler(Элемент). Событие ПередОткрытием(Отказ,СтандартнаяОбработка)2. Export Подготовить85(Создатель,Счет) вызывается пультом до открытия и только один раз для свежей собственной формы.
ORDINARY_APP целиком в Конфигурация.МодульОбычногоПриложения: native ПриНачалеРаботыСистемы()0. После ручного обновления CF запустите толстый обычный клиент своей File-базы; пульт открывается штатным native событием, старое меню не предполагается.
Обычный опыт: сначала исходные поля3/25/75 и предпросмотр75. Показать75 передает собственную текстовую строку в ОткрытьЗначение, не ссылку чужого объекта. Вид диалога зависит от типа значения; точный вид/кнопки и успешный показ здесь не проверены. После возврата вызова снова сверяются исходные числовые поля.
Нажмите ИзменитьКоличество85. Пульт получает настоящую новую обычную форму Количество85 с владельцем ЭтаФорма и собственным UUID-ключом, проверяет владельца/ключ и подготавливает ее. Глобальный ОткрытьФормуМодально использует native вариант По форме с одним actual объектом формы, не подменяется Форма.ОткрытьМодально.
В дочерней форме введите количество2 и нажмите Принять85. Она считает2×25=50 и передает фиксированную структуру через native Закрыть(Ответ). Пульт проверяет все три типа/числа и только затем меняет свой числовой предпросмотр на50. Исходные3/25/75 остаются неизменными.
Повторите открытие дочерней формы и нажмите собственную Отменить85. Она явно закрывается с Неопределено; пульт сохраняет прежний предпросмотр50 (при отмене первого открытия останется75). Любое Неопределено рассматривается как отмена, другое неподходящее значение — отказ. Поведение системного крестика отдельно не обещается без ручной проверки.
СчетТакси85: MANAGED_MODULE в ОбщиеФормы.СчетТакси85.Модуль. Реквизиты Количество85 Число10,0; Цена85 Число12,2; ИсходнаяСумма85 Число15,2; Состояние85 Строка2000. Поля ТолькоПросмотрДа. Добавьте декорацию-надпись Показать75, заголовок Показать счет75, ГиперссылкаДа; Нажатие→Показать75Нажатие(Элемент). Native декорация Click483 имеет0 собственных параметров, managed общий event525 добавляет первый Элемент: итог1, не команда формы.
Управляемая форма: native ПриОткрытии(Отказ)1, ПередЗакрытием(Отказ,ЗавершениеРаботы,ТекстПредупреждения,СтандартнаяОбработка)4. ПослеПоказа85(ДополнительныеПараметры) Экспорт1 — callback ПоказатьЗначение, не событие кнопки и не двухаргументный callback Закрыть формы. Блок Перем и все процедуры этой формы явно &НаКлиенте; окно/модуль оповещения не читаются на сервере.
MANAGED_APP в Конфигурация.МодульУправляемогоПриложения: ПриНачалеРаботыСистемы()0. Завершите обычный запуск и вручную запустите ту же свою CF толстым управляемым клиентом Такси. Он получает именно ОбщаяФорма.СчетТакси85 через ПолучитьФорму с УникальностьИстина и проверяет тип до открытия.
В управляемом пульте нажмите свою гиперссылку. Только здесь АктивноеОкно должно дать окно этой формы: сначала считывается readonly ЭтотОбъект.Окно, проверяется тип и равенство текущему активному окну. В обычном режиме АктивноеОкно дает Неопределено; этот обычный getter не выдаем за получение окна.
ПоказатьЗначение получает ОписаниеОповещения(ПослеПоказа85,ЭтотОбъект,ДанныеШага) и текст75. ЭтотОбъект — реальная managed форма, допустимый MODULE ctor190, не обычная Форма. Метод не ждет закрытия, повтор блокируется Занят85 до настоящего экспортного callback. ДанныеШага хранят копию чисел, идентификатор данного шага и ссылку на фактическое собственное окно.
После закрытия окна показа платформа вызывает callback только с ДополнительныеПараметры. Проверяются тип/номер собственного шага/окно и все три сохраненных числа75, затем занятость снимается. Callback не сообщает выбор/принятие/отмену и не изменяет счет: такого результата не выдумываем. Окно хранится для сравнения идентичности, не объявляется неизменяемой копией renderer.
При отказе/исключении выставляетсяСТОП, автоматического retry и предположения отката нет. Пока показ ожидается, обычное закрытие host-формы отклоняется; принудительный выход приложения может завершить ее вопреки предупреждению, callback при этом не обещается. Отмена модального изменения — штатная ветвь, не ошибка и не успех изменения.
Числовой протокол ручной проверки: оба исходных счета3×25=75; обычный Принять2 дает предпросмотр50 и сохраняет source75; Отменить сохраняет прежний75/50; managed показ+callback оставляет75. Записи документов/констант/файлов нет. Статические проверки не являются компиляцией CF или доказательством UI/runtime.
Перем Счет85, Остановка85, Занят85;
Процедура ПриОткрытии()
Если Остановка85 <> Неопределено Тогда
Возврат;
КонецЕсли;
Остановка85 = Истина;
Занят85 = Ложь;
СтендПоказа85.ПроверитьСтенд85();
Счет85 = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", 3, 25, 3 * 25);
Количество85 = 3;
Цена85 = 25;
ИсходнаяСумма85 = Количество85 * Цена85;
Предпросмотр85 = ИсходнаяСумма85;
ПроверитьИсточник85();
Состояние85 = "Исходный счет3×25=75. Изменяется только предпросмотр в памяти.";
Остановка85 = Ложь;
КонецПроцедуры
Процедура ПроверитьИсточник85()
СтендПоказа85.ПроверитьСтенд85();
СтендПоказа85.ПроверитьСчет85(Счет85);
Если ТипЗнч(Количество85) <> Тип("Число") Или Количество85 <> Счет85.Количество
Или ТипЗнч(Цена85) <> Тип("Число") Или Цена85 <> Счет85.Цена
Или ТипЗнч(ИсходнаяСумма85) <> Тип("Число") Или ИсходнаяСумма85 <> Счет85.Сумма Тогда
ВызватьИсключение "Изменены исходные числовые реквизиты собственной формы";
КонецЕсли;
КонецПроцедуры
Процедура Показать75(Элемент)
Если Элемент <> ЭлементыФормы.Показать75 Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
ВызватьИсключение "Нужна собственная готовая кнопка показа счета";
КонецЕсли;
Попытка
ПроверитьИсточник85();
Занят85 = Истина;
ОткрытьЗначение("Учебный счет:3×25=" + Строка(Счет85.Сумма));
ПроверитьИсточник85();
Занят85 = Ложь;
Состояние85 = "ОткрытьЗначение вызван с текстом собственного счета. Исходная сумма75 сохранена.";
Исключение
Занят85 = Ложь;
Остановка85 = Истина;
Состояние85 = "СТОП: показ не подтверждает изменение счета; повтор этой формой запрещен.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ИзменитьКоличество85(Элемент)
Если Элемент <> ЭлементыФормы.ИзменитьКоличество85 Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
ВызватьИсключение "Нужна собственная готовая кнопка изменения предпросмотра";
КонецЕсли;
Попытка
ПроверитьИсточник85();
СтарыйПредпросмотр = Предпросмотр85;
Занят85 = Истина;
Ключ = Новый УникальныйИдентификатор;
Кандидат = ПолучитьОбщуюФорму("Количество85", ЭтаФорма, Ключ);
Если ТипЗнч(Кандидат) <> Тип("Форма") Или Кандидат.ВладелецФормы <> ЭтаФорма Или Кандидат.КлючУникальности <> Ключ Тогда
ВызватьИсключение "Фабрика не вернула собственную новую дочернюю форму";
КонецЕсли;
Кандидат.Подготовить85(ЭтаФорма, Счет85);
Результат = ОткрытьФормуМодально(Кандидат);
ПроверитьИсточник85();
Если Результат = Неопределено Тогда
Если Предпросмотр85 <> СтарыйПредпросмотр Тогда
ВызватьИсключение "Отмена не должна менять прежний предпросмотр";
КонецЕсли;
Состояние85 = "Отмена: сохранен прежний предпросмотр " + Строка(СтарыйПредпросмотр) + "; исходный счет75 не изменен.";
Иначе
Если ТипЗнч(Результат) <> Тип("ФиксированнаяСтруктура") Или Результат.Количество() <> 3
Или ТипЗнч(Результат.Количество) <> Тип("Число") Или Результат.Количество <> 2
Или ТипЗнч(Результат.Цена) <> Тип("Число") Или Результат.Цена <> Счет85.Цена
Или ТипЗнч(Результат.Сумма) <> Тип("Число") Или Результат.Сумма <> Результат.Количество * Результат.Цена Или Результат.Сумма <> 50 Тогда
ВызватьИсключение "Дочерняя форма должна вернуть только собственный расчет2×25=50";
КонецЕсли;
Предпросмотр85 = Результат.Сумма;
Если ТипЗнч(Предпросмотр85) <> Тип("Число") Или Предпросмотр85 <> 50 Тогда
ВызватьИсключение "Не совпал числовой предпросмотр собственной формы";
КонецЕсли;
Состояние85 = "Принято: предпросмотр2×25=50. Исходный счет3×25=75 остался прежним; записи нет.";
КонецЕсли;
ПроверитьИсточник85();
Занят85 = Ложь;
Исключение
Занят85 = Ложь;
Остановка85 = Истина;
Состояние85 = "СТОП: неожиданный результат или частичная ошибка. Успех и откат не предполагаются.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Если Занят85 = Истина Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедурыСтендПоказа85
ОбщиеМодули.СтендПоказа85.Модуль
ClientOrdinaryДа/ClientManagedДа, ServerНет; guard только два thick desktop режима.
Процедура ПроверитьСтенд85() Экспорт
#Если ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnDisplayValues85_75a4c79f-9402-42d3-8c08-90f7bedde32f\IB"";" Тогда
ВызватьИсключение "Откройте только свою новую учебную File-базу показа значений";
КонецЕсли;
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.РежимИспользованияМодальности <> Метаданные.СвойстваОбъектов.РежимИспользованияМодальности.Использовать Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0 Или Метаданные.ОбщиеФормы.Количество() <> 3 Или Метаданные.ОбщиеФормы.Найти("СчетОбычный85") = Неопределено Или Метаданные.ОбщиеФормы.Найти("Количество85") = Неопределено Или Метаданные.ОбщиеФормы.Найти("СчетТакси85") = Неопределено Тогда
ВызватьИсключение "Не совпадает отдельная учебная конфигурация или разрешенный режим модальности";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0 Тогда
ВызватьИсключение "Расширения базы на этом стенде не используются";
КонецЕсли;
#Иначе
ВызватьИсключение "Этот учебный опыт только для двух режимов толстого клиента Windows";
#КонецЕсли
КонецПроцедуры
Процедура ПроверитьСчет85(Счет) Экспорт
Если ТипЗнч(Счет) <> Тип("ФиксированнаяСтруктура") Или Счет.Количество() <> 3
Или ТипЗнч(Счет.Количество) <> Тип("Число") Или Счет.Количество <> 3
Или ТипЗнч(Счет.Цена) <> Тип("Число") Или Счет.Цена <> 25
Или ТипЗнч(Счет.Сумма) <> Тип("Число") Или Счет.Сумма <> Счет.Количество * Счет.Цена Или Счет.Сумма <> 75 Тогда
ВызватьИсключение "Исходный счет должен оставаться неизменяемым расчетом3×25=75";
КонецЕсли;
КонецПроцедурыСчетОбычный85
ОбщиеФормы.СчетОбычный85.Модуль
Толстый обычный клиент, native Button0+event104Element1.
Перем Счет85, Остановка85, Занят85;
Процедура ПриОткрытии()
Если Остановка85 <> Неопределено Тогда
Возврат;
КонецЕсли;
Остановка85 = Истина;
Занят85 = Ложь;
СтендПоказа85.ПроверитьСтенд85();
Счет85 = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", 3, 25, 3 * 25);
Количество85 = 3;
Цена85 = 25;
ИсходнаяСумма85 = Количество85 * Цена85;
Предпросмотр85 = ИсходнаяСумма85;
ПроверитьИсточник85();
Состояние85 = "Исходный счет3×25=75. Изменяется только предпросмотр в памяти.";
Остановка85 = Ложь;
КонецПроцедуры
Процедура ПроверитьИсточник85()
СтендПоказа85.ПроверитьСтенд85();
СтендПоказа85.ПроверитьСчет85(Счет85);
Если ТипЗнч(Количество85) <> Тип("Число") Или Количество85 <> Счет85.Количество
Или ТипЗнч(Цена85) <> Тип("Число") Или Цена85 <> Счет85.Цена
Или ТипЗнч(ИсходнаяСумма85) <> Тип("Число") Или ИсходнаяСумма85 <> Счет85.Сумма Тогда
ВызватьИсключение "Изменены исходные числовые реквизиты собственной формы";
КонецЕсли;
КонецПроцедуры
Процедура Показать75(Элемент)
Если Элемент <> ЭлементыФормы.Показать75 Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
ВызватьИсключение "Нужна собственная готовая кнопка показа счета";
КонецЕсли;
Попытка
ПроверитьИсточник85();
Занят85 = Истина;
ОткрытьЗначение("Учебный счет:3×25=" + Строка(Счет85.Сумма));
ПроверитьИсточник85();
Занят85 = Ложь;
Состояние85 = "ОткрытьЗначение вызван с текстом собственного счета. Исходная сумма75 сохранена.";
Исключение
Занят85 = Ложь;
Остановка85 = Истина;
Состояние85 = "СТОП: показ не подтверждает изменение счета; повтор этой формой запрещен.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ИзменитьКоличество85(Элемент)
Если Элемент <> ЭлементыФормы.ИзменитьКоличество85 Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
ВызватьИсключение "Нужна собственная готовая кнопка изменения предпросмотра";
КонецЕсли;
Попытка
ПроверитьИсточник85();
СтарыйПредпросмотр = Предпросмотр85;
Занят85 = Истина;
Ключ = Новый УникальныйИдентификатор;
Кандидат = ПолучитьОбщуюФорму("Количество85", ЭтаФорма, Ключ);
Если ТипЗнч(Кандидат) <> Тип("Форма") Или Кандидат.ВладелецФормы <> ЭтаФорма Или Кандидат.КлючУникальности <> Ключ Тогда
ВызватьИсключение "Фабрика не вернула собственную новую дочернюю форму";
КонецЕсли;
Кандидат.Подготовить85(ЭтаФорма, Счет85);
Результат = ОткрытьФормуМодально(Кандидат);
ПроверитьИсточник85();
Если Результат = Неопределено Тогда
Если Предпросмотр85 <> СтарыйПредпросмотр Тогда
ВызватьИсключение "Отмена не должна менять прежний предпросмотр";
КонецЕсли;
Состояние85 = "Отмена: сохранен прежний предпросмотр " + Строка(СтарыйПредпросмотр) + "; исходный счет75 не изменен.";
Иначе
Если ТипЗнч(Результат) <> Тип("ФиксированнаяСтруктура") Или Результат.Количество() <> 3
Или ТипЗнч(Результат.Количество) <> Тип("Число") Или Результат.Количество <> 2
Или ТипЗнч(Результат.Цена) <> Тип("Число") Или Результат.Цена <> Счет85.Цена
Или ТипЗнч(Результат.Сумма) <> Тип("Число") Или Результат.Сумма <> Результат.Количество * Результат.Цена Или Результат.Сумма <> 50 Тогда
ВызватьИсключение "Дочерняя форма должна вернуть только собственный расчет2×25=50";
КонецЕсли;
Предпросмотр85 = Результат.Сумма;
Если ТипЗнч(Предпросмотр85) <> Тип("Число") Или Предпросмотр85 <> 50 Тогда
ВызватьИсключение "Не совпал числовой предпросмотр собственной формы";
КонецЕсли;
Состояние85 = "Принято: предпросмотр2×25=50. Исходный счет3×25=75 остался прежним; записи нет.";
КонецЕсли;
ПроверитьИсточник85();
Занят85 = Ложь;
Исключение
Занят85 = Ложь;
Остановка85 = Истина;
Состояние85 = "СТОП: неожиданный результат или частичная ошибка. Успех и откат не предполагаются.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Если Занят85 = Истина Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедурыКоличество85
ОбщиеФормы.Количество85.Модуль
Толстый обычный клиент; реальный владелец/подготовка/Close(result).
Перем Счет85, Готово85, Остановка85;
Процедура Подготовить85(Создатель, Счет) Экспорт
Если Готово85 <> Неопределено Или Остановка85 <> Неопределено Тогда
ВызватьИсключение "Дочерняя форма подготавливается только один раз";
КонецЕсли;
Остановка85 = Истина;
Готово85 = Ложь;
СтендПоказа85.ПроверитьСтенд85();
СтендПоказа85.ПроверитьСчет85(Счет);
Если ТипЗнч(Создатель) <> Тип("Форма") Или ЭтаФорма.ВладелецФормы <> Создатель Тогда
ВызватьИсключение "Нужен настоящий собственный владелец дочерней формы";
КонецЕсли;
Счет85 = Счет;
НовоеКоличество85 = Счет85.Количество;
Цена85 = Счет85.Цена;
Готово85 = Истина;
Остановка85 = Ложь;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Если Готово85 <> Истина Или Остановка85 <> Ложь Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура Принять85(Элемент)
Если Элемент <> ЭлементыФормы.Принять85 Или Готово85 <> Истина Или Остановка85 <> Ложь Тогда
ВызватьИсключение "Нужна готовая собственная кнопка принятия";
КонецЕсли;
Попытка
СтендПоказа85.ПроверитьСчет85(Счет85);
Если ТипЗнч(НовоеКоличество85) <> Тип("Число") Или НовоеКоличество85 <> 2
Или ТипЗнч(Цена85) <> Тип("Число") Или Цена85 <> Счет85.Цена Тогда
ВызватьИсключение "В этом учебном шаге введите количество2, цена остается25";
КонецЕсли;
Ответ = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", НовоеКоличество85, Цена85, НовоеКоличество85 * Цена85);
Если Ответ.Сумма <> 50 Тогда
ВызватьИсключение "Не совпал самостоятельный расчет2×25=50";
КонецЕсли;
ЭтаФорма.Закрыть(Ответ);
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Отменить85(Элемент)
Если Элемент <> ЭлементыФормы.Отменить85 Тогда
ВызватьИсключение "Нужна собственная кнопка отмены";
КонецЕсли;
ЭтаФорма.Закрыть(Неопределено);
КонецПроцедурыСчетТакси85
ОбщиеФормы.СчетТакси85.Модуль
Толстый managed клиент Такси; все процедуры &НаКлиенте, native notification callback1.
&НаКлиенте
Перем Счет85, Остановка85, Занят85, Шаг85;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Остановка85 <> Неопределено Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Остановка85 = Истина;
Занят85 = Ложь;
Попытка
СтендПоказа85.ПроверитьСтенд85();
Счет85 = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", 3, 25, 3 * 25);
Количество85 = 3;
Цена85 = 25;
ИсходнаяСумма85 = Количество85 * Цена85;
ПроверитьИсточник85();
Состояние85 = "Счет3×25=75 в памяти. Нажмите ссылку Показать75.";
Остановка85 = Ложь;
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьИсточник85()
СтендПоказа85.ПроверитьСтенд85();
СтендПоказа85.ПроверитьСчет85(Счет85);
Если ТипЗнч(Количество85) <> Тип("Число") Или Количество85 <> Счет85.Количество
Или ТипЗнч(Цена85) <> Тип("Число") Или Цена85 <> Счет85.Цена
Или ТипЗнч(ИсходнаяСумма85) <> Тип("Число") Или ИсходнаяСумма85 <> Счет85.Сумма Тогда
ВызватьИсключение "Изменены исходные числовые реквизиты собственной управляемой формы";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Показать75Нажатие(Элемент)
Если Элемент <> Элементы.Показать75 Или Элементы.Показать75.Гиперссылка <> Истина
Или Остановка85 <> Ложь Или Занят85 <> Ложь Тогда
ВызватьИсключение "Нужна готовая собственная гиперссылка показа";
КонецЕсли;
Попытка
ПроверитьИсточник85();
СвоеОкно = ЭтотОбъект.Окно;
Если ТипЗнч(СвоеОкно) <> Тип("ОкноКлиентскогоПриложения") Или АктивноеОкно() <> СвоеОкно Тогда
ВызватьИсключение "Нажатие должно происходить в активном окне этой собственной формы";
КонецЕсли;
Шаг85 = Новый УникальныйИдентификатор;
ДанныеШага = Новый ФиксированнаяСтруктура("Счет,Шаг,Окно", Счет85, Шаг85, СвоеОкно);
Оповещение = Новый ОписаниеОповещения("ПослеПоказа85", ЭтотОбъект, ДанныеШага);
Занят85 = Истина;
Состояние85 = "Показ начат без ожидания закрытия. Повтор заблокирован до настоящего callback.";
ПоказатьЗначение(Оповещение, "Учебный счет:3×25=" + Строка(Счет85.Сумма));
Исключение
Занят85 = Ложь;
Остановка85 = Истина;
Состояние85 = "СТОП: завершение показа не предполагается, повтор этой формой запрещен.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПослеПоказа85(ДополнительныеПараметры) Экспорт
Попытка
Если Остановка85 <> Ложь Или Занят85 <> Истина
Или ТипЗнч(ДополнительныеПараметры) <> Тип("ФиксированнаяСтруктура") Или ДополнительныеПараметры.Количество() <> 3
Или ТипЗнч(ДополнительныеПараметры.Шаг) <> Тип("УникальныйИдентификатор") Или ДополнительныеПараметры.Шаг <> Шаг85
Или ТипЗнч(ДополнительныеПараметры.Окно) <> Тип("ОкноКлиентскогоПриложения") Или ДополнительныеПараметры.Окно <> ЭтотОбъект.Окно Тогда
ВызватьИсключение "Не совпало настоящее завершение собственного ожидаемого шага";
КонецЕсли;
СтендПоказа85.ПроверитьСчет85(ДополнительныеПараметры.Счет);
ПроверитьИсточник85();
Если ДополнительныеПараметры.Счет.Количество <> Счет85.Количество
Или ДополнительныеПараметры.Счет.Цена <> Счет85.Цена Или ДополнительныеПараметры.Счет.Сумма <> Счет85.Сумма Тогда
ВызватьИсключение "Изменены числовые значения собственного исходного счета75";
КонецЕсли;
Занят85 = Ложь;
Состояние85 = "Получен настоящий callback закрытия показа. Исходный счет3×25=75 остался прежним.";
Исключение
Занят85 = Ложь;
Остановка85 = Истина;
Состояние85 = "СТОП: callback или исходные значения не совпали; повтор не выполняется.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Занят85 = Истина Тогда
Отказ = Истина;
ТекстПредупреждения = "Показ собственного счета еще не завершен. При принудительном выходе callback не обещается.";
КонецЕсли;
КонецПроцедурыОбычноеПриложение
Конфигурация.МодульОбычногоПриложения
ПриНачалеРаботыСистемы0, запуск собственного ordinary пульта.
Процедура ПриНачалеРаботыСистемы()
СтендПоказа85.ПроверитьСтенд85();
Пульт = ПолучитьОбщуюФорму("СчетОбычный85");
Если ТипЗнч(Пульт) <> Тип("Форма") Тогда
ВызватьИсключение "Нужна собственная обычная общая форма счета";
КонецЕсли;
Пульт.Открыть();
КонецПроцедурыУправляемоеПриложение
Конфигурация.МодульУправляемогоПриложения
ПриНачалеРаботыСистемы0, получение настоящего managed пульта.
Процедура ПриНачалеРаботыСистемы()
СтендПоказа85.ПроверитьСтенд85();
Пульт = ПолучитьФорму("ОбщаяФорма.СчетТакси85", , , Истина);
Если ТипЗнч(Пульт) <> Тип("ФормаКлиентскогоПриложения") Тогда
ВызватьИсключение "Нужна собственная управляемая общая форма счета";
КонецЕсли;
Пульт.Открыть();
КонецПроцедурыРазбор по шагам
Обычный и управляемый маршруты разделены полными модулями и запускаются вручную в соответствующем толстом клиенте одной собственной CF.
Обычный пульт передает actual дочернюю форму с проверенным владельцем в глобальный модальный метод и разбирает typed ответ50 либо Undefinedcancel.
Управляемый пульт получает actual окно только на клиенте; ОписаниеОповещения связано с его собственным ЭтотОбъект и экспортным callback1.
Каждый маршрут сверяет исходные три числовых поля и fixed снимок75; повтор до завершения блокируется, callback вручную не вызывается.
Как проверить результат
Обычный Принять2: предпросмотр50 при неизменном исходном75; Отменить сохраняет прежний предпросмотр.
Managed показ: фактическое собственное активное окно и закрытие показа через native callback, без выдуманного результата выбора.
Не выполнялись1С/CFcompiler/UI/DB/network/files/OS; runtimeVerifiedFalse.
Ожидаемый результат
Ожидаемый будущий ручной результат: source75 не меняется; ordinary предпросмотр50 только после принятия, отмена без изменения; managed callback оставляет75. Все данные счета в памяти, записи базы не нужны.
На что обратить внимание
АктивноеОкно в обычном режиме возвращаетUndefined; переносить managed окно в обычную форму нельзя.
Обычная Форма отсутствует в MODULE ctor190. Notification получает только actual managed ЭтотОбъект; callback ShowValue имеет1 параметр, не2.
Метаданные модальностиreadonly; Использовать задается вручную в конфигурации, не присваивается во время работы.
Системный диалог зависит от типа значения, точный внешний вид и renderer не проверены. Никакая работа с базой или авторизация чужого объекта из этих чисел не следует.
STOP не сбрасывается повторным initializer/open; частичные UI-изменения не объявляются атомарными. При принудительном завершении callback не гарантирован.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.