Проверить продолжение и остановку настоящей цепочки обработчиков своего расширения формы

Учебные задачи

Собственная базовая форма и ровно одно собственное CFE. В продолжении реально исполняется базовый обработчик и затем добавленный обработчик; при Ложь база не должна исполняться.

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

Полный модуль заимствованной ОбщаяФорма.ЦепочкаФормы85 ВНУТРИ собственного расширения Цепочка85; клиентское событие ПриОткрытии.

Подготовка

  1. Создайте отдельную пустую CF УчебнаяЦепочкаФормы85 на 8.5.1.1343, управляемое приложение, без бизнес-объектов. Создайте ОбщаяФорма.ЦепочкаФормы85.

  2. Реквизиты формы: Прервать85 Булево, СчетчикБазы85 Число 9,0, Цепочка85 Строка 200, Состояние85 Строка 500. Выведите их только для просмотра; параметр формы Прервать85 Булево.

  3. В базовый модуль вставьте supporting CHAIN_BASE. Свяжите ПриСозданииНаСервере и ПриОткрытии с соответствующими процедурами: счетчик и строка — реальные свидетельства исполнения базы.

  4. Создайте собственное расширение конфигурации Цепочка85, назначение Адаптация, заимствуйте ОбщаяФорма.ЦепочкаФормы85 и необходимые реквизиты. Не используйте чужое расширение.

  5. В редакторе заимствованной формы установите ее собственное событие ПриОткрытии = ПриОткрытииРасширения85. В модуль заимствованной формы расширения вставьте основной код. Это именно обработчик события расширенной формы, не &Перед, &После или &Вместо перехват процедуры.

  6. Создайте базовую ОбщаяФорма.ПускЦепочки85 с двумя командами ПроверитьПродолжение85 и ПроверитьОстановку85. Вставьте supporting launcher; команды каждый раз открывают собственную целевую форму с новым UUID.

  7. В своей новой CF примените только собственное Цепочка85. В базе и активном сеансе должно быть ровно это одно расширение, отключенных — 0. Вручную перезапустите свой учебный сеанс; никакое расширение инструментами здесь не устанавливается.

&НаКлиенте
Процедура ПриОткрытииРасширения85(Отказ)
    Если Прервать85 Тогда
        Цепочка85 = "расширение: остановлено;";
        ЭтотОбъект.УстановитьВыполнениеОбработчиковСобытия(Ложь);
        Состояние85 = "После текущего расширения цепочка прекращена; счетчик базы должен остаться 0";
        Возврат;
    КонецЕсли;
    Цепочка85 = "расширение;";
    ЭтотОбъект.УстановитьВыполнениеПослеОбработчиковСобытия("ПослеБазового85");
    ЭтотОбъект.УстановитьВыполнениеОбработчиковСобытия(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПослеБазового85(Отказ)
    Цепочка85 = Цепочка85 + "после базы;";
    Если СчетчикБазы85 <> 1 Или Цепочка85 <> "расширение;база;после базы;" Тогда
        ВызватьИсключение "Реальная цепочка собственной формы не соответствует ожидаемому порядку";
    КонецЕсли;
    Состояние85 = "Расширение → базовый обработчик → собственный после-обработчик: проверено";
КонецПроцедуры
Полный модуль собственной базовой целевой формы

Основная CF УчебнаяЦепочкаФормы85, ОбщаяФорма.ЦепочкаФормы85; server создания и client ПриОткрытии.

Основная CF УчебнаяЦепочкаФормы85, ОбщаяФорма.ЦепочкаФормы85; server создания и client ПриОткрытии.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьСвойПустойСтенд();
    Прервать85 = Ложь;
    Если Параметры.Свойство("Прервать85", Прервать) Тогда
        Если ТипЗнч(Прервать) <> Тип("Булево") Тогда
            ВызватьИсключение "Собственный параметр Прервать85 должен быть Булево";
        КонецЕсли;
        Прервать85 = Прервать;
    КонецЕсли;
    СчетчикБазы85 = 0;
    Цепочка85 = "";
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    СчетчикБазы85 = СчетчикБазы85 + 1;
    Цепочка85 = Цепочка85 + "база;";
КонецПроцедуры

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

Основная CF, ОбщаяФорма.ПускЦепочки85; клиентские обработчики двух собственных команд.

Основная CF, ОбщаяФорма.ПускЦепочки85; клиентские обработчики двух собственных команд.

&НаКлиенте
Процедура ПроверитьПродолжение85(Команда)
    ОткрытьФорму("ОбщаяФорма.ЦепочкаФормы85", Новый Структура("Прервать85", Ложь), ЭтаФорма, Новый УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьОстановку85(Команда)
    ОткрытьФорму("ОбщаяФорма.ЦепочкаФормы85", Новый Структура("Прервать85", Истина), ЭтаФорма, Новый УникальныйИдентификатор);
КонецПроцедуры

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

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

  2. При Прервать85 = Ложь расширение начинает строку, добавляет ПослеБазового85 через УстановитьВыполнениеПослеОбработчиковСобытия и разрешает продолжение.

  3. ПослеБазового85 имеет тот же состав параметров, что ПриОткрытии: один Отказ. Не передаем необязательный дополнительный параметр, чтобы не выдумывать иной callback контракт.

  4. База увеличивает свой счетчик ровно один раз. После-обработчик проверяет точный порядок расширение;база;после базы; и счетчик 1.

  5. При Прервать85 = Истина УстановитьВыполнениеОбработчиковСобытия(Ложь) прекращает цепочку после текущего обработчика. Это не Отказ открытия формы: учебная форма остается открытой для проверки счетчика 0.

  6. Guard допускает только реальное собственное CFE Цепочка85, проверяет все три источника расширений. Нельзя просто убрать контроль расширений для выполнения в рабочей базе.

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

  1. Продолжение: счетчик 1, точная строка расширение;база;после базы;, итоговый статус проверено.

  2. Остановка: счетчик 0, строка расширение: остановлено;, после-обработчик не выполняется.

  3. Каждая кнопка создает новый UUID формы: повторные проверки не используют предыдущий счетчик.

  4. Неверный тип параметра Прервать85 отказывает на сервере до открытия.

  5. Отсутствующее или чужое расширение отказывает в guard; не считайте такой запуск проверкой порядка.

  6. Отдельно сопоставьте шаги отладки ПриОткрытииРасширения85 → базовый ПриОткрытии → ПослеБазового85; native методы сами не создают CFE.

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

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

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

  1. В обычной форме базовой конфигурации метод управления цепочкой применять нельзя по native примечанию.

  2. Код не является примером &Вместо: это другой механизм.

  3. Дополнительные расширения меняют цепочку, поэтому не допускаются.

  4. Прервать цепочку не означает отменить открытие формы.

  5. Не устанавливайте этот CFE в рабочую CF.

  6. Расширение и UI здесь не применялись; все проверки статические.

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

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

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

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

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