Глобальный контекст.ОткрытьФормуМодально

Методы · OpenFormModal

Открывает форму или форму клиентского приложения. В тонком и веб-клиенте только форму клиентского приложения.

Синтаксис

ОткрытьФормуМодально(<ИмяФормы>, <Параметры>, <Владелец>, <НавигационнаяСсылка>)
ОткрытьФормуМодально(<Форма>)
Полное описание, параметры и ограничения

Глобальный контекст.ОткрытьФормуМодально (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. Здесь только исходники будущего опыта. 1С, создание CF, UI, база, сеть и файлы не запускались. Рабочие конфигурации не используйте. Вручную создайте новую пустую File-базу строго C:\1c-labs\OwnDisplayValues85_75a4c79f-9402-42d3-8c08-90f7bedde32f\IB; UUID обозначает свой каталог, не идентификатор информационной базы.

  2. Конфигурация УчебныйПоказСчета85, Windows платформа8.5.1.1343, РежимСовместимости=НеИспользовать, поддерживаемые режимы Управляемое приложение и обычное приложение, ОсновнойРежимЗапуска=ОбычноеПриложение. РежимИспользованияМодальности=Использовать задайте явно: обычный опыт намеренно изучает разрешенные модальные вызовы. Для управляемого опыта выберите интерфейсТакси и запускайте именно толстый управляемый клиент, не тонкий/веб/мобильный.

  3. Своя одна учебная роль с полными правами и один собственный пользователь Показ85Ученик. Никаких документов, справочников, констант, регистров, отчетов, обработок, расширений базы/сеанса, подписок и фоновых заданий. Не загружайте чужую CF. Этот счет — три числа в памяти, не объект базы.

  4. ОбщийМодуль СтендПоказа85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеДа, СерверНет, ВызовСервераНет, ВнешнееСоединениеНет. Полный GUARD_MODULE в его модуль. Препроцессор разрешает его проверку metadata только двум толстым клиентам; остальные ветви отказывают без вызовов чужих контекстов.

  5. Создайте ровно три общие формы: СчетОбычный85 и Количество85 обычные, СчетТакси85 управляемая. Никакого основного реквизита объекта базы у них нет. Вставляйте каждый полный модуль в указанную форму, не отдельными фрагментами.

  6. СчетОбычный85: ORDINARY_MODULE в ОбщиеФормы.СчетОбычный85.Модуль. Реквизиты Количество85 Число10,0; Цена85 Число12,2; ИсходнаяСумма85 и Предпросмотр85 Число15,2; Состояние85 Строка2000. Для всех полей установите ТолькоПросмотрДа. Кнопки Показать75 и ИзменитьКоличество85: Нажатие→одноименный handler(Элемент). События формы ПриОткрытии()0 и ПередЗакрытием(Отказ,СтандартнаяОбработка)2.

  7. Количество85: CHILD_MODULE в ОбщиеФормы.Количество85.Модуль. Реквизит НовоеКоличество85 Число10,0 редактируемый; Цена85 Число12,2 ТолькоПросмотрДа. Кнопки Принять85/Отменить85: Нажатие→одноименный handler(Элемент). Событие ПередОткрытием(Отказ,СтандартнаяОбработка)2. Export Подготовить85(Создатель,Счет) вызывается пультом до открытия и только один раз для свежей собственной формы.

  8. ORDINARY_APP целиком в Конфигурация.МодульОбычногоПриложения: native ПриНачалеРаботыСистемы()0. После ручного обновления CF запустите толстый обычный клиент своей File-базы; пульт открывается штатным native событием, старое меню не предполагается.

  9. Обычный опыт: сначала исходные поля3/25/75 и предпросмотр75. Показать75 передает собственную текстовую строку в ОткрытьЗначение, не ссылку чужого объекта. Вид диалога зависит от типа значения; точный вид/кнопки и успешный показ здесь не проверены. После возврата вызова снова сверяются исходные числовые поля.

  10. Нажмите ИзменитьКоличество85. Пульт получает настоящую новую обычную форму Количество85 с владельцем ЭтаФорма и собственным UUID-ключом, проверяет владельца/ключ и подготавливает ее. Глобальный ОткрытьФормуМодально использует native вариант По форме с одним actual объектом формы, не подменяется Форма.ОткрытьМодально.

  11. В дочерней форме введите количество2 и нажмите Принять85. Она считает2×25=50 и передает фиксированную структуру через native Закрыть(Ответ). Пульт проверяет все три типа/числа и только затем меняет свой числовой предпросмотр на50. Исходные3/25/75 остаются неизменными.

  12. Повторите открытие дочерней формы и нажмите собственную Отменить85. Она явно закрывается с Неопределено; пульт сохраняет прежний предпросмотр50 (при отмене первого открытия останется75). Любое Неопределено рассматривается как отмена, другое неподходящее значение — отказ. Поведение системного крестика отдельно не обещается без ручной проверки.

  13. СчетТакси85: MANAGED_MODULE в ОбщиеФормы.СчетТакси85.Модуль. Реквизиты Количество85 Число10,0; Цена85 Число12,2; ИсходнаяСумма85 Число15,2; Состояние85 Строка2000. Поля ТолькоПросмотрДа. Добавьте декорацию-надпись Показать75, заголовок Показать счет75, ГиперссылкаДа; Нажатие→Показать75Нажатие(Элемент). Native декорация Click483 имеет0 собственных параметров, managed общий event525 добавляет первый Элемент: итог1, не команда формы.

  14. Управляемая форма: native ПриОткрытии(Отказ)1, ПередЗакрытием(Отказ,ЗавершениеРаботы,ТекстПредупреждения,СтандартнаяОбработка)4. ПослеПоказа85(ДополнительныеПараметры) Экспорт1 — callback ПоказатьЗначение, не событие кнопки и не двухаргументный callback Закрыть формы. Блок Перем и все процедуры этой формы явно &НаКлиенте; окно/модуль оповещения не читаются на сервере.

  15. MANAGED_APP в Конфигурация.МодульУправляемогоПриложения: ПриНачалеРаботыСистемы()0. Завершите обычный запуск и вручную запустите ту же свою CF толстым управляемым клиентом Такси. Он получает именно ОбщаяФорма.СчетТакси85 через ПолучитьФорму с УникальностьИстина и проверяет тип до открытия.

  16. В управляемом пульте нажмите свою гиперссылку. Только здесь АктивноеОкно должно дать окно этой формы: сначала считывается readonly ЭтотОбъект.Окно, проверяется тип и равенство текущему активному окну. В обычном режиме АктивноеОкно дает Неопределено; этот обычный getter не выдаем за получение окна.

  17. ПоказатьЗначение получает ОписаниеОповещения(ПослеПоказа85,ЭтотОбъект,ДанныеШага) и текст75. ЭтотОбъект — реальная managed форма, допустимый MODULE ctor190, не обычная Форма. Метод не ждет закрытия, повтор блокируется Занят85 до настоящего экспортного callback. ДанныеШага хранят копию чисел, идентификатор данного шага и ссылку на фактическое собственное окно.

  18. После закрытия окна показа платформа вызывает callback только с ДополнительныеПараметры. Проверяются тип/номер собственного шага/окно и все три сохраненных числа75, затем занятость снимается. Callback не сообщает выбор/принятие/отмену и не изменяет счет: такого результата не выдумываем. Окно хранится для сравнения идентичности, не объявляется неизменяемой копией renderer.

  19. При отказе/исключении выставляетсяСТОП, автоматического retry и предположения отката нет. Пока показ ожидается, обычное закрытие host-формы отклоняется; принудительный выход приложения может завершить ее вопреки предупреждению, callback при этом не обещается. Отмена модального изменения — штатная ветвь, не ошибка и не успех изменения.

  20. Числовой протокол ручной проверки: оба исходных счета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", , , Истина);
    Если ТипЗнч(Пульт) <> Тип("ФормаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Нужна собственная управляемая общая форма счета";
    КонецЕсли;
    Пульт.Открыть();
КонецПроцедуры

Разбор по шагам

  1. Обычный и управляемый маршруты разделены полными модулями и запускаются вручную в соответствующем толстом клиенте одной собственной CF.

  2. Обычный пульт передает actual дочернюю форму с проверенным владельцем в глобальный модальный метод и разбирает typed ответ50 либо Undefinedcancel.

  3. Управляемый пульт получает actual окно только на клиенте; ОписаниеОповещения связано с его собственным ЭтотОбъект и экспортным callback1.

  4. Каждый маршрут сверяет исходные три числовых поля и fixed снимок75; повтор до завершения блокируется, callback вручную не вызывается.

Как проверить результат

  1. Обычный Принять2: предпросмотр50 при неизменном исходном75; Отменить сохраняет прежний предпросмотр.

  2. Managed показ: фактическое собственное активное окно и закрытие показа через native callback, без выдуманного результата выбора.

  3. Не выполнялись1С/CFcompiler/UI/DB/network/files/OS; runtimeVerifiedFalse.

Ожидаемый результат

Ожидаемый будущий ручной результат: source75 не меняется; ordinary предпросмотр50 только после принятия, отмена без изменения; managed callback оставляет75. Все данные счета в памяти, записи базы не нужны.

На что обратить внимание

  1. АктивноеОкно в обычном режиме возвращаетUndefined; переносить managed окно в обычную форму нельзя.

  2. Обычная Форма отсутствует в MODULE ctor190. Notification получает только actual managed ЭтотОбъект; callback ShowValue имеет1 параметр, не2.

  3. Метаданные модальностиreadonly; Использовать задается вручную в конфигурации, не присваивается во время работы.

  4. Системный диалог зависит от типа значения, точный внешний вид и renderer не проверены. Никакая работа с базой или авторизация чужого объекта из этих чисел не следует.

  5. STOP не сбрасывается повторным initializer/open; частичные UI-изменения не объявляются атомарными. При принудительном завершении callback не гарантирован.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.