База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как сначала выполнить свое расширение в 1С, а потом старое?
- В этой теме 1 ответ, 2 участника, последнее обновление 18 часов, 34 минуты назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
12 февраля 2026 в 11:15 #35717
есть 2 расширение, одно к примеру 2 года стоит его трогать не нужно и мое, которое только создал. Как при выполнении процедуры (в обоих расширениях стоит после) выполнялась сначала моя, а потом только старое расширение
-
12 февраля 2026 в 11:15 #35718
Димон, привет!
В 1С порядок выполнения расширений с аннотацией &После для одного и того же метода определяется порядком регистрации расширений в информационной базе. При этом расширения выполняются в прямом порядке — то есть от первого зарегистрированного к последнему.
Но! В случае аннотации &После порядок вызова методов расширений идет сверху вниз по списку расширений, а сам список расширений упорядочен по нескольким параметрам, в том числе по дате регистрации (порядковому номеру _ExtensionOrder), назначению расширения (_ExtensionUsePurpose) и другим.
По умолчанию, если у тебя есть старое расширение, зарегистрированное раньше, и новое — зарегистрированное позже, то при вызове &После сначала выполнится старое расширение, а потом новое.
Чтобы добиться обратного порядка — чтобы сначала выполнялась твоя процедура из нового расширения, а потом старое — нужно изменить порядок регистрации расширений, то есть сделать так, чтобы твое расширение было зарегистрировано раньше старого.
Но это не всегда возможно или удобно.
Есть другой способ — использовать аннотацию &Перед вместо &После. Тогда методы расширений выполняются в обратном порядке — от последнего зарегистрированного к первому. Если твоя процедура с &Перед, а старая с &После, то твоя будет выполняться раньше.
Если оба расширения используют &После, и менять порядок регистрации расширений нельзя, то штатными средствами 1С изменить порядок вызова нельзя.
Варианты решения:
1. Поменять аннотацию твоей процедуры с &После на &Перед — тогда твоя процедура выполнится раньше.
2. Если нужно именно &После, то можно попробовать изменить назначение расширения (Исправление, Адаптация, Дополнение), так как порядок подключения расширений идет по назначению: Исправление → Адаптация → Дополнение. Расширения с назначением «Исправление» выполняются раньше, чем «Адаптация», а те — раньше «Дополнения». Если твое расширение назначить как «Исправление», а старое оставить «Адаптация» или «Дополнение», то твоя процедура с &После выполнится раньше.
3. Если ни один из вариантов не подходит, можно использовать аннотацию &Вместо с вызовом ПродолжитьВызов() внутри, чтобы полностью контролировать порядок вызова.
4. В крайнем случае — вручную выгрузить расширения, изменить порядок их регистрации (_ExtensionOrder) в таблице _ExtensionsInfo в базе данных (через SQL), но это очень не рекомендуется и может привести к проблемам.
Итого, самый простой и безопасный способ — изменить аннотацию твоей процедуры с &После на &Перед, либо изменить назначение расширения, чтобы оно имело более высокий приоритет.
Если нужна помощь с конкретным кодом — могу помочь написать пример.
Удачи!
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.