Как сначала выполнить свое расширение в 1С, а потом старое?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как сначала выполнить свое расширение в 1С, а потом старое?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #35717
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        есть 2 расширение, одно к примеру 2 года стоит его трогать не нужно и мое, которое только создал. Как при выполнении процедуры (в обоих расширениях стоит после) выполнялась сначала моя, а потом только старое расширение

      • #35718
        bot_avaOdin — Одинэсник
        Участник

          Димон, привет!

          В 1С порядок выполнения расширений с аннотацией &После для одного и того же метода определяется порядком регистрации расширений в информационной базе. При этом расширения выполняются в прямом порядке — то есть от первого зарегистрированного к последнему.

          Но! В случае аннотации &После порядок вызова методов расширений идет сверху вниз по списку расширений, а сам список расширений упорядочен по нескольким параметрам, в том числе по дате регистрации (порядковому номеру _ExtensionOrder), назначению расширения (_ExtensionUsePurpose) и другим.

          По умолчанию, если у тебя есть старое расширение, зарегистрированное раньше, и новое — зарегистрированное позже, то при вызове &После сначала выполнится старое расширение, а потом новое.

          Чтобы добиться обратного порядка — чтобы сначала выполнялась твоя процедура из нового расширения, а потом старое — нужно изменить порядок регистрации расширений, то есть сделать так, чтобы твое расширение было зарегистрировано раньше старого.

          Но это не всегда возможно или удобно.

          Есть другой способ — использовать аннотацию &Перед вместо &После. Тогда методы расширений выполняются в обратном порядке — от последнего зарегистрированного к первому. Если твоя процедура с &Перед, а старая с &После, то твоя будет выполняться раньше.

          Если оба расширения используют &После, и менять порядок регистрации расширений нельзя, то штатными средствами 1С изменить порядок вызова нельзя.

          Варианты решения:

          1. Поменять аннотацию твоей процедуры с &После на &Перед — тогда твоя процедура выполнится раньше.

          2. Если нужно именно &После, то можно попробовать изменить назначение расширения (Исправление, Адаптация, Дополнение), так как порядок подключения расширений идет по назначению: Исправление → Адаптация → Дополнение. Расширения с назначением «Исправление» выполняются раньше, чем «Адаптация», а те — раньше «Дополнения». Если твое расширение назначить как «Исправление», а старое оставить «Адаптация» или «Дополнение», то твоя процедура с &После выполнится раньше.

          3. Если ни один из вариантов не подходит, можно использовать аннотацию &Вместо с вызовом ПродолжитьВызов() внутри, чтобы полностью контролировать порядок вызова.

          4. В крайнем случае — вручную выгрузить расширения, изменить порядок их регистрации (_ExtensionOrder) в таблице _ExtensionsInfo в базе данных (через SQL), но это очень не рекомендуется и может привести к проблемам.

          Итого, самый простой и безопасный способ — изменить аннотацию твоей процедуры с &После на &Перед, либо изменить назначение расширения, чтобы оно имело более высокий приоритет.

          Если нужна помощь с конкретным кодом — могу помочь написать пример.

          Удачи!

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С