База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Почему вызывается расширение после возврата в основной процедуре?
- В этой теме 1 ответ, 2 участника, последнее обновление 11 месяцев, 3 недели назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
19 декабря 2024 в 17:45 #31002
столкнулся со следующей проблемой: в типовой конфигурации УТ есть типовой справочник проекты, в модуле объекта этого справочника есть процедура перед записью
Процедура ПередЗаписью(Отказ)Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
КонецПроцедуры
также у меня в расширении конфигурации есть справочник Проекты, в модуле объекта которого есть расширение процедуры ПередЗаписью:
&После(«ПередЗаписью»)
Процедура Расш_ПередЗаписью(Отказ)Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;// тут какая то логика
КонецПроцедуры
почему я все равно попадаю в процедуру расширения если сделаю возврат в процедуре основной конфигурации?
как оптимальнее поступить в данном случае? -
19 декабря 2024 в 17:45 #31003
Ваша проблема связана с тем, как работает механизм расширений в 1С:Предприятие. Когда вы используете аннотацию `&После`, это означает, что ваша процедура `Расш_ПередЗаписью` будет вызываться после выполнения основной процедуры `ПередЗаписью`. Таким образом, даже если в основной процедуре вы делаете возврат, это не предотвращает выполнение кода в расширении.
### Почему это происходит:
1. **Контекст выполнения**: При вызове процедуры с аннотацией `&После`, код в расширении выполняется в том же контексте, что и основной код. Это значит, что возврат из основной процедуры не останавливает выполнение кода в расширении.
2. **Структура вызовов**: Вызов `&После` добавляет вашу процедуру в очередь на выполнение после основной, и она будет выполнена независимо от того, был ли выполнен возврат в основной процедуре.### Оптимальные решения:
1. **Проверка условия в расширении**: В вашей процедуре расширения вы можете добавить проверку, чтобы убедиться, что выполнение не продолжается, если основной код завершился возвратом. Например, вы можете использовать глобальную переменную или свойство объекта, чтобы отслеживать, был ли выполнен возврат:1C &После("ПередЗаписью") Процедура Расш_ПередЗаписью(Отказ) Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; Если Отказ Тогда Возврат; // Проверка на возврат из основной процедуры КонецЕсли; // тут ваша логика КонецПроцедуры2. **Использование аннотации `&Вместо`**: Если ваша логика в расширении должна полностью заменить логику основной процедуры, вы можете использовать аннотацию `&Вместо`. Это позволит вам полностью контролировать выполнение и избежать вызова основной процедуры:
1C &Вместо("ПередЗаписью") Процедура ПередЗаписью(Отказ) Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; // Ваша логика КонецПроцедуры3. **Изменение логики основной процедуры**: Если возможно, вы можете изменить логику основной процедуры, чтобы она учитывала необходимость возврата в зависимости от условий, которые вы хотите реализовать в расширении.
Выбор подхода зависит от ваших требований и того, насколько вы хотите контролировать выполнение логики в расширении.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.