Исполнение до расширяемого метода (аннотация Перед)

Если метод аннотирован таким образом, это означает, что вначале будет выполнен метод расширения, а затем – расширяемый метод.


Исполнение после расширяемого метода (аннотация После)

Если метод аннотирован таким образом, это означает, что вначале будет выполнен расширяемый метод, а затем – метод расширения.

Обрамление расширяемого метода (аннотации Перед и После)

Если в расширяющем модуле созданы расширяющие методы, которые отмечены аннотациями Перед и После, то это означает, что вначале будет вызван метод, который отмечен аннотацией Перед, затем расширяемый метод и зачем метод расширения, отмеченный аннотацией После.

Замена метода (аннотация Вместо)

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

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

Чтобы иметь возможность модифицировать результат работы расширяемого метода, предусмотрен метод глобального контекста ПродолжитьВызов(). В качестве параметров метода должны быть указаны фактические параметры, которые переданы в расширяющий метод.

В исходном тексте пример будет выглядеть следующим образом:

 

Взаимодействие нескольких расширений

При разработке расширений следует исходить из следующих предположений:

  1. Расширение должно разрабатываться как автономный продукт, не опирающийся на наличие или отсутствие других расширений.
  2. Одновременно может быть подключено более одного расширения, которое расширяет один и тот же объект расширяемой конфигурации.
  3. Порядок исполнения программных модулей в результирующей конфигурации определяется порядком регистрации расширений в информационной базе расширяемой системы. Первым используется расширение, которое зарегистрировано последним.
  4. Необработанное исключение, возникающее в любом из расширений (или расширяемой конфигурации) прерывает исполнение всей цепочки методов расширений и распространяется в расширяемой конфигурации.

При рассмотрении вопроса взаимодействия расширений и расширяемой конфигурации будет использоваться пример из двух расширений (Расширение1 и Расширение2), зарегистрированных в расширяемой системе в указанном порядке. При этом чем раньше зарегистрировано расширение, тем меньше расширений находится между этим расширением и расширяемой конфигурацией. Так, Расширение1 будет расширять непосредственно расширяемую конфигурацию, а Расширение2 будет расширять конфигурацию, которая является объединением Расширения1 и оригинальной расширяемой конфигурации. Таким образом, в самом низу это слоистой конструкции расположена расширяемая конфигурация, откуда всегда начинается исполнение встроенного языка.

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

Пример 1

Если оба расширения одинаково обрамляют (аннотации Перед и После) расширяемый метод, то исполнение схема исполнения встроенного языка будет выглядеть следующим образом:

При попытке вызвать метод Расширяемая() (в основной конфигурации), встроенный язык будет исполняться в следующем порядке:

  1. Будет вызван метод, отмеченный аннотацией Перед(“Расширяемая”) из Расширения2.
  2. Затем будет вызван метод, отмеченный аннотацией Перед(“Расширяемая”) из Расширения1.
  3. Затем будет вызван метод Расширяемая() из расширяемой конфигурации.
  4. Затем, в обратном порядке (относительно списка расширений, т. е. Расширение1 и Расширение2), будут вызваны методы, отмеченные аннотациями После(“Расширяемая”).

Т.е. вначале вызываются те методы расширений, которые разработчик отметил как вызываемые до исполнения расширяемого метода, затем исполняется собственно расширяемый метод, а затем вызываются те методы, которые разработчик отметил как вызываемые после исполнения расширяемого метода.

Пример 2

Если в каждом расширении расширяемый метод перехватывается полностью, то схема выполнения будет выглядеть следующим образом:

Так произошло потом, что метод, отмеченный аннотацией Вместо, полностью заменяет собой расширяемый метод. Следует особо отметить, что если в этом примере поменять порядок регистрации расширений (первым будет Расширение2, а последним – Расширение1), то единственным выполнившимся методом будет метод из Расширения1.

В связи с таким поведением «замещающего» метода расширения, рекомендуется не допускать ситуаций, когда какой-то метод расширяемой конфигурации расширяется с замещением (аннотация Вместо) более чем в одном одновременно работающим расширении. Другими словами, если в расширении, в модуле документа Документ1 замещается обработчик события ОбработкаПроведения, то рекомендуется не допускать ситуации, когда в информационной базе работает еще хотя-бы одно расширение, которое каким-либо образом перехватывает обработчик события ОбработкаПроведения в документе Документ1. Однако, если в «замещающем» методе расширения есть безусловный вызов метода ПродолжитьВызов(), то одновременное существование нескольких расширений с таким способм расширения вполне допустимо.

Профили безопасности и расширение

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

Если прикладное решение работает в файловом варианте или в клиент-серверном варианте без профилей безопасности, то при подключении расширения:

  • В обычном режиме исполнения встроенного языка – допустимо расширять как клиентские, так и серверные методы. Без ограничения места расположения методов.
  • В безопасном режиме исполнения встроенного языка – будут расширяться только клиентские методы и серверные обработчики форм, которые установлены через панель свойств. К остальным серверным методам (аннотированные серверные методы модулей формы и серверные общие модули) расширение применяться не будет.

Возможность расширения серверных общих модулей в клиент-серверном варианте регулируется профилем безопасности.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

4 + = 6

Подписаться на блог по эл. почте

Укажите свой адрес электронной почты, чтобы получать уведомления о новых записях в этом блоге.

Присоединиться к еще 5 подписчикам

Рейтинг@Mail.ru