ФормаКлиентскогоПриложения.ОписаниеОповещенияОЗакрытии

Свойства · CallbackDescriptionOnClose

Тип: ОписаниеОповещения, Неопределено. Содержит описание процедуры, которая будет вызвана после закрытия формы со следующими параметрами: <РезультатЗакрытия> - значение, переданное при вызове метода Закрыть открываемой формы, <ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.

Полное описание, параметры и ограничения

ФормаКлиентскогоПриложения.ОписаниеОповещенияОЗакрытии (ClientApplicationForm.CallbackDescriptionOnClose)

ФормаКлиентскогоПриложения (ClientApplicationForm)

ОписаниеОповещенияОЗакрытии (CallbackDescriptionOnClose)

Доступен, начиная с версии 8.3.3.

Использование:
Чтение и запись.
Описание:
Тип: ОписаниеОповещения, Неопределено.
Содержит описание процедуры, которая будет вызвана после закрытия формы со следующими параметрами:
<РезультатЗакрытия> - значение, переданное при вызове метода Закрыть открываемой формы,
<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).

Использование в версии:

Доступен, начиная с версии 8.3.3.

Описание изменено в версии 8.3.22.

Методическая информация

Практические примеры

ОписаниеОповещенияОЗакрытии: принять количество из своего окна

Сначала получаем свой экземпляр, затем назначаем клиентское описание закрытия. Результат Закрыть передаётся в отдельный обработчик, а не возвращается немедленно методом Открыть.

Где и как запускать

Полный модуль собственной общей управляемой формы УчебныеОкна85. Два экземпляра одной формы, тонкий клиент Windows; создание реквизитов на сервере, открытие/выбор/закрытие на клиенте.

Подготовка

  1. Используйте отдельную пустую учебную конфигурацию 8.5.1.1343 без рабочих данных и тонкий управляемый клиент Windows. Создайте общую управляемую форму УчебныеОкна85; имя в дереве Общие → Общие формы должно совпадать с кодом.

  2. На вкладке Параметры формы создайте Дочерняя, СтартовоеКоличество и КлючЗапроса. Значения передаются как Булево, Число и Строка. У всех трёх снимите Ключевой: пользовательский ключ уникальности задаётся отдельно четвёртым аргументом открытия.

  3. Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставьте весь приведённый модуль выбранного урока. Реквизиты, поле количества, команду и кнопку вручную не создавайте: их добавляет код.

  4. Для запуска добавьте в свою учебную обработку пустую управляемую форму и команду ОткрытьУчебноеОкно. Через конструктор обработчика создайте клиентскую процедуру команды и поместите в её тело ровно ОткрытьФорму("ОбщаяФорма.УчебныеОкна85");. Эта внешняя кнопка открывает главное окно, а кнопки внутри урока открывают его дочерний экземпляр.

  5. В каждом уроке используйте отдельную копию своей конфигурации/формы. Все экземпляры создаются из одного полного модуля: главное окно имеет Дочерняя=Ложь, второе получает Дочерняя=Истина и собственные параметры.

  6. Количество главного окна первоначально 3, цена книги 250. В дочернем поле можно выбрать целое количество 1–10; никакой номенклатуры, документов, регистров, файлов, сети и печати не используется.

  7. Запуск в 1С не проверялся. Статические проверки не доказывают появление окна, возврат событий или фактическое поведение темы: выполните контрольные действия только на своём учебном стенде.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    ЧисловойТип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
    Новые.Добавить(Новый РеквизитФормы("УчебноеКоличество", ЧисловойТип));
    Новые.Добавить(Новый РеквизитФормы("ЭтоДочерняяФорма", Новый ОписаниеТипов("Булево")));
    Новые.Добавить(Новый РеквизитФормы("УчебныйКлючЗапроса", Новый ОписаниеТипов("Строка")));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    ЭтаФорма.ЭтоДочерняяФорма = Ложь;
    ЭтаФорма.УчебноеКоличество = 3;
    ЭтаФорма.УчебныйКлючЗапроса = "";
    Если ЭтаФорма.Параметры.Свойство("Дочерняя", ПризнакДочерней) Тогда
        Если ТипЗнч(ПризнакДочерней) = Тип("Булево") Тогда
            ЭтаФорма.ЭтоДочерняяФорма = ПризнакДочерней;
        КонецЕсли;
    КонецЕсли;
    Если ЭтоДочерняяФорма Тогда
        Если Не ЭтаФорма.Параметры.Свойство("СтартовоеКоличество", ПереданноеКоличество) Тогда
            ВызватьИсключение "Нет собственного параметра СтартовоеКоличество";
        КонецЕсли;
        Если ТипЗнч(ПереданноеКоличество) <> Тип("Число") Тогда
            ВызватьИсключение "СтартовоеКоличество должно быть числом";
        КонецЕсли;
        Если ПереданноеКоличество < 1 Или ПереданноеКоличество > 10 Или ПереданноеКоличество <> Цел(ПереданноеКоличество) Тогда
            ВызватьИсключение "СтартовоеКоличество должно быть целым от 1 до 10";
        КонецЕсли;
        Если Не ЭтаФорма.Параметры.Свойство("КлючЗапроса", ПереданныйКлюч) Тогда
            ВызватьИсключение "Нет собственного параметра КлючЗапроса";
        КонецЕсли;
        Если ТипЗнч(ПереданныйКлюч) <> Тип("Строка") Тогда
            ВызватьИсключение "КлючЗапроса должен быть собственной строкой";
        КонецЕсли;
        Если ПустаяСтрока(ПереданныйКлюч) Тогда
            ВызватьИсключение "Собственный ключ запроса не задан";
        КонецЕсли;
        ЭтаФорма.УчебноеКоличество = ПереданноеКоличество;
        ЭтаФорма.УчебныйКлючЗапроса = ПереданныйКлюч;
    КонецЕсли;
    Поле = Элементы.Добавить("ПолеУчебногоКоличества", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "УчебноеКоличество";
    Поле.Заголовок = "Своих книг от 1 до 10";
    Команда = Команды.Добавить("УчебноеДействие");
    Команда.Действие = "ВыполнитьУчебноеДействие";
    Команда.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебногоДействия", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = Команда.Имя;
    Если ЭтоДочерняяФорма Тогда
        ЭтаФорма.Заголовок = "Собственное дочернее окно";
        Команда.Заголовок = "Завершить собственный выбор";
    Иначе
        ЭтаФорма.Заголовок = "Главное учебное окно";
        Команда.Заголовок = "Открыть собственное дочернее окно";
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьУчебноеДействие(Команда)
    ПроверитьСвоёКоличество(УчебноеКоличество);
    Если ЭтоДочерняяФорма Тогда
        Результат = Новый Структура("КлючЗапроса,Количество,Сумма",
            УчебныйКлючЗапроса, УчебноеКоличество, УчебноеКоличество * 250);
        ЭтаФорма.Закрыть(Результат);
        Возврат;
    КонецЕсли;
    УчебныйКлючЗапроса = Строка(Новый УникальныйИдентификатор);
    ПараметрыДочерней = Новый Структура("Дочерняя,СтартовоеКоличество,КлючЗапроса", Истина, УчебноеКоличество, УчебныйКлючЗапроса);
    Дополнительные = Новый Структура("КлючЗапроса,ДоОткрытия", УчебныйКлючЗапроса, УчебноеКоличество);
    Оповещение = Новый ОписаниеОповещения("ПослеУчебногоЗакрытия", ЭтаФорма, Дополнительные);
    ДочерняяФорма = ПолучитьФорму("ОбщаяФорма.УчебныеОкна85", ПараметрыДочерней, ЭтаФорма, Истина);
    Если ДочерняяФорма = Неопределено Тогда
        ВызватьИсключение "Своя общая форма не была получена";
    КонецЕсли;
    Если ТипЗнч(ДочерняяФорма) <> Тип("ФормаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Ожидалась своя управляемая форма";
    КонецЕсли;
    ДочерняяФорма.ОписаниеОповещенияОЗакрытии = Оповещение;
    ДочерняяФорма.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца;
    ДочерняяФорма.Открыть();
    Сообщить("Ждём собственный результат в клиентском обработчике, не после Открыть");
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоёКоличество(Знач Количество)
    Если ТипЗнч(Количество) <> Тип("Число") Тогда
        ВызватьИсключение "Количество должно быть числом";
    КонецЕсли;
    Если Количество < 1 Или Количество > 10 Или Количество <> Цел(Количество) Тогда
        ВызватьИсключение "Выберите целое количество от 1 до 10";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеУчебногоЗакрытия(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    Если Не ЭтаФорма.Открыта() Тогда
        Возврат;
    КонецЕсли;
    Если УчебныйКлючЗапроса <> ДополнительныеПараметры.КлючЗапроса Тогда
        Сообщить("Ответ старого собственного окна пропущен");
        Возврат;
    КонецЕсли;
    УчебныйКлючЗапроса = "";
    Если РезультатЗакрытия = Неопределено Тогда
        Сообщить("Собственное окно закрыто без результата; количество не изменено");
        Возврат;
    КонецЕсли;
    Если УчебноеКоличество <> ДополнительныеПараметры.ДоОткрытия Тогда
        Сообщить("Своё количество изменилось после открытия; устаревший результат не принят");
        Возврат;
    КонецЕсли;
    ПринятьСвойРезультат(РезультатЗакрытия, ДополнительныеПараметры.КлючЗапроса);
КонецПроцедуры

&НаКлиенте
Процедура ПринятьСвойРезультат(Результат, Знач ОжидаемыйКлюч)
    Если ТипЗнч(Результат) <> Тип("Структура") Тогда
        ВызватьИсключение "Результат собственного окна должен быть структурой";
    КонецЕсли;
    Если Не Результат.Свойство("КлючЗапроса") Или Не Результат.Свойство("Количество") Или Не Результат.Свойство("Сумма") Тогда
        ВызватьИсключение "Неполный собственный результат";
    КонецЕсли;
    Если Результат.КлючЗапроса <> ОжидаемыйКлюч Тогда
        ВызватьИсключение "Результат относится к другому собственному запросу";
    КонецЕсли;
    ПроверитьСвоёКоличество(Результат.Количество);
    Если ТипЗнч(Результат.Сумма) <> Тип("Число") Тогда
        ВызватьИсключение "Сумма собственного результата должна быть числом";
    КонецЕсли;
    Если Результат.Сумма <> Результат.Количество * 250 Тогда
        ВызватьИсключение "Сумма собственного результата не соответствует цене 250";
    КонецЕсли;
    УчебноеКоличество = Результат.Количество;
    Сообщить(УчебноеКоличество = Результат.Количество);
    Сообщить(Результат.Сумма = УчебноеКоличество * 250);
    Сообщить(СтрШаблон("Принято своих книг: %1, сумма: %2", УчебноеКоличество, Результат.Сумма));
КонецПроцедуры

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

  1. Зафиксировать количество владельца и создать собственный ключ запроса. ДополнительныеПараметры описания оповещения сохраняют оба значения.

  2. Получить свою общую форму с новым экземпляром; проверить Неопределено и точный тип до назначения свойств.

  3. Назначить ОписаниеОповещенияОЗакрытии и БлокироватьВладельца до Открыть. Это немодальное получение результата через клиентский обработчик.

  4. В дочернем поле выбрать 5 и нажать собственную кнопку. Закрыть получает структуру ключа, количества 5 и суммы 1250.

  5. ПослеУчебногоЗакрытия имеет два параметра и Экспорт. Проверить открытость владельца, актуальность ключа, отмену и неизменность начального количества.

  6. ПринятьСвойРезультат проверяет поля/тип/диапазон и пересчитывает сумму по цене 250 перед изменением собственного количества владельца.

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

  1. При подтверждении 5 главное поле становится 5; два сравнения Истина и сообщение Принято своих книг: 5, сумма: 1250.

  2. При закрытии дочернего крестиком результат Неопределено: появляется сообщение об отмене, главное количество остаётся прежним. Не требуйте результата 5 после отмены.

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

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

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

  1. Открыть не ждёт выбора. Код после него не должен читать будущий результат из переменной вызова.

  2. ОписаниеОповещения относится к своему владельцу ЭтаФорма; обработчик объявлен на клиенте с нужными двумя параметрами.

  3. Ключ защищает от устаревшего собственного ответа, но не является системой аутентификации или прав доступа. Здесь нет внешнего API.

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

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

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

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

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